多态基础语法

关于java语言中的多态语法机制:
1.Animl,Cat,Bird 三个类之间的关系:
Cat继承Animal
Bird继承Animal
Cat和Bird之间没有任何继承关系
2.面向对象三大特征:封装,继承,多态
3.关于多态中涉及到的几个概念
向上转型( upcasting)
-子类型转换成为父类型
又称为:自动类型转换
向下转型(downcasting)
-父类型转换为子类型
又称为:强制类类型转化。【需要加强制类型转换】
【无论是向下转型还是向上转型,都必须要有继承关系】
.

public static void main(String[] args)
{
	//使用多态语法机制
	/*
		1.Animal 与 Cat存在着继承关系,其中Animal 是父类,Cat是子类
		2.对于下面的语句 ,a1 的引用数据类型是Animal  , a1创建的数据对象			为Cat
		3.所以存在着类型转换,从Cat()类变成了 Animal类 ,所以为向上类型转		换 / upcasting / 或者称为自动类型转换
		4.java允许这种语法:父类型引用指向子类型对象
	*/
	Animal a1 = new Cat();   //把子类赋给父类
	
	//java程序分为编译阶段和运行阶段
	//编译阶段,编译器只会识别a1的类型为Animal类型
	
	******编译看引用对象,运行看实际创建的对象***********
	 
	//编译阶段编译器检查a2这个引用数据类型为Animal,由于Animal.class
	//字节码当中有move()方法,所以编译可以通过。这个过程称为静态绑定,编译阶段绑定
	//只有静态绑定后才有后续的运行

	//在程序运行阶段,JVM堆内存当中真实创建的对象是Cat对象,那么以下程序在运行阶段一定会调用Cat对象的move()方法,此时发生了动态绑定,运行阶段绑定
	//记住底层是什么对象,就调用什么方法

	//无论是Cat类有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为底层真实对象就是		Cat对象
	
	//父类型引用指向子类型对象这种机制导致程序存在编译阶段绑定和运行阶段绑定两种不同的形态/状态
	
	这种机制可以成为一种多态语法机制
	a1.move()
}


向下转型

需求:
	//a2.catchmouse();  想要对象执行catchMouse()方法,如何实现  因为Animal内部是没有catchMouse()方法的
	//可以a2强制类型转换为Cat类型
	//a2的类型是Animal(父类),转换成Cat类型(子类),被称为向下转型/downcasting/强制类型转换

首先:向下转型也需要两种类型之间须有继承关系。不然编译器会报错
	
注:向下转型也需要两种类型之间必须有继承关系,不然编译报错。强制类型转换需要加强制类型转换符


什么时候需要向下转型呢?
		当调用方法是子类型中特有的,在父类型中不存在,必须向下转型
语法:Cat c2 = Cat(a2);
c2.catchmouse();

	//父类型引用指向子类型对[多态]
	Animal a3 = new Bird();
	
	/*
	1.以下程序编译是没有问题的,因为编译器检查到a3的数据类型是Animal
	Animal和Cat之间存在继承关系,并且Animal是父类型,Cat是子类型
	父类型转换成子类型叫做向下转型,语法合格
	
	2.程序虽然编译通过,但是程序在运行阶段会出现异常,因为JVM堆内存当中真实存在的对象是Bird类型,
	Bird对象无法转换成Cat对象,因为两种类型之间不存在任何继承关系,此时出现了著名的异常:
			java.lang.ClassCasException
			类型转换异常,这种异常总是在“向下转型”的时候会发生
	*/
	Cat c3 = (Cat)a3;
	
	/**
		1.以上异常只有在强制类型转换的时候会发生,也就是说“向下转型”存在隐患(编译过了,但是运行错了!)
		2.向上转型只要编译通过,运行一定不会出问题
		3.向下转型编译通过,运行可能错误
		4.怎么避免向下转型出现的ClassCastException呢?
			使用instanceof运算符可以避免出现以上的异常。

		5.instanceof运算符怎么用?
		5.1(引用 instanceof 数据类型名)
		
		5.2以上运算符的执行结果类型是布尔类型,结果可能是true/false
		
		5.3关于运算结果true / false:
		假设:(a instanceof Animal)
		true表示:
			a这个引用指向的对象是一个Animal类型。
		false表示:
			a这个引用指向的对象不是一个Animal类型
		Java规范中要求:在进行类型转换之前需要有instance进行判断
	*/
	
	向下转型的目的是想要访问子类内部特定的方法
	if(a3 instanceof Cat){
	Cat c3 = (Cat)a3;
	c3.catchMouse();
	}else if(a3 instanceof Bird){
	Bird b2 = (Bird)a3;
	b2.fly();
	}
 	//以上主要是要先有一个判断过程,在进行强制类型转换之前需要有一个类型判断,需要相对应的类型之间才能互相转换,比如Bird类型和Cat类型之间不能够相互转换,但是他们都是Animal的子类,所有可能会出现类型转换异常
 	







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值