基本定义:继承是一种is-a的关系,比如上一篇中提到的Employee类(员工类)和Manager类(经理类),实际上经理也是属于员工,但是,待遇跟普通员工不一样,就可以把Employee类当做父类(或者称为超类、基类),而把Manager看做是子类。用关键字extends表示继承。
覆盖方法:当父类有些方法在子类中不适用是,子类中可以写一个新的方法覆盖父类的方法。例如,员工的总工资就是当月工资(在父类中的getSalary方法),而经理的工资是当月工资加奖金,这时候,我们可以在Manager类中改写getSalary方法。
强制性类型转换:不单单是基本类型之间可以强制性装换,也可以将一个对象引用强制性转换为另一个对象引用。在Java中,每个对象变量都属于一个类型。一般,在转换之前我们要检查是否可以进行强制性转换。
注意:在Java中,子类数组的引用可以转化为父类数组的引用,不需要采用强制性转化,而父类转化为子类需要强制性转化。就拿Employee类与Manager类来说,不是所有的员工都是经理。因此,
1、只能在继承层次内进行类型转换。
2、将父类转化为子类之前,应该使用instanceof进行检查。
假如想要阻止人们定义某个类的子类,这时候就可以在定义这个类的时候使用final修饰符。对于final来说,在构造对象之后,就不允许改变它们的值了。如果一个类被声明为final类,这个类中的所有方法也会默认为final,但,不包括域。
方法的调用:假设要调用某个类中的方法,
1、首先,编译器查看对象的声明类型和方法名。需要注意的是,在一个类中可能存在许多方法名相同的方法,假设方法名为f,这时候编译器会一一列举该类中方法名为f的方法,以及父类中方法名为f的方法。
2、接下来,编译器会查看调用这个方法时提供的参数,找到最匹配的方法,就选择这个方法,这个过程叫做重载解析。
3、如果是private方法、static方法、final方法或者构造器,那么编译器就可以准确地知道要调用哪个方法,这种调用称作静态绑定。
4、当程序运行并采用动态绑定时,虚拟机调用与该引用类型最匹配的那一个。
抽象类:例如,在一个学校里,有学生类和员工类(包括老师类),这两个类中存在共有的属性,比如姓名,这时就可以创建一个Person类,可以使用关键字abstract修饰。为提高程序的清晰度,包含一个或者多个抽象方法的类本身必须声明为抽象的。
注:1、一个类即使不含有抽象方法,也可以声明为抽象类。
2、抽象类不能被实例化。
3、在c++中,抽象类声明,有一种在尾部用=0标记。
Java中四种控制可见性的修饰符:
1、private-----仅对本类可见。
2、protected-----对本包和所有子类可见。
3、默认,不需要修饰符-----对本包可见。
4、public----对所有类可见。
Object类:Object类是所有类的父类,虽然没有用extend关键字,但是默认就是Object类的子类。因此,可以用Object类型的变量引用任何类型的变量。例如:Objectobj=new Employ();
注:1、在Java中,只有基本类型不是对象。
2、所有类型数组,不管是对象数组还是基本类型数组,都拓展了Object类。
3、在c++中,没有所有类的跟类,但是,每个类型都可以转换为void*指针。
hashcode方法:散列码(hash code)室友对象导出的整型值(可以为负数),没有规律。
1、字符串的散列码由内容导出。
2、两个相同的对象,放回的散列码相同。