Effective Java 学习笔记
第41条 慎用重载
重载 overloaded
原则:
永远不要导出两个具有相同参数数目的重载方法
如果方法使用可变参数(varargs),保守的策略是根本不要重载它。
构造器不可能被覆盖
//Base.java
public class Base {
Base() {
System.out.println("This is contructor of Base...");
}
}
//Sub1.java
public class Sub1 extends Base {
Sub1() {
System.out.println("This is contructor of Sub1...");
}
}
//Test.java
public class Test {
public static void main(String[] args) {
Sub1 sub = new Sub1();
}
}
运行Test,输出结果为:
This is contructor of Base...
This is contructor of Sub1...
构造函数注意事项
- 子类中一定会调用父类的构造函数。即使不使用显示的super()来调用父类的构造函数。
- 如果在子类的构造函数中,没有使用super(),那么JAVA编译器会默认直接在子类构造函数的第一句执行super(),也就是说,子类的构造函数中首先调用父类的不带参数的构造函数。
- 在JAVA中,在类中如果不编写类的构造方法,则默认JAVA自动生成参数为空的构造函数,也就是在子类构造方法默认直接调用父类的构造方法。(这就是为什么我们在使用JAVA时,如果不提供父类、子类的构造方法,仍能正常工作的原因。)
- 在子类的构造方法中,如果要手动调用父类的构造方法,那么必须在子类构造方法第第一句调用。
- 对类的构造方法来说,一旦自定义构造方法,那么JAVA编译器就不会生成默认构造方法了。也就是说一旦自定义了带有参数的构造方法,而没有定义参数为空的构造方法,那么这个类的子类构造方法中,JAVA就不会为其添加父类参数为空的构造方法。这种情况下,必须在子类的构造方法中手动调用super(…),调用父类带有参数的构造方法,保证子类对象中所包含的父对象空间一定会先初始化。
public class Base {
public Base(String name) {
System.out.println("This is Base contructor, name: " + name);
}
}
public class Sub1 extends Base {
public Sub1(String name) {
System.out.println("This is contructor of Sub1, name: " + name);
}
}
这样,在Sub1的构造函数中,编译器会报错:
Implicit super constructor Base() is undefined. Must explicitly invoke another constructor
在子类构造函数的第一句添加super(name)后,编译通过。
public class Sub1 extends Base {
public Sub1(String name) {
super(name);
System.out.println("This is contructor of Sub1, name: " + name);
}
}
本文探讨了EffectiveJava中的重要原则,特别是关于方法重载的注意事项,并深入解析了构造器的继承特性及其调用机制。
1万+

被折叠的 条评论
为什么被折叠?



