JAvaで親参照が子オブジェクトを指す場合
継承や書き換えにはおなじみのようですが、今回は
主に、親クラスの参照がオブジェクトを指す場合、親クラスではなく子クラスのメソッドが呼び出されることを確認します.
スタックメモリにオブジェクトが存在するメモリアドレスを参照します.本物のオブジェクト(new Studio()で作成された)は、スタックメモリに格納されます.
このスタックメモリ領域には、サブクラスのプロパティ(独自のプロパティを含む)が存在し、super()構築メソッドで親から取得されます.
親として宣言された参照であるにもかかわらず、親を継承するが上書きされていないメソッドと、親を上書きするメソッドと独自のメソッドです.
ただし、サブクラスを指すオブジェクトは、メソッドを実行するときに、参照が指すスタックメモリ領域内で実行されます.つまり親の実行
メソッドかサブクラスメソッドかはオブジェクトによって決定され、参照とは直接関係ありません.
デモコードは次のとおりです.
Person.java
Student.java
Test.java
出力結果:
I'm a Student object and my name is ^-^
主に、親クラスの参照がオブジェクトを指す場合、親クラスではなく子クラスのメソッドが呼び出されることを確認します.
スタックメモリにオブジェクトが存在するメモリアドレスを参照します.本物のオブジェクト(new Studio()で作成された)は、スタックメモリに格納されます.
このスタックメモリ領域には、サブクラスのプロパティ(独自のプロパティを含む)が存在し、super()構築メソッドで親から取得されます.
親として宣言された参照であるにもかかわらず、親を継承するが上書きされていないメソッドと、親を上書きするメソッドと独自のメソッドです.
ただし、サブクラスを指すオブジェクトは、メソッドを実行するときに、参照が指すスタックメモリ領域内で実行されます.つまり親の実行
メソッドかサブクラスメソッドかはオブジェクトによって決定され、参照とは直接関係ありません.
デモコードは次のとおりです.
Person.java
public class Person{
private String name;
public Person(){}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void introduce(){
System.out.println("Hello, I'm a Person object, and my name is "
+getName());
}
}
Student.java
public class Student extends Person{
public Student(){
super();
}
public void introduce(){
System.out.println("I'm a Student object and my name is "
+getName());
}
}
Test.java
public class Test{
public static void main(String[] args){
Person p = new Student();
p.setName("^-^");
p.introduce();
}
}
出力結果:
I'm a Student object and my name is ^-^