Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从具有相同引用的不同类创建对象_Java_Oop - Fatal编程技术网

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
extends
Ferrari

您不能调用,比如说,
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