class MyPoint{
double m_x;
double m_y;
// コンストラクタ
public MyPoint(){
System.out.println("コンストラクタ1が呼ばれました");
m_x = 10;
m_y = 20;
}
// コンストラクタ2
public MyPoint(double x, double y ){
System.out.println("コンストラクタ2が呼ばれました");
m_x = x;
m_y = y;
}
// 文字列に変換する
public String toString(){
return "X:"+m_x+" Y:"+m_y;
}
// 距離を計算する
public double calcDistance(MyPoint pnt){
// Mathクラスは数学関係を担うクラス
// Math.pow累乗を計算するメソッド
// Math.sqrtはルートを計算するメソッド
return Math.sqrt(Math.pow((m_x - pnt.m_x), 2) + Math.pow((m_y - pnt.m_y), 2));
}
}
|
まず、4-3で解説したようにコンストラクタはインスタンスが作られるときに
最初に呼ばれるメソッドである。MyPointクラスでは引数をとるコンストラクタと引数をとらないコンストラクタの
2種類が用意されている。メソッドでもそうだが、引数の異なる同じ名前のメソッドを複数用意することを
6-4で解説したように、メソッドを(コンストラクタを)オーバーロードすると言う。
引数なしのコンストラクタは変数「m_x」と「m_y」にそれぞれ10と20を代入しているが、これは引数ありの
コンストラクタに10,20を渡しても同じ結果が得られる。コンストラクタから同じクラス内の別のコンストラクタ
を呼び出すこともできる。もっと複雑なクラスになると、コンストラクタを複数用意する場合、ある一部を除いて
同じことをする。このため、あるコンストラクタから別のコンストラクタを呼び出すと便利な場合が多い。その方法は
以下のように「this」キーワードを用いる。ただし、コンストラクタの一番最初で使用しなければならない。
class MyPoint{
double m_x;
double m_y;
// コンストラクタ
public MyPoint(){
this(10,20);
System.out.println("コンストラクタ1が呼ばれました");
// m_x = 10;
// m_y = 20;
}
// コンストラクタ2
public MyPoint(double x, double y ){
System.out.println("コンストラクタ2が呼ばれました");
m_x = x;
m_y = y;
}
:
:
省略
:
:
}
|
calcDistanceメソッドでは、引数にMyPointクラスをもらっている。この場合、同じ名前の変数(m_x, m_y)が
頻繁に出てくるため、プログラムを見直した場合、自分自身のインスタンスの変数か、引数でもらってきた
インスタンスの変数か紛らわしくなることがある。この場合、thisというキーワードをつけて明示的に
区別することができる。したがって、下記のように書き直すこともできる。(変数だけでなく、メソッドにも
thisをつけることもできる。)
class MyPoint{
:
:
省略
:
:
// 距離を計算する
public double calcDistance(MyPoint pnt){
// Mathクラスは数学関係を担うクラス
// Math.pow累乗を計算するメソッド
// Math.sqrtはルートを計算するメソッド
return Math.sqrt(Math.pow((this.m_x - pnt.m_x), 2) + Math.pow((this.m_y - pnt.m_y), 2));
}
}
|