Javaメソッドの使用例分析

PHPz
リリース: 2023-04-19 16:52:06
転載
597 人が閲覧しました

1. メソッドの概念とその使い方

1.1. メソッドとは

メソッドとはコードの断片であり、C 言語の「関数」に似ています。機能は次のとおりです:

1. コードをモジュール形式で編成できます (コード サイズが比較的複雑な場合)。

2. コードの再利用が可能になります。 、1 つのコードを複数の位置で使用できます。

3. コードを理解しやすく、よりシンプルにします。

4. 車輪の再発明をせずに、開発のために既存のメソッドを直接呼び出します。

1.2. メソッドの定義

定義形式:

Javaメソッドの使用例分析

例: 複数の項の階乗の合計を求める関数を作成します

public class TeseDemo220424 { // 计算某一个数的阶乘 public static int func(int n){ int ret = 1; for(int i = 1;i <= n;i++){ ret *= i; } return ret; } // 计算前多少项阶乘之和 public static int func1(int k){ int sum = 0; for(int i = 1;i <= k;i++){ sum += func(i); } return sum; } public static void main(String[] args) { // 写函数来求阶乘之和 Scanner myscanner = new Scanner(System.in); System.out.println("请输入你想要求取前多少项的阶乘的和:"); int num = myscanner.nextInt(); int sum = func1(num); System.out.println("前 " + num + "项的阶乘和为" + sum); } }
ログイン後にコピー

Note:

1. 修飾子: この段階では、public static の固定組み合わせが直接使用されます (main メソッドが public static であるため、その中で呼び出せるのは static メソッドのみです)。

2. 戻り値の型: メソッドに戻り値がある場合、戻り値の型は返されるエンティティの型と一致する必要があり、戻り値がない場合は void として記述する必要があります。

3. メソッド名: 名前には小さなキャメルケースを使用します。

4. パラメータリスト: メソッドにパラメータがない場合は()内に何も記述しません、パラメータがある場合はパラメータの種類を指定する必要があります複数のパラメータはカンマで区切ります。

5. メソッド本体: メソッド内で実行されるステートメント。

6. Java では、メソッドはクラス内に記述する必要があります。

7. Java では、メソッドをネストすることはできません。

8. Java にはメソッド宣言がありません。 (宣言と定義は区別しません)

1.3. メソッド呼び出しの実行処理

呼び出し処理:

メソッドの呼び出し—>パラメータの受け渡し—>メソッドアドレスの検索—>呼び出されたメソッドを実行するメソッド本体—>呼び出されたメソッドが終了して戻ります—>メインの呼び出しメソッドに戻って実行を継続します

Image:

Javaメソッドの使用例分析

#注:

1. メソッドが定義されている場合、メソッドのコードは実行されません。メソッドが呼び出されたときにのみ実行されます。

2.メソッドは複数回呼び出すことができます。

1.4. 実パラメータと仮パラメータの関係 (重要)

仮パラメータと実パラメータの関係については、誰もがよく知っているはずです。仮パラメータは実パラメータの一部であり、一時的なコピーが作成されるため、仮パラメータを変更しても実パラメータには影響しません。

具体的な理由の説明: (関数スタック フレームに関連する特定の問題はより複雑であるため、ここで簡単に説明します)

Javaメソッドの使用例分析

つまり、図からわかるように、値で呼び出す場合、仮パラメータと実パラメータの値は同じ空間にまったく格納されないため、互いに干渉することはありません。実際のパラメータに影響を与えるために仮パラメータを変更する場合、それはアドレスによる呼び出しでなければなりませんが、Java にはアドレスによる呼び出しのようなものはありません。解決策は参照を使用することだけです (後で詳しく説明します)。 )。

2. メソッドのオーバーロード

2.1. メソッドのオーバーロードが必要な理由

public class TestDemo220426 { public static int addInt(int x,int y){ return x + y; } public static double addDouble(double x,double y){ return x + y; } public static void main(String[] args) { int a = 10; int b = 10; int ret = addInt(a,b); double c = 11.1; double d = 12.1; double ret1 = addDouble(c,d); } }
ログイン後にコピー

このコードを見ると、2 つのメソッド addint と adddouble は両方とも次の目的のために使用されています。 2 つの数値ですが、異なる関数名で 2 つの異なる関数を定義する必要がありますが、名前付けが頭の痛い場合もあります。メソッドの本質的な関数は同じであるため、パラメータが異なる場合があります。したがって、すべて同じ関数名を使用できますか? ?

