Java 从具有相同引用的不同类创建对象
两者的区别是什么Java 从具有相同引用的不同类创建对象,java,oop,Java,Oop,两者的区别是什么 A a1 = new A(); A a2 = new B(); 其中B延伸A 如果我做了下面的事情会发生什么 a1 = new B(); 谢谢。第一行aa1=newa(),a1是对类型A的对象的引用,A()是对创建类型A的新实例的构造函数的调用 如果类B子类A,那么您可以编写a1=newB(),因为a1是对类型a的对象的引用,而新B将具有完成a的“契约”所需的所有方法。但是,您将无法直接调用特定于B的任何内容,因为该引用是类型a 顺便说一句,上面是这个主题的一个超级简短的概
A a1 = new A();
A a2 = new B();
其中B延伸A
如果我做了下面的事情会发生什么
a1 = new B();
谢谢。第一行
aa1=newa()
,a1
是对类型A的对象的引用,A()
是对创建类型A的新实例的构造函数的调用
如果类B子类A,那么您可以编写a1=newB()代码>,因为a1是对类型a的对象的引用,而新B将具有完成a的“契约”所需的所有方法。但是,您将无法直接调用特定于B的任何内容,因为该引用是类型a
顺便说一句,上面是这个主题的一个超级简短的概述,我建议大家学习一些教程
编辑:这里有一个类比/例子:(Ferrariwithsunloof
extendsFerrari
)
您不能调用,比如说,B.openskown()
,因为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()
首先我推荐你去
现在进入问题<代码>a1=新的A()
调用为A
定义的构造函数,生成类型为A
的新对象,该对象在内存中具有自己的引用。
a2=新的B()
将使用新引用创建一个类型为B
的新对象a2
,就像a1
一样,但是,因为您将a2
定义为类型a
和B
扩展了a
,a2
将只能访问A
中定义的方法,而无需执行显式转换
a1=新的B()代码>将简单地用新对象覆盖a1。
假设a1作为当前_a1以随机地址存储在内存中,这是在使用a1=new a()创建它时发生的代码>,当程序达到a1=new B()时
current\u a1将被设置为new B()
的地址,如果没有其他指向旧的\u a1,则旧的\u 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
我希望这有帮助!下次询问之前,请对主题进行更深入的搜索。如果您想知道发生了什么,请尝试使用log/print语句编写一些简单的测试并执行。此外,您还需要了解继承和多态性,它们是OOP的基本原则;a1=新的B();相似,如果没有什么区别,我在我的ide上试过,没有发现任何区别。第一个创建了a的新实例,第二个创建了B的新实例。请参阅我的编辑。谢谢你的回答!但是你确定a1.jump有效吗?a1已被引用为A!我试过一个例子,可惜没有成功,这也与上面史蒂夫的答案相矛盾!
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