Javaプログラミング・ロジック(11) - 知人の機能

機能

我々は、データ、基本的な操作とプロセス制御の基本的なタイプを導入し、前のセクションでは、これらの手順の使用は多くを書く必要があります。

あなたは、常に一定の操作を行う必要がある場合でも、書き込みに何度も繰り返されるために、コードのニーズに似ている、例えば、配列の番号を見つけるために、最初の時間は、番号を検索するには、別のものを見つけるかもしれない秒数、各チェック番号、類似したコードは、再び書き換えられることは非常に長ったらしい必要があります。また、複雑な演算の数があり、一緒に理解し、維持することが困難コードを入れた場合、ステップ数に分割することができます。

コンピュータプログラムは、我々は基本的な機能や詳細のいくつかを含め、Javaの機能についての話このセクションでは、コードの重複を削減し、複雑な操作を打破するために、機能のつまりを使用し、この問題を解決するために、関数の概念を使用しています。

定義関数

機能の概念は、我々は数学を学ぶ基本的なフォーマットは、YはF(X)を=で接触させ、yにxは変換関数F、出力yの後に、所定の入力xとの対応関係を表しています。その機能は、プログラムの概念に類似している、そこに入力、操作、および出力用組成物であり、それはサブプログラムを表し、サブプログラム、オブジェクト(アナログF)を表す名前を有し、ゼロ以上のパラメータ(アナログx)は、結果(アナログy)を戻すことができます。2つの簡単な例で見てみましょう:

コードをコピー
パブリックstatic int型の和(int型B、INT){ 
    int型の合計= A + B。
    合計を返します。
} 

パブリック静的ボイドprint3Lines(){ 
    ため(INT I = 0; I <3; I ++){ 
        のSystem.out.println(); 
    } 
}
コードをコピー

第1の機能名が合計である、それは2つの数の加算入力の対象となる2つの入力パラメータ、INTは整数とBであり、その動作は、2つの数の和、放電の加算結果であります変数sumにして、return文は、結果を返すのpublic static修飾子関数の先頭で使用(和の合計と関数名は関係ありません)、我々はフォローアップをご紹介します。

第2の機能名が、その目的は、出力画面上の3つの空白行で、print3Linesでそれが入力パラメータを有していない、出力動作は、戻り値を持たない三本のブランクラインループを使用することです。

上記のコード、すなわち、プレゼンテーションの基本的な文法構造の主な機能は比較的単純です。

関数の戻り値名の改質タイプ(パラメータタイプパラメータ名、...){ 
    操作... 
    戻り値を返します; 
}

機能の主要部分は、次のとおりです。

  • 関数名:nameは、機能的な機能に不可欠です。
  • パラメータ:0複数のパラメータがあり、各パラメータは、パラメータのデータ型と組成のパラメータ名を持っています。
  • 操作:特定の機能コードの操作。
  • 戻り値:任意、機能コードを返すの値は、ステートメントのニーズのこの型の値をreturn文を使用し、同じ値の型を返す必要があります書かれていない戻り値の型がvoid場合、この関数は、値を返すことはできません。
  • 修飾子:パブリック静的であり、これらの修飾子の目的を議論していないJavaは、関数修飾子をたくさん持って、それぞれ異なる目的のために、このセクションでは、私たちは修飾子を前提としています。

これらは、定義された関数は、明確な機能を持っているサブルーチン期間に定義された構文定義関数ですが、自身が任意のコードを実行していない関数の定義は、関数が必要に呼ばれるように、実行されます。

関数呼出し

Javaでは、任意の関数がクラスに配置する必要があり、我々は、クラスは、クラスの関数が、クラスは複数の機能が含まれているコンテナの関数として見ることができ、我々は覆われていないことクラスは、Javaは、一般に関数が呼び出されていますこの方法では、我々は特に関数やメソッドは、互換的に使用することができる区別はありません。次のような形態の主要機能と呼ばれるクラスを定義することができる複数の機能を定義することができるクラス

パブリック静的無効メイン(文字列[] args){ 
      ... 
}

この機能は、特別な意味を持って入学手続きを表し、String []型引数がパラメータにコンソールから受信表し、我々はそれを無視することができます。あなたはクラスの主な機能の定義を指定する必要がある場合、プログラムを実行するJava、Javaは主な機能を探し、main関数から開始します。

単にプログラミングを学び始めた人が誤ってコードの最初の行から開始したプログラムを考えることが、それは間違っている、main関数が定義されていない問題で、Java関数は、最初にそれを見つけようとしますし、それが最初の行から開始しました。

