JavaのInheritanceについて
概要
Inheritanceとは、オブジェクト指向プログラミングにおける「継承」のことである。あるクラスが別のクラスから属性やメソッドを取得できる概念である。継承について、理解すべきポイントを以下に記載する。
詳細
継承は、一般的なものから具体的なものへの階層を形成するために使用する。例えば、親クラスから子クラスへ継承するイメージ。親クラスは「Vehicle(移動物体)」で子クラスが「Car(自動車)」であれば、親クラスから子クラスに対して、Speed(速さ)やfee(運賃)といった、基本的な概念を移行する。また、この関係は、親から子に対して一方的にデータ継承するイメージで、親は子の派生した内容を知ることはできない。
ハンズオン
今回のハンズオンでは、Person、Student、StudentEmployee、PersonTesterという4つのファイルを作成する。継承の流れは以下の通り。
- Person → Student → StudentEmployee
StudentはPersonのみ、StudentEmployeeはPersonとStudentから継承する。それらについて、PersonTesterで動作確認を行う。
Person
こちらでは、firstNameとlastNameという二つの値を定義する。
public class Person {
private String firstName;
private String lasName;
定義した値について、コンストラクタを作成することで、その後呼び出せるようにする。こうするとこで、「Person john = new Person("Taro", "Tanaka");」としたときに、「System.out.println(john);」で出力表示できる。
public Person(String firstName, String lasName) {
super();
this.firstName = firstName;
this.lasName = lasName;
}
次にGetterとSetterを設定する。こちらは、以下記事を参照してほしい。簡単にいうと、GetterでfirstNameとlastNameの値を取得できるし、Setterでそれらの値を変更できる。
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLasName() {
return lasName;
}
public void setLasName(String lasName) {
this.lasName = lasName;
}
最後に、どういう値を返すか、toString()でreturnする値を設定する。
@Override
public String toString() {
return "Name:" + firstName + " " + lasName;
}
}
Student
次に、studentの解説をする。最初に、Personから継承するために、以下コードを設定する。
public class Student extends Person {
こうすることで、Personから値を継承できる。次に、student独自のstudentIdを設定する。Personのfirstnameとlastname同様に、コンストラクタ、Getter / Setterを作成する。
private String studentId;
public Student(String firstName, String lasName, String studentId) {
super(firstName, lasName);
this.studentId = studentId;
}
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
最後に、returnの出力値を設定する。この場合、superでPersonクラスの「return "Name:" + firstName + " " + lasName;」という部分が継承される。そのため、以下のような設定をすると、「Name:Mike Thompson studnent ID 12345」と出力される。
Student mike = new Student( "Mike", "Thompson", "12345");
System.out.println(mike);
ちなみに、returnでsuper.toString()だとfirstnameとlastnameの両方が出力されるが、firstnameのみ出力したい場合は、「return "First name: " + getFirstName() + " student ID " + studentId;」とすれば良い。
@Override
public String toString() {
return super.toString() + " student ID " + studentId;
}
}
StudentEmployee
ここでは、PersonとStudentの両方から継承することになる。両方から継承するためには、単純にPersonを継承しているStudentを継承すればいい。その上で、StudentEmployy独自のemployeeIdとrateOfPayPerHourを設定する。
public class StudentEmployee extends Student {
private String employeeId;
private double rateOfPayPerHour;
これらについてコンストラクタを設定する場合は、継承している値全てをstringとして保管する。
public StudentEmployee(String firstName, String lasName, String studentId, String employeeId, double rateOfPayPerHour) {
そして、それらをsuperで継承する。ちなみに、superで特定の値のみ取得はできない。例えば、firstNameは取得するけど、lastNameは取得しないとか。基本的には、PersonもしくはStudent全ての値を取得する。
super(firstName, lasName, studentId);
this.employeeId = employeeId;
this.rateOfPayPerHour = rateOfPayPerHour;
}
そして、これらについて、GetterとSetterを設定する。
public String getEmployeeId() {
return employeeId;
}
public void setEmployeeId(String employeeId) {
this.employeeId = employeeId;
}
public double getRateOfPayPerHour() {
return rateOfPayPerHour;
}
public void setRateOfPayPerHour(double rateOfPayPerHour) {
this.rateOfPayPerHour = rateOfPayPerHour;
}
最後に、returnで返す値を設定する。
@Override
public String toString() {
return super.toString() + " employee ID " + employeeId + " pay " + rateOfPayPerHour;
}
}
PersonTester
最後に、PersonTesterで以下のようにテストして、正しく値が出力されればOKである。
public class PersonTester {
public static void main(String[] args) {
Person sally = new Person("Sally", "Phillips");
System.out.println(sally);
Student mike = new Student("Mike", "Thompson", "12345");
System.out.println(mike);
StudentEmployee jeff = new StudentEmployee("Jeff", "Sam", "4567", "#12345", 20.5);
System.out.println(jeff);
}
}
Discussion