はじめに
JavaSilver:継承とポリモーフィズムの問題
ポリモーフィズムについて、
継承関係にある2つのクラス内に同名のフィールド・メソッドがあった場合、
どちらが優先されるのか分からなくなったのでまとめる
*「継承関係にある2つのクラス内に同名のフィールド・メソッドがあった場合」というのは、以下のコードのようなものである*
public class A{
String val = "A";
public void sample(){
System.out.print(val);
}
}
public class B extends A{
String val = "B";
public void sample(){
System.out.print(val);
}
}
結論
- フィールドを参照した場合
- ->変数の型で宣言されたものが優先
- メソッドを参照した場合
- ->オーバーライドされたものがあるならそちらを優先
- ->なければスーパークラスのものを優先
- (スーパークラスにそのメソッドがなければコンパイルエラー)
具体例
public class A{
String val = "A";
public void sample(){
System.out.print(val);
}
}
public class B extends A{
String val = "B";
public void sample(){
System.out.print(val);
}
}
public class Main{
public static void main(String[] args){
A a = new A();
A b = new B(); //B型インスタンスをA型に代入
System.out.print(a.val);
System.out.print(b.val);
a.sample();
b.sample();
}
}
出力結果
AAAB
ちなみに、ポリモーフィズムでない継承関係については、
もちろんサブクラスの方が優先される
class A{
String val = "A";
public void sample(){
System.out.print(val);
}
}
class B extends A{
String val = "B";
public void sample(){
System.out.print(val);
}
}
public class Main{
public static void main(String[] args){
B c = new B();
System.out.print(c.val);
c.sample();
}
}
出力結果
BB
おわりに
こちらのQ&Aが個人的にドンピシャだったので載せておきます