答えは「はい」です。これはメソッドのオーバーロードと呼ばれます。

2.2. メソッドのオーバーロードの定義

Java では、複数のメソッドが同じ名前で異なるパラメーター リストを持つ場合、それらはオーバーロードされていると言われます。つまり、同じ名前ですが意味が異なります。

public class TestDemo220426 { public static int add(int x,int y){ return x + y; } public static double add(double x,double y){ return x + y; } public static void main(String[] args) { int a = 10; int b = 10; int ret = add(a,b); System.out.println(ret); double c = 11.1; double d = 12.1; double ret1 = add(c,d); System.out.println(ret1); } }
ログイン後にコピー

実行中のプログラムのスクリーンショット:

Javaメソッドの使用例分析

上記のプログラムから、これらはすべて加算関数を実装していることがわかりますが、2 つの異なる関数実装が定義されています。 、関数名が同じであるだけで、これは関数のオーバーロードです。コンパイラは、渡されたパラメータに基づいて対応する関数を呼び出します。

注:

1. メソッド名は同じである必要があります。

2. パラメータリストが異なること(パラメータの数が異なる、パラメータの型が異なる、型の順序が異なる) (パラメータで区別する必要がある)

3. 戻り値の型と同じですか? 同じは関係ありません

4. 戻り値のみで区別される 2 つの関数を定義することはできません。これはオーバーロードを構成することはできません

5. コンパイラがコードをコンパイルすると、実際のパラメータの型を推定します。推定の結果に基づいて呼び出すメソッドを決定します。

2.3. メソッドの署名

メソッドの署名は次のとおりです。コンパイラによってコンパイルおよび変更された後のメソッドの最終的な名前。特定のメソッドは、メソッドの完全なパス名、パラメータ リスト、および戻り値の型であり、これらがメソッドの完全な名前を構成します。オーバーロードされた関数を区別するために使用されます

メソッド シグネチャを表示するにはどうすればよいですか:

1. まずプロジェクトをコンパイルして .class バイトコード ファイルを生成します

2. コンソールで、表示したい .class が存在するディレクトリを入力してください

3. 次のように入力します: javap -v バイトコード ファイル名

3. 再帰

3.1. 再帰の概念

定義: 実行中に自分自身を呼び出すメソッドを「再帰」といいます。

再帰の必要条件:

1. 再帰式。

2 . 再帰的な終了条件.

3.2、递归过程分析

public static int func(int num){ if(num == 1){ return 1; } return num*func(num - 1); } public static void main(String[] args) { // 递归求阶乘 Scanner scan = new Scanner(System.in); System.out.println("请输入一个数:"); int num = scan.nextInt(); int ret = func(num); System.out.println("阶乘为:" + ret); } }
ログイン後にコピー

在这里我们以求一个数的阶乘的代码为例来分析一个递归的过程:

Javaメソッドの使用例分析

递归的过程其实不复杂,看成两个部分,一个是递出去,而是归回来,上面的蓝色箭头是递的过程,红色箭头是归的过程。

3.3、递归小练习

  • 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public class TestDemo220427 { public static void myprint(int num){ if(num < 10){ System.out.println(num%10); return; } myprint(num/10); System.out.println(num%10); return; } public static void main(String[] args) { // 递归实现按顺序打印数字的每一位 Scanner scan = new Scanner(System.in); System.out.println("请输入一个数:"); int num = scan.nextInt(); myprint(num); } }
ログイン後にコピー
  • 求斐波那契数列的第 N 项

public class TestDemo220428 { public static int fib1(int n){ int f1 = 1; int f2 = 1; int f3 = 1; for(int i = 3;i <= n;i++){ f3 = f1 + f2; f1 = f2; f2 = f3; } return f3; } public static int fib(int n){ if(n == 1 || n == 2){ return 1; } return fib(n-1) + fib(n-2); } public static void main(String[] args) { // 递归求斐波那契数列的第n项 Scanner scan = new Scanner(System.in); System.out.println("请输入您想要求取的项数:"); int n = scan.nextInt(); int ret = fib1(n); System.out.println("第" + n + "项为:" + ret); } }
ログイン後にコピー

利用递归求斐波那契数列的第n项的话,其实是一个双路递归,不推荐这种求解的方法,因为会算很多重复的项,效率很低,一般都是选择循环迭代的方式来生成斐波那契数即可。

Javaメソッドの使用例分析

以上がJavaメソッドの使用例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!