可能重复:
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.
调用?
我对此有点困惑。提前谢谢。
答案 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
}
}