がオーバーライドされたメソッドgetName()
、視界がprivate
オーバーライドメソッドと変数 - コードに続いて一貫性のない振る舞い
に変更されたときにこれは理解するが、妙にオーバーライドされた変数は、エラーを生成しないで時エラーをコンパイル生成します。
class Base {
public String getName() {
return "Base";
}
public String className = "Base";
}
class Derived extends Base {
private String getName() { //Not compiling
return "derived";
}
private String className = "Derived"; //Compiling successfully
}
public class Test{
public static void main(String[] args) {
System.out.println((new Derived()).className);// Gives compilation error
}
なぜこのようなことが起こっているのか理解できますか?
我々はmain()
コンパイルでプライベート変数にアクセスしようとしている間は、失敗したが、私はプライベートにパブリックからアクセスタイプを減少するとき、それは自己方法でそれはそれは同様が失敗している必要があります正常にコンパイル。
メソッドをオーバーライドして、シグネチャ修飾子を変更することはできません。 – matoni
@matoni、もちろん可能です。たとえば 'public'>' private'ではなく、 – rorschach
@matoni Liskov Substitutionの原則では、アクセス修飾子を基本クラスよりも非公開にするのは間違っています。しかし、必要に応じて、サブクラスでもっと公にすることができます。 – Matthias