以下内容总结于各种参考资料,仅用于督促自己的学习
多态是同一个行为具有多个不同形式或形态的能力。多态性是对象多种表现形式的体现。
Java引用变量有两个类型:编译时类型、运行时类型。编译时类型由声明该变量时使用的类型所决定,运行时类型由实际赋给该变量的类型所决定。如果两个类型不一致,就可能出现多态(Polymorphism)。
1、多态性
多态存在的三个必要性条件:
1) 继承
2) 重写(覆盖)
3) 父类引用指向子类对象
例如:
Person p = new Student();
P引用变量的编译时类型为Person,运行时类型为Student.
与方法不同的是,对象的实例变量不具备多态性。比如说p引用变量,输出某个同名实例变量时,并不是输出Student类里定义的实例变量,而输出的是Person类里定义的实例变量。
2、引用变量的强制类型转换
引用变量只能调用其编译时类型的方法,而不能调用其运行时类型的方法,因此要想调用,就必须将其强制转换成运行时类型。
类型转换运算符是小括号:(type)variable,将变量variable转换成type类型的变量。
注意:
1) 基本类型之间的转换只能在数值类型(整数型、字符型、浮点型)之间进行,但数值类型和布尔类型之间不能进行类型转换。
2) 引用类型之间的转换只能在具有继承关系的两个类型之间转换,否则编译会出现错误。如果把父类转换成子类实例,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型为子类类型),否则将在运行时引发ClassCastException异常。
3、instanceof运算符
考虑到进行强制类型转换时可能会出现异常,因此进行转换之前应先通过instanceof运算符来判断是否可以进行转换,使代码更健壮,它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例,是,返回true,否,返回false。
举例:
public class Test {
public static void main(String[] args) {
show(new Man()); // 以 Man 对象调用 show 方法
show(new Woman()); // 以 Woman 对象调用 show 方法
Person p = new Man(); // 向上转型
p.walk(); // 调用的是 Man 的 walk
Man m = (Man)p; // 向下转型
p.hair(); // 调用的是 Man 的 hair
}
public static void show(Person p) {
p.walk();
// 类型判断
if (p instanceof Man) { // 男人的头发
Man m = (Man)p;
m.hair();
} else if (p instanceof Woman) { // 女人的头发
Woman w = (Woman)p;
w.hair();
}
}
}
abstract class Person {
abstract void walk();
}
class Man extends Person {
public void walk() {
System.out.println("走路快");
}
public void hair() {
System.out.println("头发短");
}
}
class Woman extends Person {
public void walk() {
System.out.println("走路优雅");
}
public void hair() {
System.out.println("头发长");
}
}
执行以上程序,输出结果为:
走路快
头发短
走路优雅
头发长
走路快
头发短