如果我在java中有一个名为Foo的抽象类,并且它有一个名为Bar的实现者,那么我想知道以下几点。
假设Foo看起来像这样
public abstract class Foo {
Service serviceFoo
...
}而Bar是
public class Bar extends Foo {
...
}另外,假设我有一个名为foo的Foo实例,当前已实例化了serviceFoo
如果我宣布:
Foo foo = new Bar();这是否会创建一个实例化了serviceFoo的Bar的新实例?例如,该字段是继承和实例化的,还是只是继承的?
发布于 2010-05-14 22:20:46
当您调用new Bar();时,Foo的构造函数是隐式调用的。如果Foo的构造函数实例化了serviceFoo,那么Bar也会实例化。如果Foo依赖其他人来实例化serviceFoo,那么Bar也会这样做。
Foo或Bar的现有实例与创建新实例时发生的事情无关。只有在构造函数中执行的代码(或作为参数传入的代码)才会对新对象产生影响。
发布于 2010-05-14 22:19:08
不,继承不会在实例之间发生;只能在类定义之间发生。
当您实例化new Bar()时,serviceFoo将根据其在Foo中的声明进行实例化。在当前的情况下,它在Foo中没有实例化,因此在Bar的新实例中它将是一个空引用。
此外,您应该知道Java中的所有非基元类型都是引用类型。也就是说,foo不是Foo,而是对Foo的引用。将new Bar()指定给foo时,是将其引用完全重新指定给新对象。
编辑:再来一个小吹毛求疵--如果您已经有了一个名为foo的Foo实例,那么下面的代码行
Foo foo = new Bar();不会编译,因为它是foo的重新声明。
发布于 2010-05-14 22:19:46
不,serviceFoo不会被实例化。这条线
Foo foo = new Bar();删除对foo引用的“旧”对象的引用,并创建一个全新的对象。总而言之,它不会将旧的foo (类型为Foo)“转换”为类型为Bar的对象。
https://stackoverflow.com/questions/2834782
复制相似问题