理解继承

这个例子涉及到继承与多态的知识,先看看这个例子的输出是否是你的预期。
class Parent {}
class Son extends Parent {}

class Sub1 {
public void fn(Parent P) {System.out.println("Sub1");}
}
class Sub2 extends Sub1 {
public void fn(Son s) {System.out.println("Sub2");}
}
class Sub3 extends Sub2 {
public void fn(Parent p) {System.out.println("Sub3");}
}

public class MyTest {

public static void main(String[] string) {
Son s = new Son();
Parent p = s;

Sub1 sub1 = new Sub1();
sub1.fn(p); //Sub1
sub1.fn(s); //Sub1
sub1 = new Sub2();
sub1.fn(p); //Sub1
sub1.fn(s); //Sub1
sub1 = new Sub3();
sub1.fn(p); //Sub3
sub1.fn(s); //Sub3

Sub2 sub2 = new Sub2();
sub2.fn(p); //Sub1
sub2.fn(s); //Sub2
sub2 = new Sub3();
sub2.fn(p); //Sub3
sub2.fn(s); //Sub2

Sub3 sub3 = new Sub3();
sub3.fn(p); //Sub3
sub3.fn(s); //Sub2
}
}
如果是你预计的结果,那你对继承理解很透彻,可以不需要看下面的分析了。

分析:
继承后,各类的方法如下
class Sub1 {
public void fn(Parent P) {System.out.println("Sub1");}
}
class Sub2 {
public void fn(Parent P) {System.out.println("Sub1");}
public void fn(Son s) {System.out.println("Sub2");}
}
class Sub3 {
public void fn(Parent p) {System.out.println("Sub3");}
public void fn(Son s) {System.out.println("Sub2");}
}
Sub1 sub1 = new Sub2();后,sub1只有fn(Parent P)方法,所以把Son对象作为参数就会强制转换为父类Parent。
Sub1 sub1 = new Sub3();后,Sub3类重写了Sub1的fn(Parent p)方法,所以执行的是Sub3的fn(Parent p)方法。
Sub2 sub2 = new Sub3();后,sub2对象除了有Sub3从Sub2继承过来的fn(Son s)方法,还有Sub3重写了Sub2从Sub1继承过来的fn(Parent p)方法,所以用Son作参数会执行Sub2类的fn(Son s)方法;用Parent作参数会执行Sub3类的fn(Parent p)方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值