1
public class test
{
    public static void main(String[] args)
    {
        new Person().printPerson();
        new Student().printPerson();
    }
}

class Student extends Person
{
    public String getInfo()
    {
        return "Student";
    }
}

class Person
{
    private String getInfo()
    {
        return "Person";
    }

    public void printPerson()
    {
        System.out.println(getInfo());
    }
}

これに対する出力は次のとおりです。

Person
Person

2 行目が Student ではないのはなぜですか? 親getInfo()は非公開ですが、それは の 2 番目の呼び出しがprintPerson()getInfo()(公開されている) を見つけられないことを意味しますか? getInfo()子メソッドはprivateを継承できないのでオーバーライドは起こらないと思います。

4

3 に答える 3

3

親の getInfo() はプライベートですが、それは printPerson() の 2 番目の呼び出しが子の getInfo() (パブリック) を見つけられないことを意味しますか?

はい。サブクラスのgetInfo()メソッドは、スーパークラスのメソッドをオーバーライドしていません。これは、論理的に認識していないためです。プライベート メソッドはオーバーライドできません。

JLS のセクション 8.4.8.1から:

クラス C で宣言されたインスタンス メソッド m1 は、次のすべてが当てはまる場合、クラス A で宣言された別のインスタンス メソッド m2 をオーバーライドします。

  • C は A のサブクラスです。
  • m1 の署名は、m2 の署名のサブ署名 (§8.4.2) です。
  • また:
    • m2 が public、protected、または C と同じパッケージでデフォルト アクセスで宣言されている、または
    • m1 は、m3 が m2 をオーバーライドするように、メソッド m3 (m1 とは異なる m3、m2 とは異なる m3) をオーバーライドします。

最初のサブブレットに注意してください-あなたの場合、m2isPerson.getInfoであり、それ同じパッケージ内のデフォルトアクセスで公開、保護、または宣言されていないため、サブブレットは適用されません。他のサブブレットも適用されないため、オーバーライドのすべての要件を満たしているわけではありません。

スーパークラスのメソッドをオーバーライドしようとしている場合は、アノテーションを使用する必要があり@Overrideます。そうすれば、何か間違ったことをしている場合、実行時に予期しない動作が発生するのではなく、コンパイル時にエラーが発生します。

于 2013-09-16T06:12:52.180 に答える
0

このgetInfoメソッドはStudentクラスによってオーバーライドされないため、printPerson への呼び出しが getInfo に送られると、ローカルの getInfo メソッドが実行されます。

于 2013-09-16T06:19:49.907 に答える
0

メソッドが子クラスによってオーバーライドされることを意図している場合、そのメソッドは子クラスから見える必要があります。

getInfo()つまり、メソッドをプライベートではなくプロテクトとして宣言する必要があります。

于 2013-09-16T06:14:27.920 に答える