次のように変数を定義することができる主な機能に加えて、動作データはまた、他の関数を呼び出すことができます。

コードをコピー
パブリック静的無効メイン(文字列[] args){ 
    int型、A = 2。
    INT B = 3。
    INT和= SUM(A、B)。

    System.out.println(合計)。
    print3Lines(); 
    System.out.println(SUM(3,4))。
}
コードをコピー

まず、主な機能は、二つの変数aとbを定義し、関数の和を呼び出し、そしてBは、和関数に和の結果を通過した後、変数sumに割り当てられます。処理されたパラメータと戻り値を渡すルーチンを呼び出します。

まず第一に、パラメータと戻り値は、特別な意味の名前ではありませんことに留意されたいです。パラメータaとbの名前の、発信者の名前は、メインaとbのパラメータ、および関数の定義は、合計がちょうどそれのように、彼らは同じにすることはできません、起こった、と名の間に関係がない、sum関数は、メイン関数名に使用することはできませんおよびその逆。和変数と変数の和の合計の主な機能は、発信者の名前が完全に異なる、それが起こったものと同じです。また、変数と関数は、同じ名前を取ることができますが、また、それに起こる、それは同じ名前が特別な意味を持っているという意味ではありません。

あなたは、関数のパラメータはprint3Linesとして、)渡されたが、また、(括弧ことを呼び出さないと()。

パラメータは、それは、関数の結果を返すことができ、演算式であることができ、必ずしも変数を一定にすることができるされていない渡さ。例えば:のSystem.out.println(SUM(3,4));最初の関数呼び出し和(3,4)、伝送パラメータが一定3及び4は、第2の機能コールのパラメータがするSystem.out.printlnを通過しましたこれは、SUM(3,4)は結果を返しています。

パラメータ渡し、簡潔にまとめたもので、ステートメントのパラメータは、関数を定義し、実際には、変数の定義であるが、これらの変数の値が、実際には、変数代入の機能に関数を呼び出すときにパラメータを渡し、不明です。

同じ関数がクラスの他の関数を呼び出すことができます、またはあなたが他のクラス内の関数を呼び出すことができ、我々は前のセクション、toBinaryStringの整数のバイナリ表現の出力機能を使用しました。

int型、A = 23; 
System.out.println(Integer.toBinaryString(a)参照)。

toBinaryString Integerクラスは、クラス名と直接呼び出しで始まるパブリック静的関数への改質剤です。

基本機能の概要

こうしてコードの重複を減らす必要なコールは、その後、関数を定義する繰り返し実行コードのニーズに。コードが読みやすくなるように複雑な操作のために、動作は、複数の機能に分けることができます。

我々は先に紹介し、プログラムの実行は基本的にのみオーダー実行、条件付き実行サイクルの実行が、プロセスのより完全な説明である関数を呼び出す含める必要があります。プログラムの主な機能は、実行を開始会ったとき、内側の関数にジャンプします、関数が他の関数を呼び出し、関数呼び出しmain関数に戻るには、関数が戻るが、呼び出し文をバックアップしていきます、他の関数を入力し、メインます機能を実行するためのプログラム文は終わりません後。次のセクションでは、我々は、プロセスの実装の詳細についてより詳細な情報となります。

Javaでは、プログラムコード内の関数の実際の実行の位置及び順序は関係しません。

定義と基本的な通話機能は、比較的容易に理解するのにする必要がありますが、そこに多くの詳細は、パラメータ渡し、戻り値、関数名、呼び出しプロセスを含め、初心者に混乱をもたらすことができる、と私たちはそれぞれのケースを議論しています。

パラメータの受け渡し

配列パラメータ

ベース型のパラメータと配列が同じではない、基本的なタイプは、呼び出し元の変数、配列に影響を及ぼさないが、関数内の呼び出し元の配列の内容を修正する配列の要素を変更しないであろう。私たちは例を見て:

コードをコピー
パブリック静的ボイドリセット(INT [] ARR)が{ 
    ため(INT iが= 0; iが<arr.length; I ++){ 
        ARR [i]はiが=。
    } 
} 

パブリック静的無効メイン(文字列[] args){ 
    INT [] ARR = {10,20,30,40}。
    リセット(ARR)。
    以下のために(INT iが= 0; I <arr.length; I ++){ 
        System.out.printlnは(ARR [I])。
    } 
}
コードをコピー

リセット機能のパラメータに割り当てられた配列要素は、また、メインARR配列の値の関数となります。

これは、我々は第二四半期に導入されている、理解しやすい、実際に配列変数は、コンテンツ自体の配列を格納するための2つのスペースを持っている、配列変数の割り当てに、コンテンツを格納するための他の場所は、元の配列には影響を与えません。コンテンツ自体が、唯一のコンテンツ空間の異なる配列を指すように配列変数を行います。

上記の例では、ARRおよび主機能ARR配列変数関数パラメータ配列変数が同じメモリ位置で、アレイ自体の内容は、データの唯一の部分であるので、主に変更すると、リセットの配列要素の内容変更はまったく同じです。

可変長パラメータ

関数、パラメータの数は、上記固定され、時には、そのような数を求めるの最大数のようなパラメータのない固定数おそらくはより二つであってもよく、Javaサポートが望ましいかもしれません次の例の可変長パラメータ:

コードをコピー
パブリックstatic int型の最大値(INT分、INT ... A){ 
    int型の最大値=分; 
    以下のために(INT iが= 0; I <a.length; I ++){ 
        IF(最大<[I]){ 
            最大= [I]。
        } 
    } 
    マックス返します。
} 

パブリック静的無効メイン(文字列[] args){ 
    System.out.printlnは(MAX(0))。
    System.out.println(MAX(0,2)); 
    System.out.println(MAX(0,2,4)); 
    System.out.println(最大(0,2,4,5)); 
}
コードをコピー

最大関数は、最小値、および最大値を返す可変長複数のパラメータを取ります。構文可変長パラメータのデータ型は、3つの点の後に追加され、関数に、可変長引数は、アレイとみなすことができるされ...、可変長パラメータリスト内のパラメータの最後のものである必要があり、また関数であります唯一の可変長パラメータ。

可変長パラメータが実際配列パラメータ、すなわち、関数宣言最大に変換される(INT分、INT ...)実際MAX(int型分、INT [] a)に示すように、メインmaxの関数呼び出しに変換されコールが実際に最大に変換され、(0,2,4,5)、(0、新しいINT [] {2,4,5})、パラメータは主に簡略に記述された可変長符号を使用しています。

リターン

意味の復帰

まず第一に、我々は、低リターンの意味を強調します。関数の戻り値とボイドのないリターンが存在しないケースの種類、機能は最後まで戻り、自動的に実行されます。呼び出し元に、機能実行リターンの終了を返します。

ループのための呼び出し元に関数実行リターンの早期終了のために使用することができるで復帰は、関数の最後には、真ん中にすることができて、関数内のどこでも使用することができ、if文にすることができます。

、呼び出し元に戻ることを意味し、値を持っていませんが、ノーリターン値のみ;関数も返すつまり、リターンを使用することができますvoid型の値を返します。

値の数を返します。

関数の戻り値は、1の最大値を持つことができる状況が複数の戻り値を必要とする場合にその?例えば、整数のアレイ、結果を返すための3つの必要三の最大数を計算します。この配列は、機能的に三つの要素のアレイを作成するために、戻り値として使用することができ、その結果、対応する配列の最初の3つの要素に割り当てられます。

戻り値の実際のニーズは、複合結果である場合には?例えば、文字、すべての文字の配列と繰り返し繰り返しの数を見つけること。戻り値はオブジェクトとして使用することができ、我々は、後続のセクションでクラスとオブジェクトを紹介します。

私は、戻り値が一つだけの最大値を持つことができますが、それを言いたいが、実際には十分です。

関数名

各関数は名前を持っている、名前はこのセンス機能名は、それを繰り返すことができ表し?別のクラスでは、答えは状況に応じて、同じクラスで、イエスです。

同じクラス、戻り型があまりない、同じことが、同じパラメータ数、各パラメータのタイプと同じ位置ではなく、パラメータの名前を参照して、同じ名前に機能するが、パラメータが同じではないかもしれ。換言すれば、あるラベルの唯一の機能:クラス関数名の名前_ _ _パラメータパラメータタイプ1タイプ2タイプ_...パラメータN。

同じクラスではなく現象の異なるパラメータを持つ同じ関数名は、一般関数のオーバーロードと呼びます。なぜ我々はそれをオーバーロード機能が必要なのですか?一般的な意味機能は、表現したいと思いますので、同じタイプまたはパラメータの数と同じですが、ありません。例えば、数学の4つの機能は、以下のように定義されるJavaライブラリで、2つの数の最大値を選択します。

呼び出し元のプロセス

マッチング処理

関数呼び出しの前に導入されたとき、私たちは、パラメータの型を指定していません。ここで説明し、パラメータが実際にパラメータの割り当てに渡され、呼び出し側のデータ転送ニーズやパラメータ型関数宣言が一致しているが、正確に同じことを必要としません。それは何を意味するのでしょうか?Javaコンパイラは自動的に、タイプの変換機能とベストマッチを見つけるでしょう。例えば:

char型= ''; 
チャーB = 'B'; 
System.out.println(Math.max(b)参照)。

パラメータが文字型であるが、数学と文字型の最大の機能のために定義していない、我々は先に説明し、実際にchar型の整数である、Javaは自動的にその後、Math.max(int型A、INT B)を呼び出し、intに文字を変換します結果出力画面98の整数。

数学関数はint型、それの最大定義されていない場合は?呼び出しが成功するでしょう、それはなかった、長い場合、長い最大関数型を呼ぶだろうか?何のフロート、通話のdouble型が存在しない場合は、float型のMAX関数を呼び出します。Javaコンパイラは、自動的に最適な一致を見つけるでしょう。
一つだけの機能(すなわちオーバーロードされていない)の場合には、限り、あなたは変換を入力することができますよう、それは関数のオーバーロードの存在下では、関数がベストマッチと呼ばれる、関数を呼び出します。

再帰

ほとんどの場合、呼び出された関数は他の関数ですが、実際には関数が再帰関数と呼ばれる独自の関数を呼び出して、独自のを呼び出すことができます。

なぜ私は自分の自分自身を呼び出す必要がありますか?!私たちは、一例では、次のように定義されているnの値として表現さNの階乗数の数学、、、数の階乗を見て:

0!= 1個の
N!=(N-1)!×n個

0階乗は、次に、再帰的定義は、nの値のために、定義されているnの値がn倍されたn-1階乗値の階乗であり、1であり、n-1なければならない最初の要求値まで0隠れ家を引き返します。次のように再帰的計算式を容易に、再帰関数で達成します。

コードをコピー
パブリック静的長い階乗(int型N){ 
    IF(N == 0){ 
        リターン1。
    }他{ 
        戻りN *階乗(N-1)。
    } 
}
コードをコピー

ルックは比較的理解しやすい、と同様の数学的な定義でなければなりません。

再帰関数は、多くの場合、フォームでは比較的簡単ですが、実際には、例えば、この呼び出しが再帰的なオーバーヘッドで、不適切な使用、予期しない結果が発生する可能性があります。

System.out.println(階乗(10000));

システムは、任意の結果を与えるものではありませんし、例外がスローされます、我々はそれに続くセクションで例外を持っているが、ここでのシステムエラー、異常型として理解:java.lang.StackOverflowErrorを、それは何を意味するのでしょうか?この間違ったを理解するために、スタックオーバーフローエラーという。この手段は、我々は、実装原則関数呼び出し(下段)を理解する必要があります。

それが再帰的に動作しない場合はどのようにそれを行うには?、しばしば再帰形非再帰関数に変換することができる(後の章で説明)いくつかのデータ構造によって実現され、環状。例えば、階乗例えば、非再帰的な形は次のように定義されます。

N!= 1×2×3×...×n個

次のようにこのサイクルは、達成することができます。

コードをコピー
パブリック静的長い階乗(int型N){ 
    長い結果= 1。
    以下のために(INT I 1 =; I <= N; I ++){ 
        結果* = I。
    } 
    結果を返します。
}
コードをコピー

概要

コードの重複を削減する機能により、分解作業が思考の複雑なコンピュータプログラムの重要な方法である、コンピュータプログラムの構造の重要な機能です。このセクションでは、我々はいくつかの詳細、再帰的な側面を、関数のと同様に、パラメータの引き渡しに関する基本的な概念を紹介、戻り値、過負荷状態に。

しかし、Javaで、修飾子の多くは、このようなパブリック、プライベート、静的、最終的に、同期として、機能があり、抽象的というように、この記事では、パブリック静的、その後の記事では、我々はこれらの修飾子をご紹介しますされた関数修飾子を前提としています。また、例外を宣言することができる機能は、我々は、その後の資料に記載さに委ねています。

再帰関数を導入し、私たちは次のセクションので、我々は、関数呼び出しの実装メカニズムを理解する必要があり、システム・エラーが、java.lang.StackOverflowErrorをは、この間違ったを理解してご覧ください。

おすすめ

転載: www.cnblogs.com/ivy-xu/p/12383280.html