--/--/-- (--) スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 |


2011/06/07 (Tue) JAVA 14日目 復習用(._.)φ

継承(あるクラスの機能を別のクラスに取り込む仕組み)オーバーライド(スーパークラスで定義されたメソッドをサブクラスで再定義すること)。どちらもAndroidのプログラミングをする上で欠かせない機能。

◆クラスを拡張する
◆スーパークラスのコンストラクタ
◆メンバへのアクセス
◆メソッドのオーバーライド
◆サブクラスとスーパークラスの変数
◆オーバーライドの重要性
◆スーパークラスと同じ名前のメンバを使う
◆this.とsuper.
◆final
◆クラスの階層
◆Objectクラス
◆toString()メソッド
◆equals()メソッド
◆getClass()メソッド

クラスを拡張する

書き方

class 人
{
身長
体重
}
class 上半身 extends 人(元になるクラス名)
{
握力
背筋力
}

新しく拡張したクラスが既存のクラスのメンバを受け継ぐことを「継承」(フィールドとメソッド。コンストラクタは引き継がない)という。元になるクラスはスーパークラス、新しく拡張したクラスをサブクラスという。

人クラス→スーパークラス
上半身クラス→サブクラス

(サンプルコード)

//車クラス
class Car
{
private int num;
private double gas;

public Car()
{
num = 0;
gas = 0.0;
System.out.println("車を作成しました。");
}

public void setCar(int n, double g)
{
num = n;
gas = g;
System.out.println("ナンバーを"+num+"ガソリン量を"+gas+"にしました。");
}

public void show()
{
System.out.println("車のナンバーは"+num+"です。");
System.out.println("車のガソリン量は"+gas+"です。");
}
}

//レーシングカークラス
class RacingCar extends Car
{
private int course;

public RacingCar()
{
course = 0;
System.out.println("レーシングカーを作成しました。");
}
public void setCourse(int c)
{
course = c;
System.out.println("コースナンバーを"+c+"にしました。");
}
}

class Sample
{
public static void main(String[] args)
{
//サブクラスのオブジェクトを作成
RacingCar rccar1;
rccar1 = new RacingCar();

//継承しているのでスーパークラスのメソッドも呼び出せる
rccar1.setCar(4545,19.4);
rccar1.setCourse(3);
}
}

実行結果

車を作成しました。
レーシングカーを作成しました。
ナンバーを4545ガソリン量を19.4にしました。
コースナンバーを3にしました。

スーパークラスのコンストラクタ

上の実行例で、サブクラスのオブジェクトを作成した際、サブクラスのコンストラクタが呼び出される前に、スーパークラスのコンストラクタが呼び出されている(「車を作成しました」)。このように、指定がない場合はサブクラスのコンストラクタの先頭でスーパークラスの引数のないコンストラクタが自動的に呼び出されるようになっている。

なお、呼び出したいコンストラクタを指定したい場合、サブクラスのコンストラクタの先頭で、super(引数)と指定する。

this() そのクラスの別のコンストラクタを呼び出す
super() そのクラスのスーパークラスのコンストラクタを呼び出す

※必ず(コンストラクタの)先頭で使う。
※this()とsuper()は同じコンストラクタ内で使えない(どちらかが先頭でなくなるため)。

メンバへのアクセス

スーパークラスのprivateメンバにはサブクラスからもアクセスすることができない。しかしそれでは不便なので、protectedという指定ができるできるようになっている。protectedという修飾子をつけるとサブクラスからもアクセスできるようになる。

private クラス外からはアクセスできない
protected サブクラスからのアクセスが可能になる(※1)
public どこからでもアクセス可能(フォルダが異なる場合でも)

※1 修飾子無しの場合と同じように同じフォルダ内(パッケージ)からアクセス可能。さらに、protectedをつけるとフォルダが違っても親子関係にあるクラスからアクセスが可能になる。

メソッドのオーバーライド

サブクラスにはスーパークラスと同じ名前、引数の数、引数の型を持つメソッドを定義することができる。その状態でサブクラスのオブジェクトを作成し、そのメソッドを呼び出すと、サブクラスのメソッドの方が呼び出される。このようにサブクラスのメソッドがスーパークラスのメソッドにかわって機能することをメソッドのオーバーライドという。

