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();
}