Java编译器super()构造函数将军[重复]

问题描述 投票:0回答:4

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

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

我一直在阅读,如果我使用一些方法创建类 A,其中包括一个名为

checkDuePeriod()
的方法,然后创建一个扩展类 A 及其方法的类 B。

如果我随后在 B 类中调用方法

checkDuePeriod()
而不使用
super.checkDuePeriod()
语法,则在编译过程中,编译器是否会在
super.
之前包含
checkDuePeriod()
,或者编译器会在以下情况下自动包含
super()
构造函数:编译类意味着
super.
调用B类从A类调用的方法?

我对此有点困惑。预先感谢。

java class inheritance constructor
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); } }
    

1
投票
如果你在B中调用

checkDuePeriod()

而没有
super.
,则意味着你要调用属于B的this实例(在B中用
this
表示)的方法。所以,相当于说
this.checkDuePeriod()
,所以编译器在前面添加 
super.
 是没有意义的。 

super.

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


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

0
投票
首先关于

Constructors



- 当创建一个类的 object

 时,它的 
constructor
 就会被初始化,并且 
此时立即 其 sconstructor
uper-class
 会被调用,直到 
Object
 类,

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

- 考虑这种情况。

DogCanine

sub-class,Canine 是 Animal
sub-class

现在当Dog对象初始化时,在该对象真正形成之前,Canine类对象必须是form,而在Canine对象可以形成Animal类对象之前,要形成Animal类对象,而在此之前,Object类对象必须是form,

所以对象形成的顺序是:

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 } }
    
© www.soinside.com 2019 - 2024. All rights reserved.