【发布时间】:2017-10-11 23:27:26
【问题描述】:
有什么区别
A a1 = new A();
A a2 = new B();
B 延伸 A
如果我执行以下操作会发生什么
a1 = new B();
谢谢。
【问题讨论】:
-
如果您想知道发生了什么,请尝试使用日志/打印语句编写一些简单的测试并执行。此外,您需要阅读作为 OOP 基本原则的继承和多态性。
有什么区别
A a1 = new A();
A a2 = new B();
B 延伸 A
如果我执行以下操作会发生什么
a1 = new B();
谢谢。
【问题讨论】:
取第一行A a1 = new A();,A a1是对A类型对象的引用,A()是对创建A的新实例的构造函数的调用。
如果 B 类是 A 的子类,那么你可以写 a1 = new B();,因为 a1 是对 A 类型对象的引用,并且新的 B 将具有履行作为 A 的“契约”所需的所有方法。但是,您将无法直接调用特定于 B 的任何内容,因为引用属于 A 类型。
顺便说一句,以上是该主题的超级简要纲要,我建议您阅读某种教程。
编辑:这是一个类比/示例:(FerrariWithSunRoof 扩展 Ferrari)
Ferrari A = new Ferrari();
Ferrari B = new FerrariWithSunRoof();
您不能调用 B.openSunroof(),因为 B 被引用为 Ferrari,因此该引用没有天窗的概念(即使实际实例有天窗)。为此,您必须将其引用为 FerrariWithSunRoof,即:
FerrariWithSunRoof B = new FerrariWithSunRoof();
【讨论】:
您可以将使用 A 或 B 类的对象更改为对象 a1 或 b1。问题是当您尝试使用 B 类中的新方法而不是 A 类中不存在的方法时。
Class A Class B
.move() ( .move() ) inheritance
.walk() ( .walk() ) inheritance
.run() ( .run() ) inheritance
.jump()
.dance()
if you have an object like a1= new B() or a1=new A();
it works good for them both:
a1.move()
a1.run()
but this works just a1= new B()
a1.jump()
【讨论】:
首先我推荐你read on OOP inheritance and interfaces。
现在进入问题。 A a1 = new A(); 调用为A 定义的构造函数,生成一个A 类型的新对象,它在内存中具有自己的引用。
A a2 = new B(); 将使用新的引用创建 B 类型的新对象 a2,就像 a1 但是,因为您将 a2 定义为 A 类型和 B 扩展 A , a2 将只能访问在 A 中定义的方法,而无需进行显式转换。
a1 = new B(); 将简单地用新对象覆盖 a1。
假设a1作为current_a1存储在内存中的随机地址,当你用a1 = new A();创建它时,当程序到达a1 = new B();时,current_a1将被设置为new B()的地址,而old_a1最终将被垃圾回收如果没有其他东西指向它。
例子:
A a1 = new A(); a1 -> address_1
a1 = new B(); a1 -> address_2
address_1 is freed from memory if it isn't being pointed to/"used" anywhere else
我希望这会有所帮助!下次询问之前,请对该主题进行更深入的搜索。
【讨论】: