あなたの習慣について教えてください!!

Java初心者です。

privateなフィールドは継承されない
と書籍にありましたが、理解に苦しんでおります。

具体例で申しますと、下記コードの
cat.setCount(3);
です。

CatクラスにはAnimalクラスの変数countは継承されないと考え、
エラーとなることを想像していたのですが。。。
なぜエラーとならないのでしょうか?

宜しければ、解りやすくご説明していただければ幸いです。
どうかよろしくお願いいたします。

----------------------------------------------
class Animal{

private int count;

int getCount(){
return count;
}
void setCount(int c){
this.count = c;
}
}

class Cat extends Animal{
}

public class test{
public static void main(String[] args){

Cat cat = new Cat();

cat.setCount(3); // ここが理解できません
System.out.println(cat.getCount()); // ここも同様
}
}
----------------------------------------------

A 回答 (1件)

ご指摘の通り、Javaでは private のメソッド・フィールドは継承されません。

ですが、メソッドと違い、参照するフィールドに関してはコンパイル時に型によって決定されます。(静的束縛)
したがって、Animal クラスの getCount setCount では、必ず、Animal クラスの count を参照することになります。

ちなみに、サブクラスでフィールドを再定義しても、オーバーライドにはならず、隠蔽になります。(参考URL)

下記は、同じオブジェクトでも変数の型によって参照するフィールドが異なる場合のサンプルです。

public class Parent {
 String str = "parent";
}

public class Child extends Parent {
 String str = "child";
}

public class Test {

 public static void main(String[] args) {
  Child child = new Child();
  Parent parent = child; // オブジェクトは同じもの
  System.out.println(child.str); // "child" と表示される
  System.out.println(parent.str); // "parent" と表示される
 }
}

参考URL:http://www.javaroad.jp/java_class8.htm
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

また、丁寧なご説明ありがとうございます。
なるほど。。。

現時点では完全に理解できたとは言えませんが、
さらに継承については勉強が必要と感じました。

どうもありがとうとうございました。

お礼日時:2010/03/08 20:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!