5 继 承
5.1 类、超类和子类
用super访问父类。
由于子类无法直接访问超类的私有域,所以子类对超类私有域的初始化必须调用超类的构造器。
如果子类的构造器没有显式调用超类的构造器,则自动调用超类的无参构造器。
this用途:一是引用隐式参数,二是调用该类的其他构造器。
super用途:一是调用超类的方法,二是调用超类的构造器。
一个对象变量可以指示多种实际类型的对象被称为多态。在运行时能够自动选择调用哪个方法被称为动态绑定。
1 继承层次
由一个公共超类派生出来的所有类的集合被称为继承层次。
2 多态
程序中出现超类对象的任何地方都可以用子类对象置换。
3 动态绑定
当调用的方法是private、static、final或者构造器,编译器可以准确知道应该调用哪个方法,这种调用方式叫做静态绑定。
相对的,动态绑定只针对于public方法,虚拟机调用与x所引用对象的实际类型最合适的那个类的方法。
虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。
在覆盖方法的时候,子类方法不能低于超类方法的可见性。
4 阻止继承:final类和方法
final类不允许扩展。
5 强制类型转换
进行类型转换的原因:在暂时忽视对象的实际类型之后(使用超类的引用指向,进行一些通用操作),使用对象的全部功能(强制转换为具体的子类引用,执行子类的操作)。
在将超类转换成子类之前,可以用instanceof进行类型检查。
6 抽象类
除了抽象方法之外,抽象类可以包含具体数据和具体方法。
扩展抽象类:一、在子类中定义部分抽象方法或抽象方法也不定义,这样就必须将子类也标记为抽象类。二、定义全部的抽象方法,这样子类可以不是抽象的。
抽象类不能被实例化。
7 受保护访问
让超类的某些方法允许被子类访问,或者允许子类的方法访问超类中的某个域,则设置为protected。
5.2 Object:所有类的超类
在java中,只有基本类型不是对象。
1 equals方法
getClass方法将返回一个对象所属的类
2 相等测试与继承
3 hashCode方法
4 toString方法
对象值的字符串:类的名字+方括号括起来的域值。
Object类定义的toString方法:输出对象所属类名和散列码。
5.3 泛型数组列表
ArrayList是一个采用类型参数的泛型类。
1 访问数组列表元素
get和set方法:访问list的元素。
toArray方法:list.toArray(a),将list的每个元素拷贝到一个数组a中。
2 类型化与原始数组列表的兼容性
5.4 对象包装器与自动装箱
基本类型都有一个与之对应的类。
对象包装器是不可变的,一旦构造了包装器,就不能更改其中的值。
自动装箱:系统将list.add(3)自动转换为list.add(Integer.valueOf(3))
自动拆箱:将一个Integer对象赋值给一个int值时,会自动拆箱。
5.5 参数数量可变的方法
public static double max(double...values){
double largest = Double.MIN_VALUE;
for(double v : values) if(v > largest) largest
= v;
return largest;
}
double定义了类型,接收的参数是一个数组values[]。
5.6 枚举类
public enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};
在比较两个枚举类型的值时,不需要调用equals,直接使用==。