前の章では System.out.println() をよく使用しましたが、これは何でしょうか?
println()はメソッド(Method)、Systemはシステムクラス(Class)、outは標準出力オブジェクト(Object)です。この文の使用法は、システム クラス System 内の標準出力オブジェクト内のメソッド println() を呼び出すことです。
Java メソッドは、一緒に機能を実行するステートメントのコレクションです。
メソッドとは、ある種の問題を解決するための手順の順序付けされた組み合わせです。
クラスまたはオブジェクトに含まれるメソッド
メソッドはプログラム内で作成され、他の場所で参照されます。
通常、メソッドの定義には次の構文が含まれます。
修飾子戻り値型メソッド名(パラメータ型パラメータ名) {
...
メソッド本体...
戻り値を返します。
}
メソッドにはメソッド ヘッダーとメソッド本体が含まれます。メソッドのすべての部分は次のとおりです。
修飾子:修飾子はオプションであり、メソッドの呼び出し方法をコンパイラに指示します。このメソッドのアクセス タイプを定義します。
戻り値のタイプ:メソッドは値を返す場合があります。 returnValueType はメソッドの戻り値のデータ型です。一部のメソッドは必要な操作を実行しますが、値を返しません。この場合、 returnValueType はキーワードvoidです。
メソッド名:メソッドの実際の名前です。メソッド名とパラメータ リストが一緒になってメソッド シグネチャを形成します。
パラメーターの種類:パラメーターはプレースホルダーのようなものです。メソッドが呼び出されると、値がパラメータに渡されます。この値は実パラメータまたは実変数と呼ばれます。パラメータ リストは、メソッドのパラメータのタイプ、順序、および数を指します。パラメータはオプションであり、メソッドにパラメータを含めることはできません。
メソッド本体:メソッド本体には、メソッドの機能を定義する特定のステートメントが含まれます。
のように:
publicstaticintage(intbirthday){...}
複数のパラメータを指定できます。
staticfloatinterest(floatprincipal,intyear){...}
注:他の言語では、メソッドはプロシージャと関数を指します。 void 以外の戻り値を返すメソッドは関数と呼ばれ、void 戻り値を返すメソッドはプロシージャと呼ばれます。
以下のメソッドには 2 つのパラメータ num1 と num2 が含まれており、これら 2 つのパラメータの最大値を返します。
/**2 つの整変数データのうち大きい方の値を返します*/
publicstaticintmax(intnum1,intnum2){
侮辱;
if(num1>num2){
結果=数値1;
}それ以外{
結果=数値2;
}
結果を返します。
}
Java では、メソッドが値を返すかどうかに応じて、メソッドを呼び出す 2 つの方法がサポートされています。
プログラムがメソッドを呼び出すと、プログラムの制御は呼び出されたメソッドに移されます。呼び出されたメソッドの return ステートメントが実行されるか、メソッド本体の閉じ括弧に到達すると、制御がプログラムに返されます。
メソッドが値を返す場合、メソッド呼び出しは通常、値として扱われます。例えば:
intlarger=max(30,40);
メソッドの戻り値が void の場合、メソッド呼び出しはステートメントである必要があります。たとえば、メソッド println は void を返します。次の呼び出しはステートメントです。
System.out.println("Java へようこそ!");
次の例は、メソッドを定義する方法とそれを呼び出す方法を示しています。
publicclassTestMax{
/**メインメソッド*/
publicstaticvoidmain(String[]args){
インティ=5;
intj=2;
intk=max(i,j);
System.out.println("間の最大値"+i+
"そして"+j+"は"+k);
}
/**2 つの整変数のうち大きい方の値を返します*/
publicstaticintmax(intnum1,intnum2){
侮辱;
if(num1>num2){
結果=数値1;
}それ以外{
結果=数値2;
}
結果を返します。
}
}
上記の例のコンパイルと実行結果は次のとおりです。
5と2の間の最大値は5です
このプログラムには main メソッドと max メソッドが含まれています。 Main メソッドは JVM によって呼び出されます。それ以外は、main メソッドは他のメソッドと変わりません。
例に示すように、main メソッドのヘッドは変更されず、修飾子 public と static が付いており、void 型の値を返し、メソッド名は main で、String[] 型のパラメーターを受け取ります。 String[] は、パラメータが文字列配列であることを示します。
このセクションでは、void メソッドを宣言して呼び出す方法について説明します。
次の例では、printGrade という名前のメソッドを宣言し、それを呼び出して指定された成績を出力します。
publicclassTestVoidMethod{
publicstaticvoidmain(String[]args){
printGrade(78.5);
}
publicstaticvoidprintGrade(doublescore){
if(スコア>=90.0){
System.out.println('A');
}
elseif(スコア>=80.0){
System.out.println('B');
}
elseif(スコア>=70.0){
System.out.println('C');
}
elseif(スコア>=60.0){
System.out.println('D');
}
それ以外{
System.out.println('F');
}
}
}
上記の例のコンパイルと実行結果は次のとおりです。
C
ここでのprintGradeメソッドはvoid型のメソッドであり、値を返しません。
void メソッドの呼び出しはステートメントである必要があります。 したがって、main メソッドの 3 行目のステートメントとして呼び出されます。セミコロンで終わるステートメントと同様です。
メソッドを呼び出すときはパラメータを指定する必要があり、パラメータ リストで指定された順序でパラメータを指定する必要があります。
たとえば、次のメソッドはメッセージを n 回連続して出力します。
publicstaticvoidnPrintln(Stringmessage,intn){
for(inti=0;i<n;i++)
System.out.println(メッセージ);
}
次の例は、値渡しの効果を示しています。
このプログラムは 2 つの変数を交換するメソッドを作成します。
publicclassTestPassByValue{
publicstaticvoidmain(String[]args){
intnum1=1;
intnum2=2;
System.out.println("Beforeswapmethod,num1is"+
num1+"andnum2is"+num2);
//スワップメソッドを呼び出す swap(num1,num2);
System.out.println("Afterswapmethod,num1is"+
num1+"andnum2is"+num2);
}
/**2つの変数を交換する方法*/
publicstaticvoidswap(intn1,intn2){
System.out.println("tスワップメソッドの内部");
System.out.println("ttBeforeswappingn1is"+n1
+"n2is"+n2);
//n1とn2の値を交換 inttemp=n1;
n1=n2;
n2=温度;
System.out.println("tt交換後n1is"+n1
+"n2is"+n2);
}
}
上記の例のコンパイルと実行結果は次のとおりです。
swap メソッドの前、num1is1 と num2is2
スワップメソッドの内部
交換前n1is1n2is2
交換後n1is2n2is1
Afterswapメソッド、num1is1とnum2is2
2 つのパラメーターを渡して swap メソッドを呼び出します。興味深いことに、メソッドが呼び出された後、実際のパラメータの値は変化しません。
上記で使用されている max メソッドは、int 型のデータにのみ適用されます。しかし、2 つの浮動小数点型データの最大値を取得したい場合はどうすればよいでしょうか?
解決策は、次のコードに示すように、同じ名前でパラメーターが異なる別のメソッドを作成することです。
publicstaticdoublemax(doublenum1,doublenum2){
if(num1>num2){
戻り番号1;
}それ以外{
戻り番号2;
}
}
max メソッドを呼び出すときに int パラメータを渡すと、int パラメータの max メソッドが呼び出されます。
double パラメーターが渡された場合、double 型の max メソッド本体が呼び出されます。これはメソッドのオーバーロードと呼ばれます。
つまり、クラスの 2 つのメソッドの名前は同じですが、パラメーター リストが異なります。
Java コンパイラは、メソッド シグネチャに基づいて、どのメソッドを呼び出す必要があるかを決定します。
メソッドをオーバーロードすると、プログラムがより明確になり、読みやすくなります。密接に関連したタスクを実行するメソッドは同じ名前を使用する必要があります。
オーバーロードされたメソッドには、異なるパラメーター リストが必要です。修飾子または戻り値の型のみに基づいてメソッドをオーバーロードすることはできません。
変数のスコープは、変数を参照できるプログラムの部分です。
メソッド内で定義された変数はローカル変数と呼ばれます。
ローカル変数のスコープは、その宣言から始まり、それを含むブロックの終わりで終わります。
ローカル変数は使用する前に宣言する必要があります。
メソッドのパラメーターのスコープはメソッド全体をカバーします。パラメータは実際にはローカル変数です。
for ループの初期化部分で宣言された変数は、ループ全体にわたって有効範囲を持ちます。
ただし、ループ本体内で宣言した変数の適用範囲は、その変数の宣言からループ本体の終了までとなります。以下に示すような変数宣言が含まれています。
メソッド内、ネストされていない別のブロック内で同じ名前のローカル変数を複数回宣言できますが、ネストされたブロック内でローカル変数を 2 回宣言することはできません。
プログラムの実行中にメッセージをプログラムに渡したい場合があります。これは、コマンド ライン引数を main() 関数に渡すことによって実現されます。
コマンドラインパラメータは、プログラム実行時のプログラム名の直後に続く情報です。
次のプログラムは、すべてのコマンド ライン引数を出力します。
publicclassコマンドライン{
publicstaticvoidmain(Stringargs[]){
for(inti=0;i<args.length;i++){
System.out.println("args ["+i+"]:"+args[i]);
}
}
}
以下に示すようにプログラムを実行します。
javaCommandLineこれはコマンドライン200-100です
実行結果は次のとおりです。
引数[0]:これ
引数[1]:は
引数[2]:a
引数[3]:コマンド
引数[4]:行
引数[5]:200
引数[6]:-100
オブジェクトの作成時に、コンストラクターを使用してオブジェクトを初期化します。コンストラクターは、それが属するクラスと同じ名前を持ちますが、コンストラクターには戻り値がありません。
コンストラクターは通常、クラスのインスタンス変数に初期値を割り当てたり、完全なオブジェクトを作成するために必要なその他の手順を実行したりするために使用されます。
コンストラクターをカスタマイズするかどうかに関係なく、Java はすべてのメンバーを 0 に初期化するデフォルトのコンストラクターを自動的に提供するため、すべてのクラスにコンストラクターがあります。
独自のコンストラクターを定義すると、デフォルトのコンストラクターは無効になります。
コンストラクター メソッドを使用した例を次に示します。
// 単純なコンストラクター static classMyClass{
intx;
// 以下はコンストラクター MyClass(){
x=10;
}
}
次のようにコンストラクターを呼び出すことでオブジェクトを初期化できます。
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass();
MyClasst2=newMyClass();
System.out.println(t1.x+""+t2.x);
}
}
ほとんどの場合、パラメーターを含むコンストラクターが必要です。
以下はコンストラクター メソッドを使用した例です。
// 単純なコンストラクター classMyClass{
intx;
// 以下はコンストラクター MyClass(inti){
x=i;
}
}
次のようにコンストラクターを呼び出すことでオブジェクトを初期化できます。
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass(10);
MyClasst2=newMyClass(20);
System.out.println(t1.x+""+t2.x);
}
}
実行結果は次のとおりです。
1020
JDK 1.5 以降、Java では、同じ型の変数パラメータをメソッドに渡すことがサポートされています。
メソッドの可変引数パラメーターの宣言は次のようになります。
タイプ名...パラメータ名
メソッド宣言では、パラメーターの型を指定した後に省略記号 (...) を追加します。
メソッド内で指定できる変数パラメーターは 1 つだけであり、それはメソッドの最後のパラメーターである必要があります。通常のパラメータはその前に宣言する必要があります。
publicclassVarargsDemo{
publicstaticvoidmain(Stringargs[]){
//可変パラメータメソッドを呼び出します printMax(34,3,3,2,56.5);
printMax(newdouble[]{1,2,3});
}
publicstaticvoidprintMax(double...numbers){
if(数値.長さ==0){
System.out.println("引数が渡されませんでした");
戻る;
}
doubleresult=数値[0];
for(inti=1;i<numbers.length;i++)
if(数値[i]>結果){
結果=数値[i];
}
System.out.println("最大値は"+結果);
}
}
上記の例のコンパイルと実行結果は次のとおりです。
最大値は56.5です
最大値は 3.0 です
Java では、オブジェクトがガベージ コレクターによって破棄 (リサイクル) される前に呼び出されるこのようなメソッドの定義が許可されています。このメソッドは、finalize() と呼ばれ、リサイクルされたオブジェクトをクリアするために使用されます。
たとえば、finalize() を使用すると、オブジェクトによって開かれたファイルが確実に閉じられるようにすることができます。
Finalize() メソッドでは、オブジェクトが破棄されるときに実行される操作を指定する必要があります。
Finalize() の一般的な形式は次のとおりです。
protectedvoidfinalize()
{
//ターミナルコードはここにあります}
キーワード protected は、finalize() メソッドがクラス外のコードによって呼び出されないことを保証する修飾子です。
もちろん、Java のメモリのリサイクルは JVM によって自動的に完了できます。手動で使用する場合は、上記の方法を使用できます。
publicclassFinalizationDemo{
publicstaticvoidmain(String[]args){
Cakec1=新しいケーキ(1);
Cakec2=新しいケーキ(2);
Cakec3=新しいケーキ(3);
c2=c3=null;
System.gc();//Java ガベージ コレクターの呼び出し}
}
classCakeextendsObject{
プライベートintid;
publicCake(intid){
この.id=id;
System.out.println("CakeObject"+id+"iscreated");
}
protectedvoidfinalize()throwsjava.lang.Throwable{
super.finalize();
System.out.println("CakeObject"+id+"isdissolved");
}
}
上記のコードを実行すると、出力結果は次のようになります。
C:1>javaFinalizationDemo
CakeObject1 が作成されました
CakeObject2が作成されました
CakeObject3 が作成されました
CakeObject3 が配置されます
CakeObject2 が配置されます