6

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

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

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

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

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

4

4 回答 4

5

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

在某些情况下,调用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);
    }
}
于 2012-10-17T04:04:14.587 回答
1

如果你checkDuePeriod()在没有的情况下调用B super.,意味着你想调用属于B的this实例(由thisB内表示)的方法。所以,它相当于说this.checkDuePeriod(),所以编译器添加是没有意义super.的前方。

super.是您必须显式添加的内容,以告诉编译器您要调用 A 的方法版本(特别需要在 B 覆盖 A 为该方法提供的实现的情况下)。

于 2012-10-17T04:22:07.893 回答
1

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

例如:

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;
    }
}
于 2012-10-17T04:22:08.933 回答
0

首先关于Constructors

-object一个类的 an 被创建时,它constructor被初始化并且在那个时候它的 s 被立即调用constructoruper-class直到这个Object类,

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

-考虑这种情况。

DogCaninesub-class的一个,Canine 是Animal的一个sub-class

现在初始化Dog对象时,在对象实际形成之前,必须形成Canine类对象,并且在Canine对象形成之前,要形成Animal类对象,并且在形成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
    }
}
于 2012-10-17T05:05:45.237 回答