class XXX
{
showX(int a, int b)
}

class YYY extends XXX
{
showX(int a, int b)
}

class Sample
{
YYY z = new _YYY();
z.showX(int A, int B);
}

このようにYYYクラスのオブジェクトを作成してshowX()メソッドを呼び出すと、YYYクラスのメソッドが呼び出される。

オーバーロードはメソッド名が同じで引数の形式が異なるメソッドを定義すること。オーバーライドはサブクラスでスーパークラスのメソッドとまったく同じメソッドを定義すること。オーバーロードとオーバーライドの違いがテストに出たりする。

サブクラスとスーパークラスの変数

スーパークラスの変数でサブクラスのオブジェクトを扱うことができる。

書き方

スーパークラス名 変数名 = 変数名 サブクラス名();
Car car1 = new RacingCar();

オブジェクトをさす変数のクラスに関係なく、オブジェクト自身のクラスによって適切なメソッドが呼び出される。

ただし、そのままの状態で呼び出せるのはあくまでスーパークラスで定義されたフィールドおよびメソッドに限る(他のものを呼び出す場合はキャストする必要がある)。次の項目でこのようなことができるメリットを取り上げる。

オーバーライドの重要性

スーパークラスの変数でサブクラスのオブジェクトを扱えるメリットについて。

//車クラス
class Car
{
protected int num;
protected double gas;

public Car()
{
num = 0;
gas = 0.0;
System.out.println("車を作成しました。");
}

public void setCar(int n, double g)
{
num = n;
gas = g;
System.out.println("ナンバーを"+num+"ガソリン量を"+gas+"にしました。");
}

public void show()
{
System.out.println("車のナンバーは"+num+"です。");
System.out.println("車のガソリン量は"+gas+"です。");
}
}

//レーシングカークラス
class RacingCar extends Car
{
private int course;

public RacingCar()
{
course = 0;
System.out.println("レーシングカーを作成しました。");
}
public void setCourse(int c)
{
course = c;
System.out.println("コースナンバーを"+c+"にしました。");
}
public void show()
{
System.out.println("レーシングカーのナンバーは"+num);
System.out.println("ガソリン量は"+gas);
System.out.println("コース番号は"+course);
}
}

class Sample
{
public static void main(String[] args)
{
Car[] cars = new Car[2];

//スーパークラスのオブジェクトを作成
cars[0] = new Car();
cars[0].setCar(4545,19.4);

//サブクラスのオブジェクトを作成
cars[1] = new RacingCar();
cars[1].setCar(1919,0.5);

//オブジェクトのクラスに対応した処理が自動的に行われる
for(int i=0; i cars[i].show();
}
}
}

実行結果

車を作成しました。
ナンバーを4545ガソリン量を19.4にしました。
車を作成しました。
レーシングカーを作成しました。
ナンバーを1919ガソリン量を0.5にしました。
車のナンバーは4545です。
車のガソリン量は19.4です。
レーシングカーのナンバーは1919
ガソリン量は0.5
コース番号は0

オブジェクトのクラスで場合わけしたりする必要がなくなる。
オーバーライドは頻繁に利用される機能。

スーパークラスと同じ名前のメンバを使う

コンストラクタ同様、サブクラスのメソッド内で以下のような記述ができる。

public void show
{
super.show();
・・・
}

また、superはコンストラクタ、メソッドのほかフィールドにも使うことができる。
(フィールドに対しては混同しやすいので使うことは稀)

◆this.とsuper.

class Car
{
int x;
public void show(int x);
{
this.x = x;
}
}

インスタンス変数(staticでない変数)とローカル変数の名前が重複する場合の区別。
set()メソッドでよく使われる。

final

finalを使うとそれ以上拡張することができなくなる

①スーパークラスのメソッドにfinalをつけた場合
→サブクラスでそのメソッドのオーバーライドができなくなる

public final void show()

②スーパークラスにfinalをつけた場合
→サブクラスを宣言することができなくなる

final class Car

③フィールドにfinalをつけた場合
→その値を変更することができなくなる(定数)

static final int NUM_TIRE = 4;

