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

什么是编译时

只是单纯的将代码翻译成一种中间语言(例如: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());
	}
}

//在现实生活中,列不完的需求出现时,运行时多态即可体现它的好处

猜你喜欢

转载自blog.csdn.net/qq_51800570/article/details/121254994