2016-05-15 6 views
-1

からスーパークラスのメソッドを呼び出すだから私は、次のコードを持っている:スーパー:私は何を得るは、サブクラスのインスタンス

class Super { 
    private String name="super"; 
    public String name(){ 
     return this.name; 
    } 
} 
class Sub extends Super { 
    private String name = "sub"; 
} 
public class Main { 
    public static void main(String[] args) { 
     System.out.println(new Sub().name()); 
    } 
} 

を結果があるようです。 なぜ私は知りませんでしたか?メソッドname()は、呼び出されたオブジェクトのthisを呼び出す予定ではなく、SubSuperを継承しているため、そのメンバーで使用できるはずです。

+0

**覚えておくべき簡単なルールは次のとおりです。**フィールドはポリモーフィックではありません**、メソッドは(プライベート、ファイナル、または静的でない限り)のみです。 – Pshemo

答えて

1

おそらくSubnameメンバーフィールドはSupernameメンバーフィールドをオーバーライドでなければならないことを考えています。そうではありません。Javaでフィールドをオーバーライドすることはできません。さらに、両方のフィールドをprivateと定義しました。つまり、そのメンバーはそのクラスの他のメンバーにしか見えません(は派生クラスのメンバーまたは他のクラスのではありません)。だからあなたのコードでは、Supernameフィールドの独自の定義を持ち、Subは独自の完全に異なるプライベート定義を持っています。どちらも他人の存在を意識していません。

Javaの標準的な方法は、ゲッターとセッターを使用して内部データにアクセスすることです。必要な場合は、派生クラスで自由にオーバーライドすることができます。

+2

Javaには 'virtual'キーワードはありません。 – SamTebbs33

+0

@ SamTebbs33申し訳ありません、脳のおなら。私はJava、C++、C#などの言語を日常的に使用しています。 ;) – TypeIA

+0

私はそれが問題だと思った! :) – SamTebbs33

関連する問題