如果不提供对super()的显示调用,编译器将会提供不带参数的super()调用,这会导致调用超类的无参构造函数。如果不提供无参构造函数,编译器会调用自己提供的无参构造函数。这只会发生在没有为类定义任何其他构造函数的情况下;否则编译器将会抛出异常。
如果已经定义了构造函数(不管是无参还是有参的),编译器将不会提供无参构造函数
创建复制构造函数
public class TimeOfDay {
private int hour, mins;
public TimeOfDay(int hour, int mins) {
this.hour = hour;
this.mins = mins;
}
//创建一个复制构造函数
public TimeOfDay(TimeOfDay timeOfDay) {
this(timeOfDay.hour, timeOfDay.mins);
}
}
toString()方法默认会返回对象的引用。
如果构造函数中没有使用this或super调用,编译器将会添加一条隐式的super()调用,这会调用父类无参的构造函数。如果父类构造函数中没有此类构造函数,编译器将会触发错误
如果编写自己的构造函数,编译器将不会提供默认的构造函数
final
- 类:
声明final类,可确保其他类无法对这个类进行扩展
public class final MyClass {
}
- 方法:
如果不想让子类重写某个方法,可以给其设置final属性。
由于private和static方法不能在子类中重写,所以他们总是引式的final - 变量
使用final的变量会被认为是常量,将不允许再被做修改。
final变量不需要在声明时就初始化,可以在声明后的其他地方进行初始化,但是只能初始化一次
属性为final的变量如果在声明时没有初始化,那么它的初始化必须放在构造函数中,因为它只在对象的声明周期中调用一次。如果在构造函数中进行初始化,就必须在所有的构造方法中都进行初始化。
public class Student {
public final int ID;
public Student() {
ID = 10;
}
}
- 类变量
final类变量仅仅保存的是指向对象的引用,那么引用必须保持不变,而非对象。对象状态依旧是可以被改变。
final类变量不能指向除初始化时设置的对象之外的任何对象。
成员可见性
理解以下表格即可
同包 | 同包 | 不同包 | 不同包 | ||
---|---|---|---|---|---|
修饰符 | 同类 | 子类 | 非子类 | 子类 | 非子类 |
public | Yes | Yes | Yes | Yes | Yes |
private | Yes | No | No | No | No |
protect | Yes | Yes | Yes | Yes | No |
default | Yes | Yes | Yes | No | No |