私のような質問が見つからなかったので、重複していないことを願っています。
繰り返しますが、オーバーライドと非表示についてです。と思いますが、間違っているかもしれませんが、どちらも理解できました。
次のコードは期待どおりに動作します。両方のメソッドが非表示になっています。method1 はプライベート メソッドであり、プライベート メソッドは非表示にしかオーバーライドできないため、method2 は静的であり、静的メソッドはオーバーライドできないため、非表示にしかできないためです。
public class Child extends Parent {
public void method1(){System.out.println("child");}
public static void method2(){ System.out.println("static child");}
}
class Parent{
private void method1(){ System.out.println("parent");}
public static void method2(){ System.out.println("static parent");}
public static void main(String[] args){
Parent p = new Child();
p.method1(); //prints out "parent"
p.method2(); //prints out "static parent"
}
}
仕様を読むと、次のように書かれています。
http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.3.3
サブクラスがメソッドをオーバーライドまたは非表示にしないように、メソッドを final として宣言できます。
Parent クラスの method1 を「final」に変更すると
private final void method1(){ System.out.println("parent");}
すべて正常に動作します。edit start: final メソッドを非表示にできないというコンパイラ エラーが発生することを予期していましたが、そうはなりませんでした。:編集終了
質問 1: 静的メソッドのみを非表示にできるということですか? 私が読んでいる本 (OCA 学習ガイド、Jeanne Boyarsky と Scott Selikoff の 252 ページ) では、私的な方法が隠されていると明確に述べています。
次に、Parent クラスの method2 を次のように変更しました。
public final static void method2(){ System.out.println("static parent");}
現在、コンパイラは文句を言いますが、「子は method2() をオーバーライドできません」というエラーが表示されます。これは、メソッドを隠そうとしたと思ったため、かなり混乱しています。
質問 2: 「子は method2() を非表示にできない」ではないでしょうか?
編集開始:ここではオーバーライドが行われないことをよく知っていますが、前述の仕様が指摘しているように:修飾子 final はメソッドがオーバーライドまたは非表示になるのを防ぎます。そのため、タイトルに入れました。:編集終了