【问题标题】:creating objects from different classes with same reference [duplicate]从具有相同引用的不同类创建对象[重复]
【发布时间】:2017-10-11 23:27:26
【问题描述】:

有什么区别

A a1 = new A();
A a2 = new B();

B 延伸 A

如果我执行以下操作会发生什么

a1 = new B();

谢谢。

【问题讨论】:

  • 如果您想知道发生了什么,请尝试使用日志/打印语句编写一些简单的测试并执行。此外,您需要阅读作为 OOP 基本原则的继承和多态性。

标签: java oop


【解决方案1】:

取第一行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 a1 = new A();和 A a1 = 新 B();是相似的,如果没有什么区别,我已经尝试过我的想法并没有发现任何区别。
  • 第一个创建 A 的新实例,第二个创建 B 的新实例。查看我的编辑。
【解决方案2】:

您可以将使用 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()  

【讨论】:

  • 感谢您的回答!但你确定 a1.jump 有效吗? a1 has 被称为 A!我试过一个例子,遗憾的是它没有用,这也与史蒂夫上面的回答相矛盾!
【解决方案3】:

首先我推荐你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

我希望这会有所帮助!下次询问之前,请对该主题进行更深入的搜索。

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多