ちくやらアーカイブ

このブログは気分よって構成されています。 BGMも気分で流してます。 あなたの忍耐に感謝します。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

スーパークラスとサブクラス

クラスはextendsを使って継承するが、
一個のクラスしか継承できない。
複数の実装をしたいときはインターフェースをimplementsする。



●スーパークラスとサブクラスのフィールド変数の関係。

メソッドを実行したときとか、スーパークラスかサブクラスの
どちらのメソッドが実行されるのか、
またどちらにある変数が使われるのか、など
慣れないと混乱する。



・変数については「参照変数の型」によって指定される。
 親クラスが型だと、親クラスの変数を参照する。

・メソッドについては「その変数が参照するオブジェクトの型」
 によって指定される。

・インスタンス生成がサブクラスだとサブクラスのメソッドが
 呼ばれる。

・その際、もし子クラスにある同名メソッドが
 「オーバーロード」だった場合は、親クラスのメソッドが使われる。

・ただし、staticについては、変数と同じで「参照変数の型」になる。




class Super{
int num = 10;
static int snum = 20;
void method(){ System.out.println("Super Method");}
static void smethod(){ System.out.println("Super sMethod");}
}

class Sub extends Super{
int num = 30;
static int snum = 40;
void method(){ System.out.println("Sub Method");}
static void smethod(){ System.out.println("Sub sMethod");}
}

class Sample{
public static void main(String [] args){
Super s = new Sub();
System.out.println(s.num);
System.out.println(s.snum);
s.method();
s.smethod();
}
}


Super s = new Sub()は
10
20
Sub Method
Super sMethod
を表示する。



Sub s = new Sub()は
30
40
Sub Method
Sub sMethod


Super s = new Super()は
10
20
Super Method
Super sMethod


Sub s = new Super()
sample.java:20: 互換性のない型
出現: Super
要求: Sub
Sub s = new Super();
^
エラー 1 個




●多様性

同名の変数がスーパークラス、サブクラスの両方にあった場合
どっちが使われるのか?


class Super{
int num = 10;
static int snum = 20;
void method(){ System.out.println("Super Method");}
static void smethod(){ System.out.println("Super sMethod");}
}
class Sub extends Super{
int num = 30;
static int snum = 40;
// void method(){ System.out.println("Sub Method");}
static void smethod(){ System.out.println("Sub sMethod");}
}
class Sample{
public static void main(String [] args){
Sub s = new Sub();
System.out.println(s.num);
System.out.println(s.snum);
s.method();
s.smethod();
}
}

30
40
Super Method10
Sub sMethod


メソッドを実行するクラスの変数を使っている。




あと、スーパークラスとサブクラスの問題では
「デフォルトコンストラクタ絡みのひっかけ問題」が多い。
これについてはまた後で同じことを書くかもしれないが、


class Parent{
Public Parent(String message){
//
}

Public void printMessage(){
//
}
}

class Child extends Parent{
Public void printMessage(){
//
}
}

class Sample{
public static void main(String [] args){
Parent obj = new Child();
obj.printMessage();
}
}


という問題があった場合、
スーパークラスには「コンストラクタがある」が
サブクラスには「コンストラクタがない」。

で、Parent obj = new Child();より
サブクラスで呼び出しているが、この時「デフォルトコンストラクタ」が呼び出す。
サブクラスのコンストラクタが呼び出されると
「スーパークラスのコンストラクタを呼び出す」ことになっているが、
デフォルトコンストラクタは「引数無しのスーパークラスのコンストラクタ」をよびだそうとする。
が、スーパークラスには「引数ありのコンストラクタ」があるため、
super();で呼び出せるコンストラクタが無いため
コンパイルエラーが発生する。


このひっかけ問題はほぼ出てくる。
けど慣れたらソースみた瞬間にコンパイルエラーだというのが
わかるので時間稼ぎにもなる。
スポンサーサイト
  1. 2005/04/10(日) 14:22:28|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0
<<修飾子とアクセス修飾子 | ホーム | 金曜日-a.m.04:27/連邦首都プラハ>>

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://runark.blog6.fc2.com/tb.php/25-48ac1226

ルナーク

Category

Recent Comments

Recent Entries

Recent Trackbacks

Archives

Links

Search

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