复用:1.组合 2.继承 3.代理
组合:has-a
继承:is-a
组合还是继承一个清晰的判断方法:是否需要从新类向基类进行向上转型
- final
1. final +数据——final “不会改变的”
(1)基本数据类型
final+基本数据类型=常量 定义时必须赋值或者在构造函数里赋值(使用前总是被初始化)
static final+基本数据类型=编译器常量 全部用大写单词间用_隔开
(2)引用(包括数组,数组也是一个引用)
引用指向一个对象后无法在改变它指向另一个对象,但引用所指向对象的具体成员变量值是可以改变的。
private Value v1=new Value(11);//v1.i=11;
v1.i=13;//可以
v1=new Value(13);//不可以
(3)参数
无法在方法中更改参数值和参数引用所指向对象
void f(final int i ){i++;}//不能改变值
void g(final Value v){ v=new Value(3);}//不能改变引用
2.final+方法——“不会被覆盖”
子类在继承父类时,final 的方法会被继承下来,但是不能覆盖。
final和private
class First{
private final void f() {
System.out.println("First.f()");
}
}
class Second extends First{
//@Override 用来检查覆盖是否正确 如果存在Override则会报错
public final void f(){
//super.f();
System.out.println("Second.f()");
}
}
public class TestFinal {
public static void main(String[] args) {
First first=new First();
//first.f();
Second second=new Second();
second.f();
}
}
继承只是继承接口,private只对自己可见(相当于是一段内部代码),子类不继承,所以更谈不上覆盖,因此f只是同名的函数而已。
3.final +类——“禁止继承”
类被final 修饰后,类内的所有方法都被隐式的final,也可以在方法前加上final,但没意义。
- 初始化顺序
第一次创建类的对象或者调用静态方法时,加载类;
初始化静态成员(先基类再子类);
当创建对象时,先分配空间,初始化所有成员变量;
调用构造函数(先基类后子类)