继承
类、超类和子类
定义子类
- 通过扩展超类定义子类的时候,只需要指出子类与超类的不同之处。
将一般的方法放在超类中,而将更特殊的方法放在子类中。
覆盖方法
- 继承可以增加字段、方法或覆盖方法但绝对不会删除任何字段或方法。
子类构造器
- 如果子类的构造器没有显式地调用超类地构造器,将自动调用超类的无参数构造器
多态
- 程序中出现超类对象的任何地方都可以使用子类对象替换。
- 子类引用的数组可以转换成超类引用的数组,而不需要使用强制类型转换,但所有数组都要牢记创建时的元素类型,并负责监督仅将类型兼容的引用储存到数组中。
理解方法调用
- 如果在子类中定义了一个与超类签名相同的方法,那么子类中的这个方法就会覆盖超类中这个相同签名的方法。
- 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是,如果超类方法是public,子类方法必须也要声明为public。
阻止继承:final类和方法
不允许扩展的类被称为final类。类中的某个特定方法也可以被声明为final,则子类不能覆盖这个final方法。
- final类中的所有方法都自动称为final方法,但字段不为final。
强制类型转换
- 强制类型转换的唯一原因:要在暂时忽略对象的实际类型之后使用对象的全部功能。
- 如果将一个子类的引用赋给一个超类变量,编译器是允许的。但将一个超类的引用赋给一个子类变量时,就承诺过多了。必须进行强制类型转换,这样才能通过运行时的检查。
抽象类
- 祖先类具有一般性,只需将它作为派生其他类的基类,而不是用来构造想使用的特定实例。
- 使用abstract关键字,这样就不需要实现不需要实现的方法。
- 为了提高程序的清晰度,包含一个或多个abstract方法的类本身必须被声明为abstract类。
- abstract方法充当着占位方法的角色,它们在子类中具体实现。
- 即使不含abstract方法,也可以将类声明为abstract类。
- abstract不能实例化。
- 可以定义一个abstract类的对象变量,但是改变量只能引用非abstract子类的对象
Object类:所有类的超类
Object类是java中所有类的始祖,java每个类都扩展了Object类,但不需要手动写extends Object。JVM和编译器会进行处理。
Object类型的变量
- 可以使用Object类型的变量引用任何类型的对象
Object obj= new 任何对象类();
- 在java中,只有基本类型不是对象。
equal方法
- 检测一个对象是否等于另外一个对象
- getClass方法将返回一个对象所属的类,只有两个对象属于同一个类时,才有可能相等。
相等测试与继承
- 如果子类可以有自己的相等性概念,则对称性需求强制使用getClass检测。
- 如果由超类决定相等性概念,使用instanceof检测,可以在不同子类的对象之间进行相等性比较
hashCode方法
- 散列码(hash code)是由对象导出的一个整型数值(可以为负值),没有规律。
- hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值由对象的储存地址得出。
toString方法
可以返回对象值的一个字符串。
- 重写toString方法时,最好不要将类名写死,最好通过调用getClass().getName()获得类名的字符串,这样toString方法也可以由子类调用。子类可以调用super.toString+子类字段。
泛型数组列表
//TODO
对象包装器与自动包装
包装器类型是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。
包装器类为final,不能派生出子类。
参数数量可变的方法
方法入参如果有...,表面这个方法可以接收任意数量的对象
枚举类
- 枚举的构造器总是私有的private,改字段可以省略。 如果声明一个enum构造器为public或protected,会出现语法错误。
反射
反射库:java提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵java代码的程序。
能够分析类能力的程序称为反射。反射功能极其强大:
- 在运行时分析类的能力。
- 在运行时检查对象,例如,编写一个适用于所有类的toString方法
- 实现泛型数组操作代码。
- 利用Method对象,这个对象很像C++中的函数指针。
Class类
- 在程序运行期间,java运行时系统始终为所有对象维护一个运行时类型标识,这个信息会跟踪每个对象所属的类。
- 保存这些信息的类名为Class,Object类中的getClass()方法将会返回一个Class类型的实例。
- 在启动时,包含main方法的类被加载,它会加载所有需要的类。这些被加载的类又要加载它们需要的类,以此类推。
- 虚拟机为每个类型管理一个唯一的Class对象。
继承的设计技巧
- 将公共操作和字段放在超类中
- 不要使用protected的字段
- 使用继承实现"is-a"关系
- 除非所有继承的方法都有意义,否则不要使用继承
- 在覆盖方法时,不要改变预期行为
- 使用多态,而不要使用类型信息
- 不要滥用反射
Comments | 0 条评论