黒本のP234_第7章_13の問題をIDEで書き写しながら
少しコードを変更したりして理解を深めていた所「へぇー」となったのでメモ
先に言っておくと以下に記載するようなコードはわざわざ書かないと思います。
「へぇー」となったこと
- interfaceにprivateであればdefaultメソッドじゃない具象メソッドが定義することができる。
検証コード
// ① Workerインターフェース
public interface Worker {
private void work(){
System.out.println("Workerのwork");
};
default void callWork(){
work();
};
}
// ② Employeeクラス
public class Employee {
public void work(){
System.out.println("Employeeのwork");
}
}
// ③ Engineerクラス(①と②をそれぞれ継承、実現しているクラス)
public class Engineer extends Employee implements Worker{}
// ④ Mainクラス(上記クラスのプロセッサー)
public class Main {
public static void main(String[] args) {
Worker worker = new Engineer();
worker.callWork();
}
}
出力結果
Workerのwork
つまり上記検証コードでは② Employeeクラスは一切使われていません。笑
「Employeeのwork」を出力したい場合は以下のどちらかで呼び出せる
その1
// ① Workerインターフェース
public interface Worker {
private void work(){
System.out.println("Workerのwork");
};
default void callWork(){
work();
};
}
// ② Employeeクラス
public class Employee {
public void work(){
System.out.println("Employeeのwork");
}
// 以下のメソッドを追加(検証コードとの差分部分はここのみ!!)
public void callWork(){
work();
}
}
// ③ Engineerクラス(①と②をそれぞれ継承、実現しているクラス)
public class Engineer extends Employee implements Worker{}
// ④ Mainクラス(上記クラスのプロセッサー)
public class Main {
public static void main(String[] args) {
Worker worker = new Engineer();
worker.callWork();
}
}
その2
// ① Workerインターフェース
public interface Worker {
void work(); // 抽象メソッドとしてい定義のみしておく(検証コードとの差分部分はここのみ!!)
default void callWork(){
work();
};
}
// ② Employeeクラス
public class Employee {
public void work(){
System.out.println("Employeeのwork");
}
}
// ③ Engineerクラス(①と②をそれぞれ継承、実現しているクラス)
public class Engineer extends Employee implements Worker{}
// ④ Mainクラス(上記クラスのプロセッサー)
public class Main {
public static void main(String[] args) {
Worker worker = new Engineer();
worker.callWork();
}
}
その1とその2の出力結果
Employeeのwork
黒本読めば分かる話ですがまとめると
- その1のコードは同名のメソッド名の場合defaultじゃない方が強いってだけ
- その2のコードはEmployeeのwork()でWorkerの抽象メソッドwork()が実装されたってだけ