将扩展创建其超类的对象。?

时间:2013-12-03 05:13:49

标签: 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[]) 
    { 
       SubClass sub=new SubClass(); 
    }
 }
  

现在我的问题是我是否正在创建SubClass的对象   它会创建SuperClass 对象   如果是的话为什么.. ??

我知道大多数人认为这个问题很愚蠢。但这些是我的问题。

它会调用SuperClass的构造函数,所以如果没有创建对象,它会怎么做。

扩展是否会增加类的大小?即SuperClass + SubClass。!!

4 个答案:

答案 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>.的构造函数。除了关键字newsuper之外,您无法明确调用

答案 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)

不,它不会创建超类对象。虽然它继承自超类,但它确实运行了它的构造函数和初始化块(如果有的话),并且还获得了它的状态和行为。