我对这个简单的问题很困惑。任何人都可以帮我一个有效的答案。
public class SuperClass{
public SuperClass(){
// may or may not have a constructor for superclass
}
}
public class SubClass extends SuperClass{
// anything here
public static void main(String args[])
{
SubClass sub=new SubClass();
}
}
现在我的问题是我是否正在创建
SubClass
的对象 它会创建SuperClass
的 对象 如果是的话为什么.. ??
我知道大多数人认为这个问题很愚蠢。但这些是我的问题。
它会调用SuperClass的构造函数,所以如果没有创建对象,它会怎么做。
扩展是否会增加类的大小?即SuperClass + SubClass。!!
答案 0 :(得分:1)
现在我的问题是,如果我正在创建SubClass的对象,它是否会创建SuperClass的对象,如果是,为什么.. ??
没有。不是。
当你这样做时
SubClass sub=new SubClass();
仅创建了SubClass
个对象。并且只有超级类的构造函数调用。并且调用超类构造函数链接到java.lang.Object
构造函数的延伸。
旁注:规则的拇指(不知道它是否正式,每个新,只有一个对象创建 )
您可以参考:15.9.4 Run-time Evaluation of Class Instance Creation Expressions
新对象包含在指定类类型及其所有超类中声明的所有字段的新实例。在创建每个新字段实例时,它将初始化为其默认值(§4.12.5)。
因此,您可以得出像class SubClass extends SuperClass
那样的结论,然后将方法,变量复制到类SubClass
。
修改强>
如果没有创建对象,如何调用构造函数.. ??
Aah ......你的疑问对我有意义。
但constructor
是java中非常特殊的方法。您可以反编译一个类文件,您可以看到名称为<init>.
的构造函数。除了关键字new
或super
之外,您无法明确调用 。
答案 1 :(得分:1)
很难给出一个简单的是/否答案,因为它取决于您正在使用的术语的确切定义。当你说
SubClass sub = new SubClass();
这将创建一个对象(不计算构造函数体创建的任何其他对象或成员字段的初始化)。该对象具有运行时类,它将是SubClass
。如果您说sub.getClass() == SubClass.class
,则返回true
。如果您说sub.getClass() == SuperClass.class
,则返回false
。所以在这个意义上,答案是否定的,因为对象的(运行时)类是SubClass
,而不是SuperClass
。
但是,新的SubClass
对象也被视为SuperClass
的“实例”;如果您说sub instanceof SuperClass
,则此表达式为true
。您还可以在需要sub
的任何地方使用SuperClass
,例如如果您有变量SuperClass s
,则可以指定s = sub
,如果某个方法需要SuperClass
参数,则可以将sub
传递给它。在OOP中,继承(Java中的extends
)表示是-a 关系,从这个意义上说,SubClass
是 {{1因此,SuperClass
是 sub
。但请注意,其运行时类永远不会更改。
SuperClass
当然,要回答确切的问题“它是否创建了SuperClass的对象”,如果构造函数看起来像
那么答案可能是肯定的。SuperClass s = sub;
boolean b1 = (s.getClass() == SuperClass.class); // false
boolean b2 = (s.getClass() == SubClass.class); // true
现在,构造函数创建了一个public SubClass () {
this.myParent = new SuperClass();
}
对象和一个SubClass
的单独对象。但我确信这不是你的意思。 :)
编辑:要解决您稍后添加的问题:
它调用SuperClass的构造函数,那么如果没有创建对象,它会怎么做呢?
SuperClass
对象包含为SubClass
声明的成员字段,加上为SuperClass
声明的成员字段。 (加上为SubClass
声明的成员字段以及介于两者之间的任何其他超类。)但它仍然只是一个包含所有这些字段的对象。 Object
构造函数调用SubClass
构造函数,该构造函数(可能)初始化为SuperClass
声明的字段;然后SuperClass
构造函数可以初始化为SubClass
声明的字段。
扩展是否会增加类的大小?即SuperClass + SubClass。!!
如果在SubClass
中声明了新的成员字段,那么是的,SubClass
可能会使用更多的内存,因为它具有在SubClass
中声明的所有字段以及声明的所有字段在SuperClass
。
答案 2 :(得分:0)
你的问题有点令人困惑。 - 您不创建SuperClass对象,因为唯一创建的对象是SubClass对象。 - 在另一个角度看,是的,您确实创建了一个SuperClass对象,因为SubClass对象是一个SuperClass对象。换句话说,“SuperClass obj = new SubClass();”完全有效 - SuperClass的构造函数叫做
答案 3 :(得分:0)
不,它不会创建超类对象。虽然它继承自超类,但它确实运行了它的构造函数和初始化块(如果有的话),并且还获得了它的状态和行为。