Java入门(十二)——多态

Java入门(十二)——多态

目录

Java入门(十二)——多态

多态

涉及的概念

作用

instanceof运算符

范例代码


多态

涉及的概念

           * 向上转换(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();
		}
		
	}

}

猜你喜欢

转载自blog.csdn.net/qq_61562251/article/details/135046406