标签:重写 name 举例 erro 简单的 一般来说 super 现在 答案
看到网上有人问一个关于继承问题:刚学到继承这里,被super难住了。
在网上查资料,super代表父类对象的引用,但是 子类生成对象时 只是调用了父类的构造方法,并未生成父类对象,那么此时
super为什么能调用父类的方法,设定改方法被子类重写。
super既然调用了父类的方法,说明super就是父类对象的引用,但是又没生成父类的对象,那么此时super是怎么调用父类方法的?希望大家帮我分析下这个问题,谢谢。
以下是我的回答:
假设你是一个设计房子图纸的人。
你原本设计的房子(房子设计1)只有一个房间(房间1),
后来,你又在房子设计1的基础上设计了“房子设计2”
除了房间1,你又另设计了一个房间(房间2),
于是现在这个房子设计2有两个房间了。
(但房子设计2图纸中只说明房间1的设计请参考房子设计1图纸,没有在房子设计2图纸中体现)
现在,你将房子设计2图纸交给×××开发商,
×××开发商依房子设计2图纸盖了一个房子(对象实例)。
上面的文字用代码来表现是类似这样子的:
class HouseDesign1 {
private Room1 room1 = new Room1();
protected void enterRoom1(){}
}
class HouseDesign2 extend HouseDesign1 {
private Room2 room2 = new Room2();
protected void enterRoom2(){}
}
HouseDesign2 house = new HouseDesign2();
这样,就有了house对象实例。
一般来说,在软件领域,所谓对象实例是由new ClassName()或Class.newInstance()出来的,
因此LZ问的到底有没有生成父类对象,
就要看上面的例子中有没有new HouseDesign1()?
我想答案很明显了吧,没有!
虽然house中既有room2也有room1,
但都是HouseDesign2的对象实例,
没有HouseDesign1的对象实例。
LZ的问题“没生成父类的对象,那么此时super是怎么调用父类方法的?”
简单的说就是,子类实例中已包含了父类的一切(即room1)。
在house,room1是子类(HouseDesign2)实例中的(虽然是在父类图纸中设计的)。
标签:重写 name 举例 erro 简单的 一般来说 super 现在 答案
原文地址:http://blog.51cto.com/oldycat/2308190