【Java学習】08 interface [Java SE 11 Silver 紫本]

これまでいくつかJavaコードを書いてきましたが、interfaceは全くの初見でした。

本にはサンプルコードがなかったのでネットから適当に探してきました。

下記サンプルコードではinterfaceを使うメリットがよく分かりません。interfaceを使わない方がスッキリ書けます。開発者が初期値をinterfaceで設定しプログラマがそれに従ってコードを作成するというイメージで覚えることにしました。

以下2つのコードの内容は同じ
--------------------------------------------------
interface Calc {
    int NUM1 = 10;
    int NUM2 = 50;
 
    void calc();
}

class Add implements Calc {
    public void calc() {
        System.out.println(NUM1 + NUM2);
    }
}
 
class Sub implements Calc {
    public void calc() {
        System.out.println(NUM1 - NUM2);
    }
}
 
public class Main {
    public static void main(String[] args) {
        Add add = new Add();
        add.calc();
 
        Sub sub = new Sub();
        sub.calc();
    }
}
--------------------------------------------------
class Calc {
    int NUM1 = 10;
    int NUM2 = 50;
    public void add() {
        System.out.println(NUM1 + NUM2);
    }
    public void sub() {
        System.out.println(NUM1 - NUM2);
    }
}
 
public class Main {
    public static void main(String[] args) {
        Calc cal = new Calc();
        cal.add();
        cal.sub();
    }
}
--------------------------------------------------
出力
--------------------------------------------------
60
-40

【Java学習】07 抽象クラス abstract [Java SE 11 Silver 紫本]

abstractの役割が今一つピンときませんでしたが、具象クラスであるサブクラスを作成する際にオーバーライドを強制する、つまり開発者が設定した抽象クラスをプログラマがサブクラス作成時に必ず記述しなければならない、という説明で理解できました。

全てではないでしょうが開発者の意図通りにコーディングさせる手段の一つという解釈でそんなに外していない様です。

abstract class X {                // 抽象クラス
  protected abstract void methodA();     
}
abstract class Y extends X { }    // 抽象クラス
class Z extends Y {               // 具象クラス
  protected void methodA() { }    // 具象クラスではオーバーライドは必須
}

【Java学習】06 thisとsuper [Java SE 11 Silver 紫本]

サブクラス実行の際はsuperクラスのコンストラクタはかならず実行されますが、特に明示しない限り引数なしのコンストラクタが呼び出されます。

以下のコードは動作確認のためだけに作成されたものです。意味は分かりますが実用に寄与しない内容でもやもやします。

class SuperA {
  public SuperA() { System.out.println("SuperA()"); }
  public SuperA(int a) { System.out.println("SuperA(int a)"); }
}
class SubA extends SuperA {
  public SubA() { System.out.println("SubA()"); }
  public SubA(int a) { 
    super(a); // 引数付きコンストラクタを呼び出すのに必要な記述
    System.out.println("SubA(int a)"); }
}
public class Main {
  public static void main(String[] args) {
    SubA obj1 = new SubA();
    SubA obj2 = new SubA(10);
  }
}
--------------------------------------------------

出力
--------------------------------------------------
SuperA()
SubA()
SuperA(int a)
SubA(int a)

【Java学習】05 Overrideアノテーション [Java SE 11 Silver 紫本]

サブクラスにおいて同じメソッド名で異なる機能にする場合はオーバーライドのルールに従います。`@Overrideを記述するとメソッド名が違っていないかチェックしてくれます。

オーバーライドを多用するとロクなことにならない様な気がするのですが、大規模開発では必要な機能なのでしょうか。

class SuperA { 
  public void print(String s) {
    System.out.println("SuperA print : " + s);
  }
  public void method() { }
}
class SubA extends SuperA { 
  @Override
  public void Print(String s) { // printがPrintになっているのでコンパイルエラーになります
    s = "渡された文字列は " + s + " です";
    System.out.println("SubA print   : " + s);
  }
}
public class Main {
  public static void main(String[] args) {
    SuperA obj1 = new SuperA();
    obj1.print("Java");
    SubA obj2 = new SubA();
    obj2.print("Java");
  }
}
--------------------------------------------------

出力
--------------------------------------------------
Main.java:8: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません

【Java学習】04 継承 [Java SE 11 Silver 紫本]

extendsがないクラスは全てjava.lang.Objectクラスのサブクラスです。

以下のコードではObjectクラスのメソッドを使っています。

class Member extends Object{
  private String id = "1000";
  public String getId() {
    return id;
  }
}
class Sales extends Member {
  private String clientName = "ABC";
  public String getClientName() {
    return clientName;
  }
}
public class Main {
  public static void main(String[] args) {
    Sales s = new Sales();
    System.out.println("clientName : " + s.getClientName());
    System.out.println("id         : " + s.getId());
    System.out.println("String : " + s.toString()); // ObjectクラスのtoStringメソッド
    System.out.println("hashCode : " + s.hashCode()); // ObjectクラスのhashCodeメソッド
  }
}
--------------------------------------------------

出力
--------------------------------------------------
clientName : ABC
id         : 1000
String : Sales@6b95977
hashCode : 112810359