一、概述
继承:是面向对象程序设计的一个基本概念,利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。
反射:指在程序运行期间发现更多的类及其属性的能力。
二、类,超类和子类
关键字extends表示继承,表明正在构造的新类派生于一个已存在的类,已存在的类称为超类,基类或父类;新类称为子类,派生类或孩子类。
在子类中可以增加域,增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。
super关键字也有两种用途:一是调用超类的方法;二是调用超类的构造器。
一个对象变量可以指示多种实际类型的现象称为多态。在Java程序设计语言中,对象变量是多态的。
在运行时能够自动的选择调用哪个方法的现象称为动态绑定。
动态绑定有一个非常重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展。
由一个公共超类派生出来的所有类的集合被称为继承层次。在继承层次中,从某个特定的类到其祖先的路径被称为该类的继承链。
方法的调用过程:
1、编译器查看对象的声明类型和方法名。
2、编译器将查看调用方法时提供的参数类型。(如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程被称为重载解析)
3、如果是private方法,static方法,final方法或者构造器,那么编译器就可以准确的知道应该调用哪个方法。(这种调用方法被称为静态绑定)
4、当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型嘴合适的那个类的方法。
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。
不允许扩展的类被称为final类,在定义类的时候使用了final修饰符。
将方法或类声明为final主要目的是:确保它们不会在子类中改变语义。
如果一个方法没有被覆盖并且很短,编译器就能够对它进行优化处理,这个过程被称为内联。
进行类型转换的唯一原因是:在暂时忽视对象的实际类型之后,使用对象的全部功能。
类型转换的条件:
1、只能在继承层次内进行类型转换。
2、在将超类转换成子类之前,应该使用instanceof进行检查。
为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的。除了抽象方法之外,抽象类还可以包含具体数据和具体方法。抽象类不能被实例化。
可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。
扩展抽象类可以有两种选择:
1、在抽象类中定义部分抽象类方法或不定义抽象类,这样就必须将子类也标记为抽象类。
2、定义全部的抽象方法,这样子类就不是抽象的了。
Java用于控制可见性的四个访问修饰符:
1、仅对本类可见——private。
2、对所有类可见——public。
3、对本包和所有子类可见——protected。
4、对本包可见——默认,不需要修饰符。
三、Object:所有类的超类
在Java中,只有基本类型不是对象。
Object类中的equals方法用于检测一个对象是否等于另外一个对象。这个方法将判断两个对象是否具有相同的引用。
Java语言规范要求equals方法具有下面的特征:
1、自反性:对于任何非空引用x,x.equals(x)应该返回true。
2、对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true。
3、传递性:对于任何引用x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true。
4、一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。
5、对于任意非空引用x,x.equals(null)应该返回false。
散列码(hash code)是由对象导出的一个整型值。
toString方法用于返回表示对象值得字符串。只要对象与一个字符串通过操作符“+”连接起来,Java编译就会自动的调用toString方法,以便获得这个对象的字符串描述。
四、泛型数组列表
ArrayList是一个采用类型参数的泛型类。
size()方法将返回数组列表中包含的实际元素数目。
五、对象包装器与自动装箱
所有的基本类型都有一个与之对应的类,这些类称为包装器。
对象包装器是不可变的,还是final,因此不能定义它们的子类。
六、枚举类
在比较两个枚举类型的值时,直接使用“==”就可以了。
toString的逆方法是静态方法valueOf。
每个枚举类型都有一个静态的values方法,它将返回包含全部枚举值的数组。
ordinal方法返回enum声明中枚举常量的位置。
七、反射
反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。
能够分析类能力的程序称为反射,反射机制可以用来:
1、在运行时分析类的能力。
2、在运行时查看对象。
3、实现通用的数组操作代码。
4、利用Method对象。
八、继承的设计技巧
1、将公共操作和域放在超类。
2、不要使用受保护的域。
3、使用继承实现“is-a”关系。
4、除非所有的继承方法都有意义,否则不要使用继承。
5、在覆盖方法时,不要改变预期的行为。
6、使用多态,而非类型信息。
7、不要过多的使用反射。