java中多态的内存图解_图解Java多态内存分配以及多态中成员方法的特点

小的总结:

再来看这条语句:Person worker = new Worker(): 多态,父类引用指向子类对象。

跟这句代码的作用是一样的,Worker w = new Worker(); Person worker = w; 就是子类的引用传给父类类型的引用。向上转型,都指向一个实例对象(子类)。

1:为什么可以将子类实例对象的引用传给父类类型引用呢?

答:多态的体现,鸽子是鸟类,鹦鹉是鸟类,喜鹊是鸟类,它们都是鸟类,这就是鸟类的多种表现形态(多态),它们有鸟类的基本特征与行为,并且还有自己特有的行为,那就会把鸟类的基本特征与行为继承过来给自己。extends关键字声明了他们的关系。

程序中这句话 鸟类 xx鸟 = new 鸽子();就创建了一个鸟类的引用,它是鸽子。

类的概念是抽象的,所以它就仅仅是个引用,只有引用到实例对象,它才真正实现了自己。

2:父与子的关系会怎样呢?

由于Worker类继承自Person类,所以会先加载Person类并初始化成员变量在Worker类实例对象中。这就是子类继承过来的成员变量。

如果子类中定义了与父类相同的成员变量,变量不会存在重写,子类实例对象中会有两份相同名称的实例变量,调用时,父类的会被隐藏。

如果想调用父类被隐藏的成员变量,那就要使用super关键字。

同样,子类会继承父类的成员方法作为自己的成员方法,如果子类定义了与父类相同的成员方法(重写),多态中会调用子类自己的成员方法。

3:多态,又有什么好处呢?跟这样写(Worker worker = new Worker();)有什么区别,不一样继承父类的属性方法吗?

首先明确: Worker worker = new Worker();这样写仅仅是继承关系。不存在多态特性。

Person worker = new Worker(); 这样写就展示了多态的关系,鸽子是鸟类的一种表现形态。

有啥好处?一句话概括:提高了程序的扩展性,表现在什么地方呢?比如:

现在有个工厂,能解析鸟类的语言,鸽子是鸟类吧?Ok,那建一个工厂,让鸽子说。

public static void doWork(Dove dove) {

String sound = dove.say(); // ... 拿到鸽子说的话

}

鹦鹉是鸟类吧?Ok,那建一个工厂,让鹦鹉说。

public static void doWork(Parrot parrot) {

String sound = parrot.say(); // ... 拿到鹦鹉说的话

}

如果还有一千个鸟类要说话,那我岂不得建一千座工厂?。。。累不累?那既然都是鸟类,我建一个鸟类的工厂不就行了嘛?

public static void doWork(Bird bird) {

String sound = bird.say(); // ... 拿到xx鸟说的话。。。

}

这时候,无论你什么鸟进来,我都让你说话,而且说得都是你自己的话,因为你继承我并重写了你的功能。

-----------------------------------------------------------------------------------------------------------------

Worker w = (Worker)worker; // 向下转型。目的,为了调用子类非继承父类、自己特有的方法。

因为多态有个弊端,只能使用父类的引用访问父类的成员。所以向下转型是为了访问子类自己的成员。

首先,worker引用指向的实例对象本来就是子类类型的。所以赋值给子类类型引用变量非常可以。

然后现在用子类类型的引用就可以访问自己的成员方法了啦啦啦。

本文转载自:http://blog.csdn.net/thinking_in_android/article/details/8888286

相关链接:

22/2<12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值