ajs*_*sie 154 java constructor super
如果不将它放在子类的构造函数中,编译器是否会自动放置这个?
那意味着我甚至不需要关心它?在一些文章中,他们把它说出来.
如果我有一个带参数的构造函数,这将是构造函数,还是它需要一个没有参数列表的构造函数?
cle*_*tus 216
首先是一些术语:
所以所有类都至少有一个构造函数.
子类构造函数可以指定他们在执行子类构造函数中的代码之前,首先在超类中执行哪些构造函数调用.
如果子类构造函数未指定要调用的超类构造函数,则编译器将自动调用超类中的可访问no-args构造函数.
如果超类没有no-arg构造函数或者它不可访问,那么不指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定它.
例如:
public class Base { }
public class Derived extends Base { }
Run Code Online (Sandbox Code Playgroud)
这很好,因为如果你没有显式地添加构造函数,那么Java就会为你提供公共默认构造函数.
public class Base { }
public class Derived extends Base { public Derived(int i) { } }
Run Code Online (Sandbox Code Playgroud)
还好.
public class Base { public Base(String s) { } }
public class Derived extends Base { }
Run Code Online (Sandbox Code Playgroud)
以上是编译错误,因为Base没有默认构造函数.
public class Base { private Base() { } }
public class Derived extends Base { }
Run Code Online (Sandbox Code Playgroud)
这也是一个错误,因为Base的no-args构造函数是私有的.
lem*_*mon 51
如果超类构造函数没有参数,Java会自动为您调用它.如果它有参数你就会收到错误.
src:http://java.sun.com/docs/books/tutorial/java/IandI/super.html
Rol*_*lig 22
调用无参数超级构造函数只是浪费屏幕空间和程序员时间.无论你是否编写代码,编译器都会生成完全相同的代码.
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
Run Code Online (Sandbox Code Playgroud)
更新(2018年12月):
编写显式super()有助于在IDE中导航源代码.
截至2018年12月,Eclipse和IntelliJ都没有提供任何方法可以轻松地从派生类的构造函数导航到基类的构造函数.
即使不调用子默认构造函数,也会调用默认父构造函数。
主要
public class Main {
public static void main(String[] args) {
A a = new B();
}
}
Run Code Online (Sandbox Code Playgroud)
一种
public class A {
public A() {
System.out.println("A");
}
}
Run Code Online (Sandbox Code Playgroud)
乙
public class B extends A {
public B() {
System.out.println("B");
}
}
Run Code Online (Sandbox Code Playgroud)
版画
A
B
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81605 次 |
| 最近记录: |