有书共读】java核心技术卷1--第5章
================java核心技术卷1第5章-------继承========
1 类,超类和子类
2 Object3 泛型数组列表
4 包装器和自动装箱
5 参数可变方法
6 枚举类
7 反射
8 继承设计技巧
==================================================
1 类,子类与超类
1.1 如果我们定义一个类,并使用extends表面这个新类派生于一个已经存在的类,
那么已经存在的这个类即为超类,也叫基类或父类;要定义的这个新类为子类
1.2 覆盖方法:当超类中的方法对子类不一定适用时,需要在子类重新定义这个方法,及重写该方法
java中使用super.方法名 即可调用父类中的方法,C++中调用方式为:父类名::方法名
1.3 子类构造器:在子类中可以使用super调用超类的构造器,如子类没有显示的调用,则自动调用超类默认的构造器。
如果超类没有不带参数的构造器,且子类的构造器没有显示的调用其他构造器,则编译器或报错。
子类调用suoper构造器的语句必须实在子类构造器的第一条语句
1.4 继承与多态:由一个公共超类派生出来的集合被称为继承层次,Java不支持多继承,但是可以通过接口来实现
一个类只能继承一个类,但是可以实现多个接口
java中的多态形式:重载和重写;
重载:方法名一致,参数个数不同或者参数类型不同,返回类型可以不一致,可在一个类或继承中使用
重写:方法名一致,参数列表,返回类型都要求一致,只是具体实现不同,只能在继承类中
抽象类:用Abstract关键字修饰,类中的方法只声明,不实现,具体实现由子类实现;功能对应C++中的纯虚函数
instanceof :判断两个对象是否属于同一类型
2 Object
Java中有一句经典的话:万物皆对象,Java中所有的类都是由Object扩展而来,如果一个类没有明确指定它的父类,
那么Object就是它的父类或者父类的父类,或者父类的父类的...的父类
2.1 equals:用于检测一个对象是否与另一个对象相等
hashCode:生成每个对象的散列码
3 泛型数组列表
3.1 C++在设计数组的时候是在编译阶段确定数组大小的,一旦确定大小,更改就不那么容易了
而Java可以使用ArrayList自动调节数组容量大小,ArrayList是采用类型参数的泛型类,使用方法如:
ArrayList<ObjectType> array=new ArrayList<>();
List<ObjectType> array=new ArrayList<>();
3.2 在ArrayList中,添加元素用add,而set方法只能修改已经存在的元素值,
在ArrayList添加元素完毕后,通过toArray方法将数组中的元素拷贝到一个数组中,可以更方便访问数组元素
4 自动拆箱装箱
我们都知道,在Java中,万物皆对象。一个基本的数据类型,如int,都会有一个与之对应的类(Integer),
通常将这些类成为包装器。常见的包装器类有:
Integer,Long,Float,Double,Short,Byte,Character,Void,Boolean
如定义一个整形的List,尖括号内的数据类型事不允许出现基本类型的,而要使用包装类型:
List<Integer> list=new ArrayList<>();
5 参数可变方法
现在的Java版本可以提供可变参数数量调用的方法,如printf
用户也可以自己定义可变参数的方法,并将参数指定任意类型
6 枚举类
声明定义一个类,类里面是定义的实体。枚举类可以又构造器,方法,域;构造器只有在构造枚举常量的时候使用
7 反射
7.1 能够用来分析类的程序成为反射,反射机制可以:
运行时分析类的能力
运行时查看对象
在通用的数组操作代码
利用method对象
class类:
程序运行期间,Java运行时始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,
虚拟机利用运行时的类型信息选择相应的方法执行。也可以通过专门的Java类访问这些信息,保存这些信息的类成为class
Oject 的getClass()方***返回一个Class类型的实例,用getName()可以获取类的名字
7.2 捕获异常
当程序运行时发生错误时,就会抛出异常,如果没有提供捕获异常的处理器,程序就会终止
异常用两种类型:未检查异常和已检查异常,对于已检查异常,编译器会检查是否提供了处理器;
对于未检查异常,编译器不会查看是否未这些错误提供了处理器,捕获异常 常用的形式
try{
statements...
}catch(Exception e){
handler action
}
7.3 反射能力
检查类的机构:java reflect 类中包含3个类,Field,Method,Constructor分别用于描述类的域,方法,和构造器
三各类都有getName()方法,用于返回项目的名称
7.4 使用反射编写泛型数组代码:Java.lang.reflect包中的Array类运行动态创建数组
8 继承设计技巧
将公共类操作和域放在父类
不要使用收保护的域
使用继承实现"is-a"关系
除非所有继承的方法都有意义,否则不使用继承
在覆盖方法时,不要改变预期的行为
使用多态,而非类型信息
不要过多使用反射