复用类
- 组合(new一个现有类的对象)
- 继承(不改变形式,只是添加代码)
java使用super关键字表示超类,当前类就是重超类继承来的
名称屏蔽
java基类中的方法有多个重载,导出类中重新定义该方法名称不会屏蔽基类中方法的任何版本
@override:如果你重载而不是重写基类中的方法时,报错
组合和继承之间的选择
组合:has-a
继承:is-a
选择:判断自己是否要用到新类向基类的转型,如果需要,继承是必须的,如果不需要,考虑使用组合吧
向上转型
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Test2.play(new Test2());
}
}
class Test1{
int i;
static void play(Test1 test1){
System.out.println(test1);
}
}
class Test2 extends Test1{
}
向上转型:test2转为test1,子类引用转为父类引用
这种转换是安全的,因为父类中有的东西子类中都有,完全可以转换
final关键字
final数据
- 编译时的常量
- 固定引用的指向
final + static :一个固定不变的域,占据一段不能改变的空间
编译时常量:基本类型,可以不在定义的时候赋初值,但是使用前一定要赋初值
class Test2 extends Test1{
private final int a;
public Test2(){
a=1;
}
}
固定引用:如果给一个对象的引用使用final,表示这个引用永远指向这个对象,但是这个对象自己内部是可以变化的,
public static final int VALUE_TEST = 1;
- public:可以用于包外
- static:只有一份
- final:是常量
static final 使用全大写下划线命名,而且必须赋初值
final参数
class Test2 extends Test1{
private final int a;
public Test2(){
a=1;
}
public Test2(final int a){
this.a = 1;
a=1;
}
}
a=1 报错,final参数表示引用的指向固定,不能改变
final方法
方法锁定,无法修改含义,无法覆盖
private的方法隐含final属性
final类
表示这个类不能被继承
同时类中的所有方法都隐含着final
总结
设计程序时优先使用组合(或者代理)