2016-06-14 5 views
0

でクラスAの属性を達することができないので、私はこのケースでがクラスBとクラスAを拡張するが、クラスBの方法

public class A extends B{ 

    public String name = "Alpha" 

} 

public class B{ 

    public void revealAName(){ 
     print(this.name); 
    } 
} 

main(){ 
A newA = new A(); 
newA.revealName(); 
} 

をEclipseには、属性名はdoesnのことを言います存在しない。それはなぜそれを言うのですか?私がクラスBのメソッドの中にいるとき、私はクラスAオブジェクトの属性を使用できないのですか?どうすれば修正できますか?

+0

あなたはAからBを派生させて修正することができますが、AではなくB – wero

+0

ですが、Bのメソッドを使用するオブジェクトを使用することはできません... –

+0

派生クラスのフィールドは使用できませんスーパークラスで – wero

答えて

0

BAの属性について何も知らない場合、両方のクラスを別々にコンパイルすることができます。

しかし、あなたは派生クラス(B)からnameにアクセスできるB extends Aようにあなたがそれを変更した場合:

class A { 
    String name = "Alpha"; 
} 

class B extends A { 
    public void revealAName(){ 
     print(this.name); 
    } 
} 
A a = new A(); 
a.name; // OK 
a.revealName(); // not OK 

B b = new B();  
b.name; // OK 
b.revealName(); // OK 

すべてを見るのもOracle tutorial on inheritance

1

まず、そこにmainメソッドを含むべきpublicクラスは1つだけでなければなりません。 第2に、継承を使用しています。したがって、子クラスにアクセスするには、基本クラスの変数のアクセス修飾子に "protected"を与えなければなりません。したがって、それはする必要があります:

保護された文字列名= "アルファ";

"デフォルト"のアクセス修飾子では子クラスへのアクセスが許可されないためです。 controlling access to members of class

 
Modifier  Class Package Subclass World 
public   Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 

もう一つから、あなたはそれがエラーを示している理由のクラスBの「名前」変数を取得しようとしている「this.name」を使用しました。

継承を使用している間は、オブジェクト参照を使用せずに親クラスの変数を直接使用できます。重複する変数名の場合はオブジェクト参照に "super"を使用できます。 You can refer this image in case of doubt ..

希望、それは今明らかでしょう。

+0

私は自分の答えをより詳細にマージしました。承認していない場合は、編集をロールバックしてください。 –

+0

ありがとう...オースティン。それは完璧です。その+1 –

関連する問題