可能重复:
访问非重写超类方法时使用“super”关键字
我是 Java 新手,最近阅读了很多有关 Java 的文章,以获得更多有关该语言的知识和经验。当编译器插入自动代码时,我有一个关于继承方法和扩展类的问题。
我一直在阅读,如果我使用一些方法创建类 A,其中包括一个名为
checkDuePeriod()
的方法,然后创建一个扩展类 A 及其方法的类 B。
如果我随后在 B 类中调用方法
checkDuePeriod()
而不使用 super.checkDuePeriod()
语法,则在编译过程中,编译器是否会在 super.
之前包含 checkDuePeriod()
,或者编译器会在以下情况下自动包含 super()
构造函数:编译类意味着super.
调用B类从A类调用的方法?
我对此有点困惑。预先感谢。
超类对常规方法的实现不会在子类中自动调用,但必须在子类的构造函数中调用超类构造函数的某种形式。
在某些情况下,隐含对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);
}
}
checkDuePeriod()
而没有
super.
,则意味着你要调用属于B的this实例(在B中用
this
表示)的方法。所以,相当于说
this.checkDuePeriod()
,所以编译器在前面添加
super.
是没有意义的。
super.
是您必须显式添加的内容,以告诉编译器您想要调用该方法的 A 版本(特别需要它,以防 B 覆盖了 A 为该方法提供的实现)。
保证可扩展类的字段已正确初始化。
例如:
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;
}
}
Constructors
- 当创建一个类的 object
时,它的
constructor
就会被初始化,并且此时立即 其 s
constructor
的
uper-class
会被调用,直到
Object
类,
- 在此过程中,所有实例变量都被声明并初始化。
- 考虑这种情况。
Dog 是 Canine
的
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
}
}