※呼び出す場合はクラス変数なので「Car.NUM_TIRE」。

クラスの階層

1つのスーパークラスから複数のサブクラスを作ることができる。また、サブクラスの下にさらにサブクラスを作ることができる。この場合もとのサブクラスが新たなサブクラスのスーパークラスになる。

※複数のスーパークラスからひとつのサブクラスを作ることはできないが、「インターフェイス」という機能を使うと擬似的に行うことができる。

Objectクラス

Javaではスーパークラスを指定しないクラス宣言をした場合、そのクラスはObjectクラスをスーパークラスに持つサブクラスになる。つまり、JavaのクラスはすべてObjectクラスのメンバを継承していることになる。

Objectクラスには以下のようなメソッドが含まれている。

boolean equals(Object obj) オブジェクトが引数と同じものかどうか
Class getClass() 示しているオブジェクトが何のクラスなのか
String toString() オブジェクトがあらわしている文字列を返す

toString()メソッド

このメソッドはオブジェクトを文字列であらわしたものを文字列で返す。「System.out.println(オブジェクト変数名);」でメソッドが呼び出される。呼び出し方が簡単なので、サブクラスでオーバーライドして定義しておくと便利(show()クラスの代わりに使うなど)。

//車クラス(Objectクラスのサブクラス)
class Car
{
protected int num;
protected double gas;

public Car()
{
num = 0;
gas = 0.0;
System.out.println("車を作成しました。");
}

public void setCar(int n, double g)
{
num = n;
gas = g;
System.out.println("ナンバーを"+num+"、ガソリン量を"+gas+"にしました。");
}

//toString()メソッドをオーバーライドする
public String toString()
{
//この文字列を戻り値とする
String str = "ナンバー:"+num+" ガソリン量:"+gas;
return str;
}
}

class Sample
{
public static void main(String[] args)
{
Car car1 = new Car();

//toString()メソッドの戻り値が帰ってくる
System.out.println(car1);

car1.setCar(4545,19.4);

System.out.println(car1);
}
}

実行結果

車を作成しました。
ナンバー:0 ガソリン量:0.0
ナンバーを4545、ガソリン量を19.4にしました。
ナンバー:4545 ガソリン量:19.4

※ただし実際の現場で使うことは稀。

equals()メソッド

2つの変数が指しているオブジェクトが同じである場合にtrue、異なる場合にfalseを返す。Objectクラスのメンバなのでメソッドを記述しなくても使うことができる。Objectクラスのメソッドでは最も使用頻度が高い

boolean b1 = car1.equals(car2)
boolean b2 = car1.equals(car3)

上はcar1とcar2が同じかを調べ値をb1に格納
下はcar1とcar3が同じかを調べ値をb2に格納

Stringクラスの場合、オブジェクトではなくそれがあらわしている文字列が同じかどうかで判断する。

String str1 = "ABC";
String str2 = "ABC";

System.out.println("equals:"+str1.equals(str2));

実行結果
true

文字列の内容を比較するときは「==」ではなく「equals()メソッド」を使う。

getClass()メソッド

このメソッドはオブジェクトが属しているクラスの情報を返す。実際に使うことは少ない(クラスのキャストを行うときなど)。


//車クラス
class Car
{
protected int num;
protected double gas;

public void setCar(int num, double gas)
{
this.num = num;
this.gas = gas;
System.out.println("ナンバーを"+this.num+"にガソリン量を"+this.gas+"にしました。");
}

public String toString()
{
String str = "ナンバー"+num+"ガソリン量"+gas+"の車です。";
return str;
}
}

class Sample
{
public static void main(String[] args)
{
Car car1 = new Car();

car1.setCar(1234,20.5);

System.out.println(car1);
}
}

ナンバーを1234にガソリン量を20.5にしました。
ナンバー1234ガソリン量20.5の車です。

プログラミング | trackback(0) | comment(0) |


<<JAVA基礎 15日目(抽象クラスとインターフェイス) | TOP | JAVA 13日目 復習用(._.)φ>>

comment











管理人のみ閲覧OK


trackback

trackback_url
http://kononushi.blog46.fc2.com/tb.php/510-e6b41bcd

| TOP |

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。