Java初心者の疑問:privateなフィールドの継承について

このQ&Aのポイント
  • Java初心者の方からの質問です。
  • 質問は、privateなフィールドが継承されない理由についてです。
  • 具体的なコード例として、Catクラスの変数countに値を代入してもエラーが起きない理由を教えてください。
回答を見る
  • ベストアンサー

継承について質問させていただきます

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()); // ここも同様 } } ----------------------------------------------

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.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
simasi
質問者

お礼

ご回答いただきありがとうございます。 また、丁寧なご説明ありがとうございます。 なるほど。。。 現時点では完全に理解できたとは言えませんが、 さらに継承については勉強が必要と感じました。 どうもありがとうとうございました。

関連するQ&A

  • 継承について

    継承についてです。 class A { int x; } class B extends A{ public int test(){ return 1; } public static void main(String[]args){ A a = new B; a.test(); } } としたとき a.test(); という記述はできないものなのでしょうか?a.textでコンパル時にエラーが出ます。aはBのインスタンスを指しているから、test()もつかえるんじゃないかなとおもったのですが・・・ public int test(){return 0;}というのをクラスAに記述すればエラーは起こりませんが、これはわかります。 ウェブを探したのですが、検索の仕方が悪かったのかこれに関する記事をさがせなかったので質問いたしました。

    • ベストアンサー
    • Java
  • クラスの継承、メソッドのオーバーライド

    ↓の問題が全然わかりません。 問題:サブクラスのsiki2にax2+bx+c=0(b2-4ac>0)とコンストラクタ を定義して、スーパークラスのsiki1にax+b=0とコンストラクタを定義し、解を求めるkaiメソッドを定義する という問題です。途中のプログラムを↓に書きました。 スーパークラス class houteisiki1{ private int kai; private int a; private int b; private int x; //コンストラクタ houteisiki1(int s, int d, int e, int f){ solve=s; a=d; b=e; x=f; } //kaiメソッド kai=(a*x)+b; } サブクラス class houteisiki2 extends houteisiki1{ static int kai(int a, int b, int c, int x){ kai=(a*x*x)+(b*x)+c; if((b*b)+(-4*a*c)>0){ return kai; }else{ println("エラー"); } } } テストクラス class test{ public static void main(string[] args){ ここまで作りましたが、解らなくなりましたので教えてください。 まだ、JAVAを勉強して日が浅いので解りやすく教えてください。

    • ベストアンサー
    • Java
  • 継承プログラムについて

    下記で作成した継承プログラムで、間違ったプログラムの部分を直しても同じエラーが発生します。どうしたら下記のプログラムがうまく動きますか? ちなみに同じエラーが発生するのはsuper()の部分で、新保ぷが見つからないとのこと。 class Human { private double height, weight; private String name; private static int count = 0; public Human() { height = 0; weight = 0; name = "no name"; } public void inputData(String na, double ht, double wt) { height = ht; weight = wt; name = na; } public void showValue() { count++; System.out.println("名前: " + name + ", 身長: " + height + "cm, 体重:"+ weight + "kg"); } public void copyData(Human a) { height = a.height; weight = a.weight; name = a.name; } public double readData(double a) { if(a==0){ return height; }else{ return weight; } } public static int readCount() { return count; } } class Sandai extends Human { private String number; public Sandai(String nu, String na, double ht, double wt) { super(na, ht, wt); number = nu; } public void showData() { System.out.println("学籍番号:"+number+", "); showValue(); } } class Kadai12_3 { public static void main(String args[]) { Sandai student = new Sandai("09H099", "Taro", 165.0, 55.0); student.showData(); } }

    • ベストアンサー
    • Java
  • 継承プログラムについて 

    下記で作成した継承プログラムで、間違ったプログラムの部分を直しても同じエラーが発生します。どうしたら下記のプログラムがうまく動きますか? ちなみに同じエラーが発生するのはsuper()の部分で、シンボルが見つからないとのこと. class Human { private double height, weight; private String name; private static int count = 0; public Human() { height = 0; weight = 0; name = "no name"; } public void inputData(String na, double ht, double wt) { height = ht; weight = wt; name = na; } public void showValue() { count++; System.out.println("名前: " + name + ", 身長: " + height + "cm, 体重:"+ weight + "kg"); } public void copyData(Human a) { height = a.height; weight = a.weight; name = a.name; } public double readData(double a) { if(a==0){ return height; }else{ return weight; } } public static int readCount() { return count; } } class Sandai extends Human { private String number; public Sandai(String nu, String na, double ht, double wt) { super(na, ht, wt); number = nu; } public void showData() { System.out.println("学籍番号:"+number+", "); showValue(); } } class Kadai12_3 { public static void main(String args[]) { Sandai student = new Sandai("09H099", "Taro", 165.0, 55.0); student.showData(); } }

    • ベストアンサー
    • Java
  • privateなフィールドは継承されない?

    たとえば、 class A { private int width; public A(){ this.width=3; } public int getWidth(){ return width; } public void setWidth(int width){ this.width=width; } } -------------------------------- class B extends A { String name; public B(){ this.name="あきら"; } } -------------------------------- class TestAB{ public static void main(String[] args){ B b = new B(); B b2= new B(); System.out.println(b.getWidth()); b2.setWidth(5); System.out.println(b2.getWidth()); System.out.println(b.getWidth()); } } というのがあったとして、ある参考書では「privateなフィールドは継承されない」と書いてありました。 でも、これってwidthに直接アクセスして値を変更できないだけであって、 widthは継承されてるのではないですか? B型のb専用、b2専用のwidthがあるのではないですか? ちょっと頭がこんがらがってきました。。

    • ベストアンサー
    • Java
  • 継承(extends)について

    extendsについてわからないことがあります。 次の3つのクラスがあった時、 class スーパークラス { ... class サブクラス1 extends スーパークラス { ... class サブクラス2 extends サブクラス1 {... サブクラス2は、サブクラス1でスーパークラスから継承しているフィールドをメソッドを継承するのでしょうか?

    • ベストアンサー
    • Java
  • クラスの設計の問題

    今C++でクラスの設計をしています。 どう設計すれば、いいか分からないので、しっている方に教えていただきたいですが。 class A{ private: int id; public: int getId(); void setId(); }; class B{ private: int id; public: int getId(); void setId(); } class C{ private: int id; public: int getId(); void setId(); } この三つのクラスが、共通な機能があります。また、実装も同じで、 継承を利用して、どう設計すれば、いいですか? よろしくお願いします。

  • JAVAの継承について

    JavaでクラスA,B,Cがあり、A,BはクラスCを継承しています。 この時にAのインスタンスを生成しCにある変数に値を設定します。 この設定した情報をBのインスタンスに一気に設定することは可能でしょうか? やりたいこととしてはAに設定した情報をBにコピーするようなイメージです。 すべてのsetterを呼びだして設定するのが面倒なので。 例)構文的に間違ってるかもしれませんがやりたいことは以下のような感じです。 A a = new A(); a.setStr("aaa"); a.setInt(5); B b = new B(); b.setStr(a.getStr()); b.setInt(a.getInt(); class A extends C{} class B extends C{} class C {  int x = 0;  String str = "";  private String setStr(String str){this.str=str;}  private String setInt(int i){this.x=i;}  private String getInt(){return this.x;}  private String getStr(){return this.str;} }

    • ベストアンサー
    • Java
  • インタフェイス実装と抽象クラス継承を同時に使うには??

    私はjava初心者です、今練習問題で困っています。 1つのクラスに抽象クラスとインターフェイスを 実装することはできるのでしょうか? 例えば abstract class Car { private String gas; public void getGas(int gas) { this.gas = gas; } public abstract void enjin(); } interface Flying extends Pet { void show(); } 上のインタフェイスと抽象クラスを同時に下のクラスに継承、実装しよう とすると、どんな風にかけば良いのでしょうか class Zoon { public Zoon() { super(); } public void enjin() { System.out.println("どどどどど"); } public void show() { System.out.println("いいくるまだ"); } }

    • ベストアンサー
    • Java
  • private継承はどう使う?

    C++の話です class Base{.....}; class Derived1 : public Base{.....}; class Derived2 : private Base{.....}; と書くことができますが、public継承とprivate継承にはそれぞれ意味がありますよね。 public継承は"is-a"関係を意味していて、private継承は "is-implemented-in-terms-of"関係を表していると言います。 public継承を実際に動くプログラムは思いつくのですが、private継承を使ったプログラムが思いつきません(というより有効に使えません) 派生クラスから呼び出せない、外部からも呼び出せないメンバをどう使うのでしょうか?