0

このコードを次のように変更すると、Member m1 = new Member ();完全に機能します。スーパークラスの参照では機能しないのはなぜですか? 誰か説明してください。

public class Family {

String Surname = "Richard";
String Address = "No:10, High Street,Colombo";

}

public class Member extends Family{

String Name;
int age;

public void Details() {
    System.out.println("full Name ="+ Name +" "+ Surname);
    System.out.println("Age =" +age);
    System.out.println("Address =" + Address);
}

public static void main(String[] args) {
    Member m1 =  new Family ();

    m1.Name="Anne";
    m1.age=24;

    m1.Details();

}
4

1 に答える 1

7

スーパー クラスの参照がありません。スーパークラスオブジェクトへの参照を保持するサブクラス参照がありますが、これは単に違法です。

第二に、ポリモーフィズムを有効にしたい場合は、サブクラスにもスーパークラスにもあるメソッドを定義する必要があります。スーパークラスでも定義されているスーパークラス参照でのみ、そのメソッドを呼び出すことができます。

したがって、基本的にこれが必要です: -

Family m1 =  new Member();

次に、クラスでメソッドを定義しますdetails()(はい、メソッド名は小文字のアルファベットで始まる必要があります)Family

のフィールドにアクセスしようとすると、別のコンパイラ エラーが発生しますMember。そのためには、クラスで2 引数のコンストラクターを使用し、そのコンストラクターから2 引数のスーパー コンストラクター(これを明示的に行う必要があります)、または0 引数のスーパー コンストラクター(これは暗黙的です)を呼び出すことをお勧めします。Member

public Member(String name, int age) {
    this.name = name;
    this.age = age;
}

そして、このコンストラクターを使用してオブジェクトを作成します。引数なしのスーパーコンストラクターを暗黙的に呼び出して、フィールドをデフォルト値で初期化します。それらに値を与えたい場合は、クラスで4引数のコンストラクターを使用して、スーパーMemberクラスフィールドの2パラメーターを渡し、そこからスーパークラスの2引数コンストラクターを呼び出すことができます。

優れたチュートリアルから始めて、一般的な継承、アクセス指定子の学習から始めてから、ポリモーフィズムに進むべきだと思います。

于 2013-02-10T07:00:41.933 に答える