2012-05-08 61 views
35

我正在处理扩展JFrame的类。为什么要在构造函数中调用super()?

这不是我的代码,这让超级调用它开始修建GUI之前。我想知道为什么这样做,因为我总是访问超类的方法,而无需调用​​

+0

备注:扩展'JFrame'可能不是你想要做的。扩展意味着一种关系。除非你正在创建一个新的窗口组件,否则你应该扩展'JComponent'。 – Jeffrey

回答

64

有一个隐含的调用super()没有参数的所有类有一个父 - 这是每个用户定义在Java类 - 所以明确调用通常不是必需的。但是,如果父项的构造函数接受参数,并且希望指定它们,则可能会使用带有参数的super()调用。此外,如果父类的构造需要的参数,它有没有默认参数的构造函数,你会需要调用super()与参数(S)。

一个例子,在那里super()显式调用使您能够框架的标题一些额外的控制:

class MyFrame extends JFrame 
{ 
    public MyFrame() { 
     super("My Window Title"); 
     ... 
    } 
} 
+0

_也很重要:_superclass_构造函数的调用**必须是_subclass_构造函数中的第一行**。相关信息在这里:[为什么this()和super()必须是构造函数中的第一条语句?](https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-在构造函数中的第一个语句) – informatik01

14

当你不自己做时,调用父类的空构造函数super()会自动完成。这就是你在代码中从来不需要这样做的原因。它是为你完成的。

当你的超没有一个无参数的构造函数,编译器将需要向super使用适当的参数。编译器将确保您正确地实例化类。所以这不是你必须担心的事。

无论你叫super()在构造函数或没有,它不会影响你打电话给你的父类的方法能力。

作为一个侧面说明,有人说,这是一般最好手动打这通电话为了清楚起见。

+0

另外,请注意,当需要传递参数给它时,需要显式调用'super()'。 –

+0

@SamDufel良好的通话,看我的编辑。 –

0

它只是简单地调用父类的默认构造函数。

+1

不回答这个问题,这是'为什么'。不要将代码格式设置为不是代码的文本。 – EJP

0

我们可以使用超()

如果你的方法来访问父类成员覆盖其超类方法之一,则可以通过使用关键字super来调用重写的方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)。考虑这个类,超类:

public class Superclass { 

    public void printMethod() { 
     System.out.println("Printed in Superclass."); 
    } 
} 

//这里是一个子类,称为子类,重写printMethod()

public class Subclass extends Superclass { 

    // overrides printMethod in Superclass 
    public void printMethod() { 
     super.printMethod(); 
     System.out.println("Printed in Subclass"); 
    } 
    public static void main(String[] args) { 
     Subclass s = new Subclass(); 
     s.printMethod();  
    } 
} 

在子类中,简单名称printMethod()是指一个子类中,声明其覆盖超类中的一个。因此,要引用从超类继承的printMethod(),Subclass必须使用限定名称,如图所示使用super。编译和执行子类打印以下内容:

Printed in Superclass. 
Printed in Subclass 
+0

第一句话是不正确的,而且这些都不能回答这个问题。 – EJP

2

我们可以通过使用超级方法

考虑,我们有两个类,父类和子类,与foo方法的不同实现访问超类的元素。现在在子类中,如果我们想调用父类的方法foo,我们可以通过super.foo()来实现。我们也可以通过super()方法访问父元素。

class parent { 
    String str="I am parent"; 
    //method of parent Class 
    public void foo() { 
     System.out.println("Hello World " + str); 
    } 
} 

class child extends parent { 
    String str="I am child"; 
    // different foo implementation in child Class 
    public void foo() { 
     System.out.println("Hello World "+str); 
    } 

    // calling the foo method of parent class 
    public void parentClassFoo(){ 
     super.foo(); 
    } 

    // changing the value of str in parent class and calling the foo method of parent class 
    public void parentClassFooStr(){ 
     super.str="parent string changed"; 
     super.foo(); 
    } 
} 


public class Main{ 
     public static void main(String args[]) { 
      child obj = new child(); 
      obj.foo(); 
      obj.parentClassFoo(); 
      obj.parentClassFooStr(); 
     } 
    } 
相关问题