継承とは「クラスの共通部分を別クラスにまとめる仕組み」。共通部分とは、具体的には共通なメソッドとインスタンス変数を指す。この継承の仕組みにより、スーパークラスの定義場所をサブクラスでそのまま利用できる。
しかし同じ継承される情報と言っても、メモリ配置の観点からするとメソッドとインスタンス変数では全く異なる場所に配置される。
class Employee extends Person {
private int employeeNum
public void setEmployeeNum(int empNum) { /* ロジックは省略 */}
public int getEmployeeNum() { /* ロジックが省略 */}
}
EmployeeクラスはPersonクラスを継承しているので、Personクラスに定義されたメソッドとインスタンス変数をそのまま利用できる。
この時のメモリ配置を整理すると以下のようになる。
配置場所 | |
---|---|
スーパークラスに定義されたメソッド | スーパークラスのメソッドテーブルに定義。 |
継承されたメソッド | サブクラスのメソッドデーブルに格納されるが、実際のコード情報はスーパークラスのものを使い回す。サブクラスでは継承されたメソッドのコード情報はサブクラスでメモリに展開はせずに、スーパークラスの情報を利用する。 |
インスタンス変数 | 親クラスから継承されたインスタンス変数は各インスタンスにコピーされる。しかし、実際の値はインスタンスごとに異なる。 |
▼参考