类、超类和子类
- 关键字extends表明正在构造的新类派生于一个已存在的类
- 设计类时,应该将通用的方法放在超类中,而将具有特殊用途的方法放在子类中
- 覆盖方法override
- super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字
- 在子类中可以增加域、增加方法或覆盖超类的方法,但是绝对不能删除继承的任何域和方法
- 可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是子类构造器的第一条语句,所以this和super不能同时在构造器中使用
- 一个对象变量可以指示多种实际类型的现象被称为多态Polymorpgism,在运行时能够自动选择调用哪个方法的现象称为动态绑定dynamic binding
- 由一个公共超类派生出来的所有类的集合被称为继承层次hierarchy,在继承层次中,从某个特定的类到其祖先的路径被称为该类的继承链chain
- 在覆盖一个方法时,子类方法不能低于超类方法的可见性
- 不允许扩展的类被称为final类
- 将一个超类的引用赋给一个子类变量,必须进行类型转换
- instanceof
- 为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的
- 除了抽象方法外,抽象类还可以包含具体数据和具体方法。
- 抽象类不能被实例化
- 可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象
- protected
Object:所有类的超类
- 只有基本类型Primitive types不是对象
- 在Object中,equals方法判断两个对象是否具有相同的引用
- equals方法具有以下特性:自反性,对称性,传递性,一致性,对于任意非空引用x,x.equals(null)应该返回false
- 使用==比较基本类型域,使用equals比较引用域
- 覆盖超类方法可以用到@Override
- hashCode()方法
- Object中的toString方法用于返回表示对象值的字符串
泛型数组列表
- ArrayList是一个采用类型参数type Parameter的泛型类 Generic class,为了指定数组列表保存的元素对象类型,需要用一对尖括号括起来加在后面
- 使用add方法可以将元素添加到数组列表中
- size方法将返回数组列表中包含的实际元素数目
- 使用get和set方法实现访问或改变数组元素的操作
- 没有泛型类时,原始的ArrayList类提供的get方法只能返回Object,因此,get方法的调用者必须对返回值进行类型转换
- remove方法删除一个元素
- 类型化数组列表兼容原始数组列表
- 一旦能确保不会造成严重的后果,可以用注解@SuppressWarnings("unchecked")来忽略变量的警告
对象包装器与自动装箱
- 装箱和拆箱是编译器认可的,而不是虚拟机
参数数量可变的方法
- Object...参数类型与Object[]完全一样
枚举类
- 比较枚举类型的值时,直接使用 ==
- toString的逆方法是静态方法valueOf
反射Reflection
- 反射机制可以用来:在运行时分析类的能力;在运行时查看对象;实现通用的数组操作代码;利用Method对象。
- getClass().getName()
- newInstance可以用来动态地创建一个类的实例
- 使用反射编写泛型数组代码
- Method类中有一个invoke方法,它允许调用包装在当前Method对象中的方法
- invoke方法的签名是:Object invoke(Object obj,Object...args)第一个参数是隐式参数,其余的对象提供类显式参数
继承的设计技巧
- 将公共操作和域放在超类
- 不要使用受保护的域
- 使用继承实现is-a关系
- 除非所有继承的方法都有意义,否则不要使用继承
- 在覆盖方法时,不要改变预期的行为
- 使用多态,而非了类型信息
- 不要过多地使用反射