Java 将扩展并创建其超类的对象。?
我对这个简单的问题感到困惑。有人能帮我一个有效的答案吗Java 将扩展并创建其超类的对象。?,java,Java,我对这个简单的问题感到困惑。有人能帮我一个有效的答案吗 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[]
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();
}
}
现在我的问题是,我是否正在创建子类的对象
它创建一个超类的对象
如果是,为什么
我知道大多数人认为这个问题很愚蠢。但这些是我的问题
它调用超类的构造函数,那么如果没有创建对象,它会怎么做呢?
扩展是否增加了类的大小?ie超类+子类
现在我的问题是,如果我正在创建一个子类的对象,它会创建一个超类的对象吗
不,不是
当你这样做的时候
SubClass sub=new SubClass();
只创建了子类
对象。并且只调用了super类的构造函数。对超级类构造函数的调用一直链接到java.lang.Object
构造函数
旁注:规则的大拇指(不知道它是不是正式的,每个新的,只创建一个对象)
你指的是:
新对象包含指定类类型及其所有超类中声明的所有字段的新实例。创建每个新字段实例时,都会将其初始化为默认值(§4.12.5)
所以你可以得出一个结论,比如当类子类扩展了超类,然后方法,变量被复制到类子类
编辑:
如果没有创建对象,如何调用构造函数
啊…你的怀疑对我来说很有意义
但是constructor
是java中非常特殊的方法。你可以反编译一个类文件,你可以在
的名称中看到构造函数,除了关键字new
或super
之外,你不能显式调用。
-您不创建超类对象,因为唯一创建的对象是子类对象。
-在另一个透视图中,是的,您确实创建了一个超类对象,因为子类对象是一个超类对象。换句话说,“超类obj=新的子类();”是完全有效的
-超类的构造函数称为否。它不创建超类对象。虽然它继承自超类,但它确实运行其构造函数和初始化块(如果有),并且还获得其状态和行为。很难给出简单的是/否答案,因为它取决于所使用术语的确切定义。当你说
SubClass sub = new SubClass();
这将创建一个对象(不包括构造函数主体或成员字段初始化创建的任何其他对象)。该对象有一个运行时类,它将是子类
。如果您说sub.getClass()==SubClass.class
,则返回true
。如果说sub.getClass()==SuperClass.class
,则返回false
。因此,从这个意义上说,答案是否定的,因为对象的(运行时)类是子类
,而不是超类
然而,新的子类
对象也被认为是超类
的“实例”;如果你说超类的子实例,这个表达式就是true
。您还可以在任何需要超类的地方使用sub
,例如,如果您有一个变量SuperClass
,您可以分配s=sub
,如果方法需要超类
参数,您可以将sub
传递给它。在OOP中,继承(在Java中扩展了)表示是一种关系,从这个意义上说,子类是一个超类,因此子类也是一个超类。但请注意,它的运行时类从未更改
当然,要回答“它是否创建了超类的对象”这个确切问题,如果构造函数看起来像
public SubClass () {
this.myParent = new SuperClass();
}
现在,构造函数创建了一个子类
的对象和一个超类
的单独对象。但我肯定你不是这个意思
编辑:要解决您稍后添加的问题,请执行以下操作:
它调用超类的构造函数,那么如果没有创建对象,它该怎么做呢
子类
对象包含为超类
声明的成员字段,以及为子类
声明的成员字段。(加上为对象
声明的成员字段以及介于两者之间的任何其他超类)但它仍然只是一个包含所有这些字段的对象。子类
构造函数调用一个超类
构造函数,该构造函数(可能)初始化为超类
声明的字段;然后子类
构造函数可以初始化为子类
声明的字段
扩展是否会增加类的大小?ie超类+子类
如果在子类
中声明了新成员字段,那么是的,子类
可能会使用更多内存,因为它在超类
中声明了所有字段,加上在子类
中声明的所有字段,为什么不直接参考关于扩展的java7教程呢?答案就在第一段!我刚刚在LinkedIn论坛上看到了同样的问题。。。这是最新的热门工作面试问题吗?@ajb我对linkedIn上的问题感到困惑,所以我把它贴在这里。在linked In中,没有人给出带证明的答案。所以你是说它不会超出构造函数的范围,但是如果没有创建对象,如何调用构造函数呢?…是的,这很有帮助,我将让帖子再打开一段时间,让更多的信息进来:)
public SubClass () {
this.myParent = new SuperClass();
}