Java no memo

自分のためのJavaメモ。

クラスの継承

継承すると親クラスのフィールドとメソッドが使える。

例1:子クラスにフィールド(name)の記述はないが、子クラスで使える。
// Oya.java
public class Oya {
  public String name;
}
// Ko.java
public class Ko extends Oya{

}
// Test.java
public class Test {
  public static void main(String[] args) {
    Ko k = new Ko();
    System.out.println(k.name); // null
  }
}
例2:子クラスにコンストラクタはないが裏ではある。
// Oya.java
public class Oya {
  Oya(){
    System.out.print("Oya");
  }
}
// Ko.java
public class Ko extends Oya{

}
// Test.java
public class Test {
  public static void main(String[] args) {
    Ko k = new Ko(); // Oyaと表示
  }
}

書いてないが Ko(){super();} がある。

例3:親に引数有りコンストラクタがなくても、子には引数有りコンストラクタを作れる。
// Oya.java
public class Oya {
  public String name;
}
// Ko.java
public class Ko extends Oya{
  Ko(String name){
    super.name = name;
    //もしくは this.name = name;
  }
}
// Test.java
public class Test {
  public static void main(String[] args) {
    Ko k = new Ko("Mike");
    System.out.println(k.name); //Mikeと表示
  }
}
例4:親に引数なしコンストラクタの記述がなく、引数ありコンストラクタがある場合、子には引数ありコンストラクタが必要。
// Oya.java
public class Oya {
  String name;
  Oya(String name){
    System.out.print("Oya");
  }
}
// Ko.java
public class Ko extends Oya{

}

上記はエラー。 子クラスに Ko(String name){ super(name); } の追記が必要。

例5:親と子に同じ名前のインスタンス変数がある場合は注意。
// Oya.java
public class Oya {
  public String name;
}
// Ko.java
public class Ko extends Oya{
  public String name;
  Ko(){
    super.name = "Oya Mike";
    this.name = "Ko Cate";
  }
}
// Test.java
public class Test {
  public static void main(String[] args) {
    Oya o = new Ko();           
    System.out.println(o.name); // Oya Mike と表示
    Ko k = new Ko();
    System.out.println(k.name); // Ko Cate と表示  
  }
}
  • 親のフィールドに入れる場合は super. と記述。
  • 子のフィールドに入れる場合は this. と記述。
  • 親の型に入れた子の場合は親のフィールドに値が入る
  • 子の型に入れた子の場合は子のフィールドに値が入る。