第五章-继承


1. 继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求。
2.反射是指在程序运行期间发现更多的类及其属性的能力。
3.在java中所有继承都是公有继承。
4. 在子类中可以增加域、增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。
5.this与super关键字用途总结:
this用途:
(1)引用隐式参数;
(2)调用该类其他的构造器。
super用途:
(1)调用超类方法;
(2)调用超类构造器。
6.调用构造器的语句只能作为另一个构造器的第一条语句出现。构造器参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器。
7.一个对象变量可以指示多种实例类型的现象被称为多态,在运行时能够自动的选择调用哪个方法的现象称为动态绑定。
8.java不支持多继承。
9.在java中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类对象。
10.不能将超类的引用赋给子类对象。例如:Manager  m = staff[i];//error

     原因:不是所有的雇员都是经理。

11. 动态绑定(弄清对象的执行过程):
1) 编译器查看对象的声明类型和方法名。编译器将会一一列举所有该类中的该方法和其超类中访问属性为public且方法名与之一致的方法。
2)变奇艺查看调用方法时提供的参数类型。如果存在一个方法名相同且所提供的参数类型完全匹配,就选择这个方法,这个过程叫做重载解析。
12. 如果子类定义了一个与超类签名相同的方法,那么子类中的这个方法就覆盖了超类中的这个相同签名的方法。在覆盖方法时,一定要保证返回类型的兼容性。允许子类将覆盖方法的类型定义为原返回类型的子类。
13. 在覆盖一个方法时,子类方法不能低于超类方法的可见性。如果超类方法时public,那么子类方法一定要声明为public。
14. 进行类型转换的唯一原因:在暂时忽视对象的实际类型之后,使用对象的全部功能。
15. 在Java中,每个对象变量都属于一个类型。类型描述了这个变量所引用的以及能够引用的对象类型。
16. 将一个子类的引用赋值给一个超类变量,编译器是允许的。但将一个超类的引用赋值给一个子类变量,必须进行类型转换。这样才能通过运行时检查。
综上:
1)只能在继承层次内进行类型转换。
2)在将超类转换成子类型之前,应该使用instanceof进行检查。在一般情况下,应该尽量少用类型转化和instanceof运算符。
if(staff[1]   instanceof  Manager){
     boss  = (Manager) staff[1];
     ......
}
17. 包含一个或多个抽象方法的类必须声明为抽象的。除此,抽象类还可以包含具体数据和具体方法。抽象方法充当着占位的角色,他们的具体实现在子类中。
18.  扩展抽象类的两种方法:
1)在子类中定义部分抽象方法或抽象方法也不定义,这样必须将子类也标记为抽象类;
2)定义全部的抽象方法,这样,子类就不是抽象的了。
19. 类即使不含抽象方法,也可以将类声明为抽象类。抽象类不能被实例化(不能创建它的对象,但可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象)
20. Java用于控制可见性的四个访问修饰符:
1) 仅对本类可见------private;
2) 对所有类可见 ------ public;
3) 对本包和所有子类可见 ------ protected;
4) 对本包可见 ------ 默认,不需要修饰符。
21. 可以使用Object类型的变量引用任何类型的对象。当然,Object类型的变量只能用于作为各种值的通用持有者。
22. 在Java中,只有基本类型(例如:数值、字符和布尔类型)不是对象。所有的数组类型,不管是对象数组还是基本类型的数组都扩展与Object类。
23. Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,他们一定是相等的。然而经常检验两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。
24. 强烈建议为自定义的每一个类增加toString方法。
25. 泛型数组列表:
      ArrayList是一个采用类型参数的泛型类。为了指定参数列表保存的元素对象类型,需要用一对尖括号括起来加在后面。具有自动调节数组容量的功能,而不需为此编写任何代码。可以使用add方法将元素添加到数组列表中。
26. 数组列表的操作魅力: 如果调用add且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中。
27. 数组列表的容量与数组的大小有一个非常重要的区别:容量为100个元素的数组列表只是拥有保存100个元素的潜力,单数在最初甚至完成初始化构造后,数组列表根本就不含任何元素。
28. 对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,包装器还是final的,不能定义他们的子类。
29. 如果想定义一个整型数组列表,而尖括号中的类型参数不允许是基本类型
30. 在比较两个枚举类型的值时,永远不要使用equals,而是直接使用“==”就可以了。
31. 能够分析类能力的程序称为反射。反射机制的功能极其强大。反射机制可以用来:
1)在运行时分析类的能力。
2)在运行中查看对象,例如,编写一个toString方法供所有类使用。
3)实现通用的数组操作代码。
4)利用Method对象,这个对象很像C++中的函数指针。
32. 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每一个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。保存这个信息的类被称为Class。
33. 继承设计的技巧:
(1)将公有操作和域放在超类。
(2)不要使用受保护的域。
(3)使用继承实现is-a 的关系。
(4)除非所有继承的方法都有意义,否则不要使用继承。
(5)在覆盖方法时,不要改变预期行为。
(6)使用多态,而非类型信息。
(7)不要过多的使用反射。