はじめに
この実験では、メソッドとオブジェクトについて学びます。パラメータを持つメソッドを定義する方法を学ぶことが課題です。オブジェクトはオブジェクト指向言語において非常に重要な概念であるため、それについて十分に理解することはあなたにとって有益でしょう。
この実験では、メソッドとオブジェクトについて学びます。パラメータを持つメソッドを定義する方法を学ぶことが課題です。オブジェクトはオブジェクト指向言語において非常に重要な概念であるため、それについて十分に理解することはあなたにとって有益でしょう。
場合によっては、誰かの年齢と名前を表示するなど、似たような問題を解決するために再利用できるコードが必要になります。異なる人に対して名前と年齢は異なります。これらの2つの変数をパラメータとしてコードブロックに渡すことができます。そこで、タスクを実行するメソッドの概念を紹介します。
例:
/home/labex/project/methodTest.java
ファイルに次のコードを記述します。
public class methodTest
{
public static void main(String[] args)
{
// 自作のメソッドを呼び出す
printInfo("Mike", 18);
// 自作のメソッドを呼び出す
System.out.println(fibonacci(10));
System.out.println(fibonacciNormal(10));
}
// 個人情報を表示するクラスメソッドを定義する
public static void printInfo(String name, int age){
System.out.println("Hello " + name + ", your age is " + age);
}
// 再帰を使ってフィボナッチ数列を計算するクラスメソッドを定義する
public static int fibonacci(int n){
if(n<=2){
return 1;
}else{
return fibonacci(n-1)+fibonacci(n-2);
}
}
// ループを使ってフィボナッチ数列を計算するクラスメソッドを定義する
public static int fibonacciNormal(int n){
if(n<=2){
return 1;
}
int n1=1,n2=1,sum=0;
for(int i=0;i<n-2;i++){
sum=n1+n2;
n1=n2;
n2=sum;
}
return sum;
}
}
出力:
次のコマンドを使って methodTest.java
ファイルを実行します。
javac /home/labex/project/methodTest.java
java methodTest
出力を見てみましょう。
Hello Mike, your age is 18
55
55
上の例では、printInfo
という関数を書きました。好きな名前にすることができます。2つのパラメータがあり、戻り値の型は void
で、何も返さないことを意味します。関数の戻り値の型を必要な型に任意に設定でき、パラメータの数と型も任意です。メソッドは次のように定義できます。
例:
public/private static/final/{不要} RETURN_TYPE METHOD_NAME( パラメータのリスト ) {
// 文
}
public String getName(){}
public void setName(){}
public static void newInstance(){}
public final String msg(){}
Javaは、数学関数など、最も一般的な操作を行う多くの関数を組み込みライブラリメソッドとして提供しています。これらの関数は メソッド と呼ばれます。メソッドは、既に見たprint文と似た構文を使って呼び出されます。
例:
double root = Math.sqrt(16.0); // root = 4.0
double height = Math.sin(1.5); // height = 0.9974949866040544
Javaには2種類の 型 があります。プリミティブ型とオブジェクト型です。int
やboolean
のようなプリミティブは小文字で始まり、オブジェクト型は大文字で始まります。この違いは、それらの間のいくつかの違いを思い出させるので役立ちます。
プリミティブ変数を宣言すると、プリミティブ値用の格納スペースが確保されます。オブジェクト変数を宣言すると、オブジェクトへの参照用のスペースが確保されます。オブジェクト自体のスペースを確保するには、
new
演算子を使用する必要があります。
プリミティブ変数を初期化しない場合、その型に応じたデフォルト値が与えられます。たとえば、
int
型の場合は0
、boolean
型の場合はfalse
です。オブジェクト型のデフォルト値はnull
で、これは参照変数によって参照されているオブジェクトがないことを示します。
プリミティブ変数は、あるメソッド内で行うことができることが他のメソッド内の変数に影響を与えないという意味で、よく隔離されています。オブジェクト変数は、隔離されていないため扱いにくい場合があります。オブジェクトへの参照を引数として渡すと、呼び出すメソッドがオブジェクトを変更する可能性があり、その場合、影響を見ることができます。もちろん、それは良いこともありますが、それに気付く必要があります。
プリミティブ変数をメソッドに渡す場合(値渡しでパラメータを渡す)、実際にはプリミティブの値をコピーし、メソッド内でコピーを使用します。メソッド内のすべての操作はコピーに対して行われ、メソッドの外では、プリミティブ変数の値は影響を受けません。ただし、非プリミティブオブジェクトをメソッドに渡す場合(参照渡しでパラメータを渡す)、参照変数をメソッドに渡します。すべての操作は実際には元のオブジェクトを使用して影響を与えます。
例:
/home/labex/project/objectTest.java
ファイルに次のコードを記述します。
public class objectTest {
public static void main(String[] args){
// newを使って2つの要素を持つ配列オブジェクトを作成する
int[] numbers = new int[2];
// 配列オブジェクトに値を割り当てる
numbers[0] = 1;
numbers[1] = 2;
// このようにプリミティブ変数を作成する
int a = 1, b = 2;
// テスト用のオブジェクトを作成する
objectTest test = new objectTest();
test.changeInt(a, b);
System.out.println("Now a is " + a + ", b is " + b);
test.changeArray(numbers);
System.out.println("Now numbers contain:");
for(int i : numbers){
System.out.print(i + "\t");
}
}
// オブジェクトメソッドを定義し、int値を変更する
public void changeInt(int a,int b){
a = 2;
b = 3;
System.out.println("In changeInt method, a is " + a + ", b is " + b);
}
// オブジェクトメソッドを定義し、配列の値を変更する
public void changeArray(int[] number){
for(int i = 0;i < number.length;i++){
number[i] = number[i]+1; // 配列要素の値を1増やして変更する
}
System.out.println("In changeArray method, numbers contain:");
for(int i : number){
System.out.print(i + "\t");
}
System.out.println();
}
}
出力:
ターミナルで次のコマンドを使って objectTest.java
ファイルを実行します。
javac /home/labex/project/objectTest.java
java objectTest
出力を見てみましょう。
In changeInt method, a is 2, b is 3
Now a is 1, b is 2
In changeArray method, numbers contain:
2 3
Now numbers contain:
2 3
プリミティブ型とオブジェクト型の間にはもう1つの違いがあります。Javaに新しいプリミティブを追加することはできません(標準委員会に参加しない限り)が、新しいオブジェクト型を作成することはできます! 次の章でそれがどのように行われるか見ていきましょう。
メソッドはクラスにおいて一般的です。メソッドは、特定の操作を行うコードブロックです。Javaは、直接使用できる多くの組み込みクラスを提供しています。メソッドにパラメータを渡す方法は2通りあります。値渡しと参照渡しです。それらの効果は異なります。次の実験では、それらを紹介します。役立つことができれば幸いです。