什么是编译时多态?什么是运行时多态?

什么是编译时

只是单纯的将代码翻译成一种中间语言(例如:java代码被编译后生成字节码文件)

编译时会做一些代码语法的检查提醒

编译时没有实质性的为代码分配内存空间运行,所以可以说编译是静态类型检查

什么是运行时

为代码分配空间,让代码跑起来

此时可能会出现编译时发现不了的错误(例如:数组越界问题,由于编译时并未分配空间,所以是无法检查出这个问题的)

什么是Java编译时多态

通过编译即可明确是哪一个多态方法的调用

  • 比如说Java的重载,只通过参数的数量和类型不同来实现多态,那么在编译时我们可以单纯根据语法就能知道会调用哪一个重载的方法,所以所有的重载都是编译时多态

  • 再比如说Java的覆写,通过本类的对象引用指向本类的对象,可以明确是调用本类的覆写方法

什么是Java运行时多态

通过运行才能明确是哪一个多态方法的调用

例如,Java有一个语法:父类的引用可以指向子类的对象,并且可以通过父类引用使用父子类共有的方法

那么调用该方法时,使用哪个类中的方法呢

这个问题光靠编译是解决不了的

我认为是在代码运行后,在子类的方法栈中看具体有该方法,若没有,再通过继承关系逐级向上从父类的方法栈中寻找,直到找到为止

运行时多态有什么作用呢

用代码模拟现实的业务逻辑需求,但是生活中的需求会不断改变,那么代码也要跟着翻天覆地的“重写”吗?

以下面的代码为例

class Shape{
	void printArea(){}
}

class square extends Shape{
	void printArea(){}
}

/* 例如新增加一个需求,只需要实现新的需求,原先的代码,“接口”保持不动
class circle extends Shape{
 	void printArea(){}
}
*/

class users{
	void GetArea(Shape s){ //由于这里是父类的引用,可以指向所有子类,所以增添新的子类,这里也不用改变,体现代码的可拓展
		s.printArea();
	}
	
	
	/* 如果不用运行时多态,那么在新的需求需要实现时,你需要不断地增添
	void GetArea(square s){
		s.printArea();
	}
	
	void GetArea(circle c){
		c.printArea();
	}
			.
			.
			.
	
	*/
}

class Test{
	public static void main(String[] msg){
		new users().GetArea(new square());
		//假如用户还想知道其他的形状的面积,只需要new users().GetArea(new circle());
	}
}

//在现实生活中,列不完的需求出现时,运行时多态即可体现它的好处
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只可爱的小猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值