Java之面向对象的特征三---多态性

1、理解多态性*:可以理解为一个事物的多种形态
2、何为多态性:可以称为对象的多态性,即父类引用指向子类对象或子类对象赋给父类的引用
3、多态性的使用(虚拟方法调用)
有了对象的多态以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边
4、多态的使用前提;①类的继承关系②方法的重写
5、对象的多态性:只适用于方法,不适用于属性

public class PersonTest {
	public static void main(String[] args) {
		//对象的多态性:父类引用指向子类对象
		Person p1 = new Man();
		//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法---虚拟方法调用
		p1.eat();//执行的是子类重写的eat()方法
		p1.walk();
		
		System.out.println("*************************************");
	}

特别说明:有了对象的多态性以后,内存中实际上是加载了子类特意又的属性和方法的,但是由于便是声明为Person类型的,编译时,只能调用父类中声明的属性和方法,子类中特有的属性和方法不能调用。
问题引入:如何才能调用子类特有的属性和方法呢?
答:使用强制类型转换(向下转型)。
但是使用强转,可能出现ClassCastException的异常。因此我们必须使用instancof关键字来避免出现异常

instanceof关键字的使用
a instanceof A;判断对象a是否是类 A的实例,如果是返回true,否则返回false。
使用情境:为了避免在向下转型时出现ClassCastException的异常 我们在向下转型之前,先进行instanceof的判断。一旦是返回true就进行向下转型,如果返回false就不进行向下转型
补充:如果a instanceof A返回true;那么a instanceof B也返回true。其中类B是类A的父类。

整个测试代码入下

package com.atguigu.java2;
/*
 * 面向对象的特征之三:多态性
 * 
 * 1、理解多态性:可以理解为一个事物的多种形态
 * 2、何为多态性:
 * 						对象的多态性:父类引用指向子类对象
 * 3、多态的使用,虚拟方法调用
 * 		有了对象的多态以后,我们在编译期,只能调用父类中声明的
 * 		方法,但在运行期,我们实际执行的是子类重写父类的方法
 * 	总结:编译看左边,运行看右边
 *  4、多态的使用前提;①类的继承关系②方法的重写
 *  5、对象的多态性:只适用于方法,不适用于属性
 * 
 * 
 */
public class PersonTest {
	public static void main(String[] args) {
		//对象的多态性:父类引用指向子类对象
		Person p1 = new Man();
		//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法---虚拟方法调用
		p1.eat();//执行的是子类重写的eat()方法
		p1.walk();
		
		System.out.println("*************************************");
		//不能调用子类所特有的方法,编译时,p2是Person类型
		/*
		 * 有了对象的多态性以后,内存中实际上是加载了子类特意又的属性和方法的
		 * 但是由于便是声明为Person类型的,编译时,只能调用父类中声明的属性和
		 * 方法,子类中特有的属性和方法不能调用
		 * */
		
		
		//如何才能调用子类特有的属性和方法?
		//使用强制类型转换(向下转型)
		Man m1 = (Man)p1;
		m1.earnMoney();
		
		//使用强转时,可能出现ClassCastException的异常
//		Woman w1 = (Woman)p1;
//		w1.goShopping();
		
		/*
		 * instanceof关键字的使用
		 * 
		 * a instanceof A;判断对象a是否是类	A的实例,如果是返回true,否则返回false
		 * 
		 * 使用情境:为了避免在向下转型时出现ClassCastException的异常
		 * 我们在向下转型之前,先进行instanceof的判断。
		 * 一旦是返回true就进行向下转型,如果返回false就不进行向下转型
		 * 
		 * 
		 * 如果a instanceof A返回true;那么a instanceof B也返回true
		 * 其中类B是类A的父类
		 */
		if(p1 instanceof Woman) {
			Woman w1 = (Woman)p1;
			w1.goShopping();
			System.out.println("************woman***************");
		}
		if(p1 instanceof Man) {
			Man w1 = (Man)p1;
			w1.earnMoney();
			System.out.println("************man***************");
		}
		
		
		if(p1 instanceof Person) {
			System.out.println("************Person***************");
		}
		if(p1 instanceof Object) {
			System.out.println("************Object***************");
		}
		
		//练习:
		//问题一:编译时通过,运行时不通过
//		Person p3 = new Man();
//		Woman w2 = (Woman)p3;
		
		
		//问题二、编译时通过,运行时也通过,变向的多态
		Object obj = new Man();
		Person p4 = (Person)obj;
		p4.eat();
		
		//问题三、编译不通过
//		Man man = new Woman();		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值