1.组合和继承是在不破坏现有代码下,复用类的方式。
2.当需要用到String 的地方)而当前是对象时,会调用它的toString方法,有的是方法自己实现的行为,有的是JVM自动添加的,例如println传入的参数若不是String,则println方法会自动调用toString,而在表达式中时,则是JVM完成的。
3.组合方式中,对依赖对象可以使用4种初始化方式:定义时初始化,构造方法初始化,初始化块,在使用时检查是否为null的惰性初始化。
4.只要创建一个类,就已经发生了继承(显式继承或隐式从Object类继承)。从而思想来到了 多态(重载与重写),注意重写的方法使用的成员变量是捆绑在调用方法所在的类。
5.每个类中的main作为单元测试使用。
6.无论含有main的类是public还是包默认权限,取决于‘java 有main方法的类’ 调用的是哪个类。即‘java C’,则jvm先按照CLASSPATH找到.class文件,然后在方法区创建类的class对象,在方法区中初始化类C的静态结构,执行静态初始化块,然后调用C.main()。
7.常用的继承策略是将所有变量为private, 外部需要访问的方法按照选择性写为protected, public,或包默认。
8.super.父类的成员变量或者方法。 super是父类对象的引用。
9.创建出来的子类实例,内部除了自己的重写方法和变量,独有方法和变量外,包含有父类的一个子对象,这个对象和直接创建父类的子对象是相同的。
如图所示,现在有4个类的class文件,当我在程序中使用到这4个类时,即有如下代码:
FatherB fb = new Father();
ChildrenA ca = new ChildrenA();
ChildrenB cb = new ChildrenB();
JVM会在CLASSPATH等路径查找class文件,使用JIT即时编译机制,在方法区中逐个分配这4个class对象的空间,然后在下面的静态变量区执行类导入时的静态初始化过程。(复习一遍初始化)因为没有静态变量所以下面的静态变量区没有画出。
然后分别在Eden区分配3个对象,其中两个对象的父类是以子对象存在内部的,当出现变量和方法覆盖时,需要使用super.XXX来在父类对象中查找。
因此,如果存在继承连,则对象中的区域会逐渐深入嵌套。
建立完内存对象结构,然后进行对象的初始化,根据方法区的构造函数代码,会从里到外填写成员变量,执行初始化块。
10.要改变编译器默认添加的调用父类无参构造函数的语句,需要在子类构造方法中显式使用super(params)语句。
11.除了组合和继承,还有代理来提供另一个类的功能,代理类与被代理类是组合关系。代理是介于组合和继承之间的方法。
12.对象的清理操作需要写一个方法,并且遵守约定调用它,在这个方法中,应该先清理自己特有的部分,然后再使用super调用父类的清理方法,顺序和对象建立时相反。想想书上的Shape父类和图形子类,而CADSYStem类(也继承Shape类)组合这些图形,然后调用CADSystem的自定义dispose方法,想想过程。
13.不要把对象的清理逻辑放在finalize方法中,因为GC是不可靠的,因为只要内存不满,就不会GC,即使GC,也未必会按照你想要的顺序清理对象执行finalize。
14.子类中可以重载父类的方法,不会发生冲突。这点在上图中很容易理解。若是重写,则会覆盖,需要使用super。
15.重写时习惯加上@Override。
16.从上图上看,组合和继承只不过把父类对象放在了外面和里面。当使用组合时,若依赖的类访问控制做得很好,则组合很安全;而若不想外界过度使用依赖的类,或者想使用依赖的类的接口并且加以扩展,则使用继承。一个是is-a关系,一个是has-a关系。使用组合还是继承的另一个理由是是否要使用多态即向上转型。
17.从图上看,继承还可以解释为:子类是父类的一种类型,即因为子类中拥有父类的所有成员,所以可以将子类作父类使用。例如多态中的对象自动向上转型。想想类图,想想对象内部的嵌套结构。
18.final的3个用法:类,方法,变量。static final 和final变量可以在定义时不给值,但是各自必须在类静态初始化完毕和构造方法结束前给值。想想每个的用处,初始化过程。
19.final修饰变量,若为基本类型,则不可变,若为引用类型,则还是不可变。(状态可变)例如final int []a={1,2};a[0]=2;
20.说说static final 和final变量的区别和初始化过程。
21.private方法即自带final属性,因此在子类中重写时不会发生错误,因为根本没发生重写。只是声明了一个新方法!!!可以向上转型子类到父类就知道了。可以用Override解决这个问题。
22.final类的所有方法也都是带final属性。