Java面试题_简述Java多态

文章目录

    • 面试题——谈谈对Java多态的理解
      • 1.多态是什么?
      • 2.多态实现方式?
        • 2.1.编译时多态/静态多态
        • 2.2.运行时多态/动态多态
      • 3.多态实现原理
      • 题外话:

面试题——谈谈对Java多态的理解

1.多态是什么?

多态polymorphism,poly+morphism许多形态,一个类的多种形式,同一个事件发生在不同的对象上会产生不同的结果。

2.多态实现方式?

2.1.编译时多态/静态多态

编译期间决定目标方法;
方法名相同,参数不同,通过overload重载实现。
//案例(编译时多态)
	public int add(int num1, int num2) {
     
		return num1 + num2;
	}

	public int add(int num1, int num2, int num3) {
     
		return num1 + num2 + num3;
	}

	public int add(double num1, int num2) {
     
		return (int) num1 + num2;
	}
	public static void main(String[] args) {
     
		CompileTime test = new CompileTime();
        //传参的类型不同,编译的时候就能知道指向的目标方法
		System.out.println(test.add(3, 2));
		System.out.println(test.add(3,2,1));
		System.out.println(test.add(2.3, 1));
	}

输出结果:5 6 3

2.2.运行时多态/动态多态

运行期间决定目标方法,JVM决定目标方法;
通过override重写和继承实现。(子类重写父类的方法,同名同参)
//案例(运行时多态)在编译时无法确定目标,运行时决定通过JVM中的方法区实现
public class RunTime {
     
	public static void main(String[] args) {
     
		Person body = new Infant();//创建Infant对象
		Person teenager = new Teenager();//创建Teenager对象
		body.action();//Infant方法表里action方法,所以执行时指向Infant实例
		body.eat();//同上
		teenager.action();//同上
		teenager.eat();//Teenager没有重写eat()方法,所以指向Person实例,执行的是父类里的eat方法
	}
}

class Person {
     
	void action() {
     
		System.out.println("人有行动能力");
	}

	void eat() {
     
		System.out.println("人需要吃东西");
	}
}
//Teenager方法表里有action方法,调用该方法时指向Teenager实例
//但是没有eat方法,调用eat方法时就指向Person实例
class Teenager extends Person {
     
	void action() {
     
		System.out.println("年轻人工作");
	}
}

class Infant extends Person {
     
	void action() {
     
		System.out.println("婴儿睡觉");
	}

	void eat() {
     
		System.out.println("婴儿吃流食");
	}
}

输出结果:

婴儿睡觉
婴儿吃流食
年轻人工作
人需要吃东西

3.多态实现原理

运行时多态,即动态方法调用是实例调用 (invokevirtual),在调用的时候才确定具体的调用方法。

通过JVM内部的实现机制来实现。JVM内部有一个区域即方法区,存储了所有实例的方法。调用方法即在方法区里调用。方法表存放方法实际入口地址,程序在执行时,通过方法表来寻找方法的入口地址,找到之后,通过invokeVirtual指令来调用方法。

编译时多态,类调用 (invokestatic) 是在编译时就已经确定好具体调用方法的情况。

题外话:

其实学的很费解,推荐一篇解释详尽的博文如下:

https://www.cnblogs.com/kaleidoscope/p/9790766.html

你可能感兴趣的:(Java面试题)