0
0

More than 1 year has passed since last update.

JavaSilver_SE11(黒本の改造問題)

Last updated at Posted at 2022-07-17

黒本のP234_第7章_13の問題をIDEで書き写しながら
少しコードを変更したりして理解を深めていた所「へぇー」となったのでメモ

先に言っておくと以下に記載するようなコードはわざわざ書かないと思います。

「へぇー」となったこと

  1. 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()が実装されたってだけ
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0