継承の仕組み
最上位クラス:java.lang.Object
import com.makotojava.intro;
public Person {
publicstatic final String STATE_DELIMITER = "-";
public Person {
//Default constructor
}
public enum Gender {
MALE,
FEMALE,
UNKNOWN
}
public Person (String name, int age, int height, int weight, String EyeColor, Gender gender) {
this.name = name;
this.age = age;
this.height = height;
this weight = weight;
this.eyeColor = eyeColor;
this.gender = gender;
}
private String name;
private int age;
private int height;
private String eyeColor;
private Gender gender;
}
Personクラスは、暗黙的にObjectクラスを継承する。Personクラスは、Objectクラスのpublicおよびprotectedとして指定されたすべての変数とメソドを使用することができる。
クラス階層の定義
import com.makotojava.intro;
public class Employee extends Person {
private String taxpayerIdentificationNumber;
private String employeeNumber;
private BigDecimal salary;
//...
}
Employeeクラスは、PersonおよびObjectクラスのpublicおよびprrotectedとして指定された変数およびメソドにアクセスできる。
また、Personのprivateとして指定された変数およびメソドにアクセス可能である。
Employeeを継承するサブクラスを宣言できる。
public class Manager extends Employee {
//...
}
単一継承と多重継承
単一継承:Javaは、単一のクラスのみを継承する
多重継承:C++では、複数のクラスを継承することができる。
Javaは、単一継承であるが、複数のInterfaceを実装できる。
コンストラクターと継承
コンストラクターは継承できず、明示的に、クラス毎に実装することが必要である。
コンストラクターの基本
public class Person {
public Person() {
// ディフィルトコンストラクター
}
}
デフォルトコンストラクターは省略可能である。
スーパークラスコンストラクターの呼び出し
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name.name;
}
}
public class Employee Extends Person {
public Employee(String name) {
super(name);
}
}
コンストラクターの宣言
public class Person {
public Person() {
}
}
public class Employee extends Person {
Public Employee() {
[super();]
}
}
[]:省略可能な意
代替コンストラクター
代替コンストラクターを指定する場合、ディフォルトコンストラクターの指定は必須である
public class Person {
private String name;
public Person() { //ディフォルトコンストラクター
}
public Person(String Name) { //代替コンストラクター
this name = name;
}
}
あるコンストラクターから別のコンストラクターの呼び出し
this(arg)を使用する
public class Person {
private String Name;
public Person() {
this("Some Reasonable Default?");
}
public Person(String name) {
this.name = name;
}
}
コンストラクターのアクセスレベル
継承と抽象化
抽象化とは継承階層内でデータと動作を現在のクラスよりも上位のタイプに一般化することを意味する。
抽象クラスと抽象メソド
抽象化クラスの使用
public abstract class Employee extends Person {
// etc.
}
public void someMethodSomewhere() {
Employee p = new Employee(); // compile error!!
}
抽象化の力
public abstract class Employee extends Person {
public abstract boolean validate();
}
public class Manager extends Employee {
} // compile error without validate method
抽象化するべき(するべきでない)2つの規則
クラスの代入
Manager m = new Manager();
Employee e = new eEmployee();
Person p = m; // OK
Employee e2 = e; // OK
e = m; //OK
e2 = p; // wrong!!
Manager m = new Manager();
Manager m2 = new Manager();
m = m2; // OK
Person p = m; // OK
Employee e = m; //Ok
Employee e = p; //wrong!!