Java入门(十二)——多态
目录
多态
涉及的概念
* 向上转换(upcasting、自动类型转换):
- 子类型 ——> 父类型
* 向下转换(downcasting、强制类型转换):
- 父类型 ——> 子类型
【无论是向上转换还是向下转换,两种类型之间必须要有继续关系,否则无法提供】
对象编程的核心:定义好类,然后将类实例化为对象,给一个环境驱使一下,让各个对象之间协作形成一个系统
作用
- 减低出现的耦合度,提高程序的扩展力
- 能使用多态尽量使用
- 父类型引用指向子类型对象
instanceof运算符
* 用法:
* 语法格式:
(引用 instanceof 数据类型名)
- 以上运算符的执行结果类型是布尔类型(true/false)
* 常用在“java.lang.ClassCastException”的错误判断上:
假设:(a instanceof Animal)
- true :表示这个引用指向的对象是一个Animal类型
- false :表示这个引用指向的对象不是一个Animal类型
- 建议在强制转换之前,使用instanceof运算符进行判断,避免异常发生
范例代码
class Animal{
public void move() {
System.out.println("动物在动");
}
}
class Cat extends Animal{
public void move() {
System.out.println("猫咪在走");
}
public void eat() {
System.out.println("猫咪在吃鱼");
}
}
class Fish extends Animal{
public void move() {
System.out.println("鱼在游");
}
}
public class Polymorphic {
public static void main(String[] args) {
Animal cat = new Cat();
//将cat这个对象定为Animal类型,指向Cat对象
//实则是,创建对象为Cat,通过Animal类型下有的方法属性,调用。
//Animal和Cat之间存在继承关系,子类型转成父类型,是自动转换类型(向上转换)
cat.move();
//cat.eat();
//上面的程序错误
//原因:编译器检测到cat的类型是Animal,但是Animal.class字节码文件中查找不到eat()方法,导致静态绑定失败
System.out.println("-------------向上转换---------------");
Cat cat1 =(Cat)cat;
cat1.eat();
//强制类型转换,将cat转换为Cat类型的cat1.形同于:long x=100L; int i=(int)x;
//由于cat中无法直接调用子类特有的方法,所以需要向下转换类型
//但是因为是强制转换,所以会存在一定风险出错
System.out.println("-------------向下转换---------------");
//Cat fish = new Fish();
//上面的程序错误
//原因:二者不存在继承关系
//Fish cat2=(Fish)cat;
//cat2.move();
//上面代码编译未显示错误,但是运行时出现“java.lang.ClassCastException”的错误
//原因:在向下转换中,编译器认为是Animal类型向Fish类型转换,但是实际的运行是Cat对象转换到Fish类型,由于二者不存在继承关系,所以转换类型出错
System.out.println("-------------常见错误---------------");
if(cat instanceof Fish) {
Fish a=(Fish)cat;
a.move();
}
else if(cat instanceof Cat) {
Cat b =(Cat)cat;
b.move();
b.eat();
}
}
}