Java编译器的超()构造将军[复制](Java compiler super() construc

2019-09-24 05:19发布

可能重复:
当访问“超级”关键字的使用非覆盖超类方法

我是新来的Java和已经读了很多关于它最近获得关于语言更多的知识和经验。 我有一个关于继承的方法和扩展类的问题时,编译器插入自动代码。

我一直在读,如果我创造A级的一些方法,包括让说,一个名为方法checkDuePeriod()然后创建延伸的A类和方法B类。

如果我再调用方法checkDuePeriod() B类内不使用super.checkDuePeriod()语法,在编译期间将编译器包括super.checkDuePeriod()或将编译器包括事实super()编译的类时自动构造意味着super. 方法调用的类A是B类电话?

我有点糊涂了这一点。 提前致谢。

Answer 1:

超类的实现的常规方法是不会自动在子类调用,但超类的构造函数的形式必须在子类的构造函数被调用。

在某些情况下,调用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);
    }
}


Answer 2:

如果调用checkDuePeriod() B中没有super. ,意味着你要调用属于这种情况(所代表的方法this B.所以B内部),它相当于说this.checkDuePeriod()所以它只是没有让编译器添加有意义super. 在前面。

super. 是的东西,你必须明确地添加到告诉你要拨打的A的版本的方法的编译器(它是特别需要的情况下,B已覆盖由一种方法提供的实现)。



Answer 3:

超()作为一个默认构造函数(构造函数没有参数)的调用可以直接或非直接的,但它是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;
    }
}


Answer 4:

首先关于Constructors

-当曾经的object是创建一个类,它的constructor初始化和当时立即 constructor了S的uper-class被称为直到Object类,

-在这个过程中的所有实例变量的声明和初始化。

-考虑这种情况。

是一个sub-class 的犬和是一个sub-class 动物

现在,当狗对象初始化之前,对象实际上形式,犬类对象必须是形式,而犬对象之前,可以形成动物类对象将要形成,而在此之前Object类的对象必须是形式,

所以对象的形成的序列是:

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
    }
}


文章来源: Java compiler super() constructor generals [duplicate]