博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java对象的多态性(转型)
阅读量:6530 次
发布时间:2019-06-24

本文共 3804 字,大约阅读时间需要 12 分钟。

多态性在面向对象中主要有两种体现:

<1>方法的重载与覆写

<2>对象的多态性

  对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成

         向下转型:父类对象-->子类对象,向下转型时,必须明确地指明转型的子类类型

对象的向上转型

虽然使用的父类对象调用fun1方法,但是实际上调用的方法是被子类覆写过的方法,也就是说,如果对象发生了向上转型关系后,所调用的方法一定是被子类覆写过的方法。

但是父类的a无法调用b类中的fun3方法,因为这个方法只在子类中定义,而没有在父类中定义。

//=================================================// File Name       :	ploy_up_demo//------------------------------------------------------------------------------// Author          :	Common// 类名:C_1// 属性:// 方法:class C_1{												// 定义接口C_1	public void fun1(){							//定义fun1()方法		System.out.println("C_1--->public void fun1");	}		public void fun2(){							//定义fun2()方法		this.fun1();	}}//类名:D_1//属性://方法:class D_1 extends C_1{												//子类D_1继承父类C_1	public void fun1(){		System.out.println("D_1--->public void fun1");	//覆写父类中的fun1()方法	}		public void fun3(){															System.out.println("D_1--->public void fun3");	//子类自己定义方法	}}//主类//Function        : 	对象的多态性,对象向上转型public class ploy_up_demo {	public static void main(String[] args) {		// TODO 自动生成的方法存根		D_1 b = new D_1();			//定义子类的实例化对象		C_1 a = b;						//声明一个父类,发生向上转型的关系,子类赋值给父类		a.fun1();							//此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法	}}

 

对象的向下转型

在子类中调用了父类中的fun2方法,fun2方法要调用fun1方法,但是此时fun1方法已经被子类覆写过了,所以调用fun2方法的时候还是调用被子类覆写过的方法

在进行对象的向下转型之前,必须首先发生对象的向上转型,否则将出现对象转换异常

//=================================================// File Name       :	ploy_up_demo//------------------------------------------------------------------------------// Author          :	Common// 类名:C_1// 属性:// 方法:class C_1{												// 定义接口C_1	public void fun1(){							//定义fun1()方法		System.out.println("C_1--->public void fun1");	}		public void fun2(){							//定义fun2()方法		this.fun1();	}}//类名:D_1//属性://方法:class D_1 extends C_1{												//子类D_1继承父类C_1	public void fun1(){		System.out.println("D_1--->public void fun1");	//覆写父类中的fun1()方法	}		public void fun3(){															System.out.println("D_1--->public void fun3");	//子类自己定义方法	}}//主类//Function        : 	对象的多态性,对象向上转型public class ploy_up_demo {	public static void main(String[] args) {		// TODO 自动生成的方法存根//		D_1 b = new D_1();			//定义子类的实例化对象//		C_1 a = b;						//声明一个父类,发生向上转型的关系,子类赋值给父类//		a.fun1();							//此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法				C_1 c = new D_1();			//声明一个父类,发生了向上转型,子类赋值给父类		D_1 d = (D_1)c;				//声明的父类强制转换成子类,发生了向下转型关系		d.fun1();		d.fun2();		d.fun3();	}}

 

多态的应用

设计一个方法,要求此方法可以接受A类的任意子类对象,并调用方法。

//=================================================// File Name       :	ploy_up_demo//------------------------------------------------------------------------------// Author          :	Common// 类名:C_1// 属性:// 方法:class C_1{												// 定义接口C_1	public void fun1(){							//定义fun1()方法		System.out.println("C_1--->public void fun1");	}		public void fun2(){							//定义fun2()方法		this.fun1();	}}//类名:D_1//属性://方法:class D_1 extends C_1{												//子类D_1继承父类C_1	public void fun1(){		System.out.println("D_1--->public void fun1");	//覆写父类中的fun1()方法	}		public void fun3(){															System.out.println("D_1--->public void fun3");	//子类自己定义方法	}}//类名:E_1//属性://方法:class E_1 extends C_1{												//子类E_1继承父类C_1	public void fun1(){		System.out.println("E_1--->public void fun1");	//覆写父类中的fun1()方法	}		public void fun5(){															System.out.println("E_1--->public void fun3");	//子类自己定义方法	}}//主类//Function        : 	对象的多态性,对象向上转型public class ploy_up_demo {	public static void main(String[] args) {		// TODO 自动生成的方法存根//		D_1 b = new D_1();			//定义子类的实例化对象//		C_1 a = b;						//声明一个父类,发生向上转型的关系,子类赋值给父类//		a.fun1();							//此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法		//		C_1 c = new D_1();			//声明一个父类,发生了向上转型,子类赋值给父类//		D_1 d = (D_1)c;				//声明的父类强制转换成子类,发生了向下转型关系//		d.fun1();//		d.fun2();//		d.fun3();				fun(new C_1());							//传递C_1类的实例,产生向上转型		fun(new D_1());							//传递D_1类的实例,产生向上转型	}		public static void fun(C_1 c){	//接收父类对象,不用写多次分别接收子类对象		c.fun1();	}}

 

转载地址:http://gotbo.baihongyu.com/

你可能感兴趣的文章
一张图看懂normal,static,sealed,abstract 的 区别
查看>>
Task的使用
查看>>
s:iterator巧妙控制跳出循环
查看>>
Serv-U 的升级及数据备份和迁移【转】
查看>>
webstorm无法显示左边文件夹目录的解决方法
查看>>
数字校园-云资源平台 2014.10.26-人人通共享空间
查看>>
软件project--谈项目开发
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>
JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错
查看>>
getopt--parse command line options
查看>>
闭包和OC的block的本质
查看>>
MySQL出现Waiting for table metadata lock的场景浅析
查看>>
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
查看>>
什么是数据埋点?
查看>>
git回滚
查看>>
vue2.0 引用qrcode.js实现获取改变二维码的样式
查看>>
Python 判断闰年,判断日期是当前年的第几天
查看>>
MyBatis原理简介和小试牛刀
查看>>
js部分基础
查看>>