Java编译器super()构造函数的常规

时间:2012-10-17 03:52:42

标签: java class inheritance compiler-construction constructor

  

可能重复:
  Use of ‘super’ keyword when accessing non-overridden superclass methods

我是Java新手,最近一直在阅读很多关于Java的知识和经验。当编译器插入自动代码时,我有一个关于继承方法和扩展类的问题。

我一直在阅读如果我用一些方法创建类A,包括让我们说一个名为checkDuePeriod()的方法,然后创建一个扩展类A及其方法的类B.

如果我在不使用checkDuePeriod()语法的情况下调用B类中的方法super.checkDuePeriod(),则在编译期间编译器会在super.之前包含checkDuePeriod(),或者是编译类时,编译器会自动包含super()构造函数意味着类B调用类A的方法的super.调用?

我对此有点困惑。提前谢谢。

4 个答案:

答案 0 :(得分:5)

常规方法的超类的实现是在子类中自动调用 not ,但是必须在子类中调用超类的构造函数的形式&#39 ; s构造函数。

在某些情况下,隐含了对super()的调用,例如当超类具有默认(无参数)构造函数时。但是,如果超类中不存在默认构造函数,则子类的构造函数必须直接或间接调用超类构造函数。

默认构造函数示例:

public class A {
    public A() {
        // default constructor for A
    }
}

public class B extends A {
    public B() {
        super(); // this call is unnecessary; the compiler will add it implicitly
    }
}

没有默认构造函数的超类:

public class A {
    public A(int i) {
        // only constructor present has a single int parameter
    }
}

public class B extends A {
    public B() {
        // will not compile without direct call to super(int)!
        super(100);
    }
}

答案 1 :(得分:1)

如果在没有checkDuePeriod()的情况下在B中调用super.,则表示您要调用属于此实例的方法(由B中的this表示)。所以,它相当于说this.checkDuePeriod(),所以编译器在前面添加super.是没有意义的。

super.是你必须明确添加的东西,告诉编译器你要调用方法的A版本(如果B已经覆盖了A为方法提供的实现,则需要特别需要它)。

答案 2 :(得分:1)

调用super()作为默认构造函数(没有args的构造函数)可以是直接的或非直接的,但 garants可扩展类的字段已正确初始化

例如:

public class A {
    StringBuilder sb;
    public A() {
        sb = new StringBuilder();
    }
}

public class B extends A {
    public B() {
        //the default constructor is called automatically
    }
    public void someMethod(){
        //sb was not initialized in B class, 
        //but we can use it, because java garants that it was initialized
        //and has non null value
        sb.toString();
    }
}

但是在方法的情况下:

方法实现一些逻辑。如果我们需要重写超类逻辑,我们使用

public class B extends A {
    public B() {
    }
    public boolean checkDuePeriod(){
       //new check goes here
    }
}

如果我们想要实现一些额外的检查,使用从超类的checkDuePeriod()返回的值,我们应该做这样的事情

public class B extends A {
    public B() {
    }
    public boolean checkDuePeriod(){
       if(super.checkDuePeriod()){
            //extra check goes here
       }else{
            //do something else if need
       }
       return checkResult;
    }
}

答案 3 :(得分:0)

首先关于Constructors

- 如果创建了object个类,则会constructor初始化,会立即 constructor它的uper-class被调用到Object类,

- 在此过程中,声明并初始化所有实例变量。

- 请考虑这种情况。

sub-class,而犬只是动物的sub-class

现在,当Dog对象被初始化时,在对象实际形成之前,Canine类对象必须是form,并且在Canine对象可以形成之前,将形成Animal类对象,并且在该Object类对象必须形成之前,< / p>

所以形成的对象序列是:

Object ---> Animal ---> Canine ---> Dog

所以Constructor of the Super-Class is Called before the Sub-Class

现在使用Method

The most specific version of the method that class is called.

<强>例如

public class A{

  public void go(){


  }

}

class B extends A{



   public static void main(String[] args){

   new B().go();  // As B has not overridden the go() method of its super class,
           // so the super-class implementation of the go() will be working here
    }
}