1、复用类,(又名,继承) 伴随的关键字有,重写。
7.1、组合语法。解释:就是将对象已用置于新类中的构造器即可。成员变量在初始化的时候进行默认赋值。也可以强制赋值。
7.2、继承语法。创建一个普通类,在类主体的左花括号之前,书写extends关键字,跟随父类名字。这样会得到父类中所有的域(成员变量,常量)和方法
如下:
继承,是隐世定义,相比较组合这样显示定义。主要是对父类的复用。若感觉父类的方法不适合,也可以重写。也可以新增。
初始化父类,在构建过程是向外扩散。优先加载最顶级的父类的构造器(无参或有参)。
如上图,最先加载art的构造器
7.3、代理。静态代理和动态代理,动态反射用多一点,就是把接口或者控制类放到一个普通类中,不用去调用接口的具体实现,
7.4、确保正确的清理,使用try finally ,
7.5、组合和继承之间的选择。
组合技术通常用于想在新类中使用现有类的功能而非其他的接口这种情形,即。在新类中嵌入某个对象,让其实现所需要的功能,
继承:隐式的传递一些方法或变量,一般做为通用类使用。
7.6、向上转型
7.7、final关键字
一个永不改变的编辑时的常量
如上所示:final变量可以在编译时候就知道它的值,也可以在运行时候随机生成。finaly的值是唯一的,不可引用。不可继承,不可改变。
final作为参数,则不可改变。引用所指的对象。final为方法时候,不可覆盖(重写)。final作为类的时候不可继承。
7.8 继承和初始化。
static的数据在初始化之前加载一次,那构造器和static 是怎么按照顺序加载的那?
class Insect { private int i = 9; protected int j; //加载第三步 Insect() { System.out.println("i = " + i + ", j = " + j); j = 39; } //加载第一步 private static int x1 = printInit("static Insect.x1 initialized"); static int printInit(String s) { System.out.println(s); return 47; } } public class Beetle extends Insect { private int k = printInit("Beetle.k initialized"); //加载第四步 public Beetle() { System.out.println("k = " + k); System.out.println("j = " + j); } //加载第二步 private static int x2 = printInit("static Beetle.x2 initialized"); public static void main(String[] args) { System.out.println("Beetle constructor"); Beetle b = new Beetle(); } }
//result
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
在beetle上运行java时候,第一件是,试图访问beetle.main(一个static方法),于是在加载器开始启动并找出beetle类的编译代码(beele.class文件),在对他进行加载过程中,编译器注意到它有一个父类,于是它继续去父类找static,优先加载。然后在找子类的static,再找父类的构造器,子类的构造器。
加载顺序: main--》父类静态块--》子类静态块---》父类构造器---》子类构造器