第十章 接口、继承与多态
10.1 类的继承(extends关键字)
1.继承的基本思想是基于某个父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。
2.可以在子类的构造方法中使用super()语句调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法,但子类没有权限调用父类中被修饰为private的方法。
重写方法
3.继承也可以重写(也称覆盖)父类的成员方法。重写就是在子类中将父类的成员方法的名字保留,重写成员方法的实现内容,更改成员方法的存储权限,或修改成员方法的返回值类型。
3.重构(一种特殊的重写方式),子类与父类的成员方法返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容。
4.重写父类方法时,修改方法的权限只能从小的范围到大的范围改变。
5.子类重写父类可以修改方法的返回值类型,但重写的返回值类型必须是父类中同一方法返回值类型的子类。
6.当实例化子类对象是,父类对象也相应被实例化。换句话说,在实例化子类对象时,java编译器会在子类的构造方法中自动调用父类的无参构造方法。
7.实例化子类对象时,父类的无参构造方法被自动调用,但有参构造方法并不能被自动调用,只能依赖于super关键字显式地调用父类的构造方法。
10.2 Object类
在java中,所有的类都直接或间接继承了java.lang.Object类,它是所有类的子类,是java类层中的最高层类。1. getaClass()方法
它会返回对象执行时的Class实例,然后可使用getName()方法获取类的名字。
语法: getClass().getName();
2. toString()方法
将一个对象返回为字符串形式,它会返回一个String实例。实际应用中通常重写toString()方法,为对象提供一个特定的输出模式。3. equals()方法
equals()方法的默认实现是使用“==”运算符比较两个对象的引用地址,而不是对象的内容,所以想真正比较两个对象内容,需要在自定义类中重写equals()方法。10.3 对象类型的转换
1. 向上转型
就是将子类转型成父类,通过父类型引用指向子类型对象来实现动态调用。一个具体类到较抽象类之间的转换。 语句:Shape s = new Circle();2.向下转型
将抽象类转换为较具体类。向上转型是自动进行的,但是向下转型却不是,需要我们强制进行类型转换。这种方式称为显式类型转换。B b = new B();
A a = b;
B bb = (B)a;
3.分析
记住一个简单而又复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量,你可能说这个规则不对,因为父类引用指向子类对象时,最后执行的是子类的方法。其实这并不矛盾,那是因为采用了后期绑定(多态),运行时编译器又根据引用指向的实际类型去调用了子类的方法,而假若子类的这个方法在父类中并没有定义,则编译会出错。 当你使用父类引用指向子类对象的时候,其实jvm(java virtual machine)已经使用了编译器产生的类型信息调整转换了。这里你可以这样理解,相当于把不是父类中含有的方法从虚拟函数表中设置为不可见的,注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的方法体的地址了。10.4 instanceof判断对象类型
当程序执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型前需要判断父类对象是否为子类对象的实例。 这个判断通常使用instanceof操作符来完成。它可判断一个类实现了某个接口,也可以用来判断一个实例对象是否属于一个类。 语法: myobject instanceof ExampleClass//myobject某类对象引用;ExampleClass某个类10.5 方法的重载
方法重载:让方法名相同而形参不同的构造方法同时存在。同样也可以应用到非构造方法中。 class MethodOverloading {void receive(int i) {
} void receive(float f) { } void receive(int i,int j) { } } 重载中可以使两个方法返回值不同,但只有返回值不同并不可以区分两个方法重载,需要通过参数的个数以及参数类型来设置。
1. 不定长参数方法
语法: 返回值 方法名(参数数据类型 参数名称) 使用“ ”形式定义不定长参数,编译器会将(int a)这种形式看做是(int[]a),所以在add()方法体做累加操作时使用到for循环语句,循环中根据数组a的长度作为循环条件。 public static int add(int...a){int s=0;
for(int i=0;i
return s;
} public static void main(String args[]){
System.out.println("调用不定长参数方法:"+add(1,2,3,4,5,6,7,8,9));
}
10.6 多 态
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。