浅谈多态

tech2022-12-14  118

一、问什么是多态?

多态:是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行是才确定,即一个引用变量到底会指向那个类的实例对象,该引用变量发出的方法调用是哪个类中实现的方法,必须由程序运行期间才能决定。

读者看了之后,大概感觉就是,“脸上笑嘻嘻,心里mmp,说人话”。

举例简单说明一下:

假如我们有一个Person类,有一个speak()的方法,那么 Person person = new Person(); 都知道 person.speak();是调用的Person的person这个实例的speak()方法。 如果我们还有一个Man类,继承Person,重写speak()方法,然后我们Person person2 = new Man();,调用person2.speak(); 你们猜是会调用父类的speak()方法,还是子类的speak()方法。

然后运行一下才知道,是调用子类的speak方法。

package com.jet.knowledge.polymorphic; public class Person { public void speak(){ System.out.println("运行父类的speak()方法"); } } class Man extends Person{ @Override public void speak() { System.out.println("运行子类的speak()方法"); } } class test{ public static void main(String[] args) { Person person = new Person(); person.speak(); Person person2 = new Man(); person2.speak(); } }

运行父类的speak()方法 运行子类的speak()方法

然后我们再看上面的定义: 1、程序中定义的引用变量:person,person2 2、指向的具体类型: new Person(),new Man() 3、通过该引用变量发出的方法调用:person.speak(), person2.speak() 4、编译时不确定:√

二、概念的增加

多态分为编译时多态和运行是多态,我们所说的多态大多是运行时多态。

编译时多态

方法名相同,方法参数不同通过overloading重载实现编译期间决定目标的方法 public class polymorphic { public int add(int x, int y){ return x+y; } public int add(int x, int y, int z){ return x+y+z; } @Test public void testAdd(){ int x = 1; int y = 2; int z = 3; System.out.println(add(x,y)); System.out.println(add(x, y, z)); } }

运行是多态

运行期间决定目标方法同名同参overriding和继承实现JVM决定目标方法 class Animal{ public void eat(){ System.out.println("父类的eat方法"); } public void run(){ System.out.println("父类的run方法"); } } class Dog extends Animal{ @Override public void eat() { System.out.println("Dog 的eat方法"); } } class Cat extends Animal{ @Override public void eat() { System.out.println("cat的eat方法"); } @Override public void run() { System.out.println("cat 的run方法"); } }

三、多态的实现条件

1、继承2、重写3、父类引用执行之类

四、多态的原理(JVM层面)

这个要理解需要有一定的方法区的概念,我只想说,我自己还没有理解到。


Java 多态的实现机制 面试|如何理解Java中的多态 面试题:什么是多态?怎样才能实现多态?

最新回复(0)