- 可以基于已存在的类构造一个新类,复用(继承)这些类的方法和域,可以添加一些新的方法和域
- “is-a”(是)关系
一个子类到父类的路径被称为该类的继承链,父类可以拥有多个子类继承链,Java不支持多继承
子类:extends
在Java中,所有的继承都是公有继承
- 应该将通用的方法放在超类中,而将具有特殊用途的方法放在子类中
在子类中可以增加域、增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。
重写:override
不能够直接地访问超类的私有域
- 只有Employee类的方法才能够访问私有部分
- 关键字super
因为super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字
子类构造器
子类必须通过父类构造器对父类私有域进行初始化,用super调用父类构造器
- super调用构造器的语句必须放在子类构造器的第一条语句
- 如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用超类的其他构造器,则Java编译器将报告错误
- 关键字this有两个用途:一是作为引用隐式参数,二是调用该类其他的构造器
- 关键字super也有两个用途:一是调用超类的方法,二是调用超类的构造器
构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器
多态:程序中出现超类对象的任何地方都可以用子类对象置换
即在Java程序设计语言中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象
Employee e;e = new Employee(...);e = new Manage(...);Manage boss = new Manage(...);Employee[] staff = new Employee[3];staff[0] = boss;
但编译器将staff[0]看成Employee对象,所以:boss.setBouns(…);//OK staff[0].setBouns(…);//Error
- 不能将一个超类的引用赋给子类变量(不能向下转型)
- 在Java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换
所有数组都要牢记创建它们的元素类型,并负责监督仅将类型兼容的引用存储到数组中
重载:overload(覆盖)
即在子类中定义了一个与超类签名相同的方法
- 返回类型不是签名的一部分,因此,在覆盖方法时,一定要保证返回类型的兼容性
- 允许子类将覆盖方法的返回类型定义为原返回类型的子类型
- 如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,我们将这种调用方式称为静态绑定(static binding)
-
阻止继承:final类和方法—确保它们不会在子类中改变语义
强制类型转换:
只有在使用Manager中特有的方法时才需要进行类型转换
- Manage boss = (Manage)staff[0];
- 即暂时忽视对象的实际类型之后,使用对象的全部功能
在将超类转换成子类之前,应该使用instanceof进行检查
抽象类:abstract
只将它作为派生其他类的基类,而不作为想使用的特定的实例类;提高通用性
- 可以写一个空字符串或使用abstract
除了抽象方法之外,抽象类还可以包含具体数据和具体方法
public abstract class Person{private String name;public Person(String name){this.name = name;}public abstract String getDescription();public String getName(){return name;}}
不能包含具体方法
- 继承或实现抽象类
- 抽象类不能被实例化。
受保护访问:proteced
- 只能访问相互继承的域和方法
Object:所有类的超类
- 如果没有明确地指出超类,Object就被认为是这个类的超类
- 可以使用Object类型的变量引用任何类型的对象
- Object类型的变量只能用于作为各种值的通用持有者。要想对其中的内容进行具体的操作,进行相应的类型转换,再执行操作
在Java中,基本类型不是对象,数组是对象类型,都扩展了Object类
equals方法
-
hashcode方法
散列码(hash code)是由对象导出的一个整型值,没有规律的
toString方法
返回表示对象值的字符串
- 静态方法Arrays.toString;多维数组Arrays.deepToString
-
泛型数组列表:ArrayList类
在添加或删除元素时,具有自动调节数组容量的功能;
在Java的老版本中,使用Vector类实现动态数组- 使用范型指定数组元素类型
- 如果已经清楚或能够估计出数组可能存储的元素数量,就可以在填充数组之前调用ensureCapacity方法,设置大小
