Java教程

谈谈你对于java多态的理解?

本文主要是介绍谈谈你对于java多态的理解?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本文为学习笔记,学习资料为:【Java面试题】谈谈对Java多态的理解_哔哩哔哩_bilibili

多态的英文是polimorphism,poli为“许多”,morphism为“形态”。

多态的形式

1)编译时多态

编译期间决定目标方法;通过overloading方法重载实现;方法名相同,参数不同。

class AddNumbers {
    public int addition (int x, int y) {
        return x + y;
    }
    
    public int addition (int x, int y, int z) {
        return x + y + z;
    }

    public int addition (double x, int y) {
        return (int)x + y;
    }
    
    public static void main (String[] args) {
        AddNumbers a1 = new AddNumbers();
        System.out.println(a1.addition(1, 2));
        System.out.println(a1.addition(1, 2, 3));
        System.out.println(a1.addition(3, 4));
    }
}

2)运行时多态

运行期间决定目标方法;同名同参(子类复写父类方法);overriding方法重写和继承实现;JVM决定目标方法。

class Animal {
    void run() {
        System.out.println("animal is running...");
    }
    void eat() {
        System.out.println("animal is eating...");
    }
}

class Dog extends Animal {
    void run() {
        System.out.println("dog is running...");
    }
}


class Cat extends Animal {
    void run() {
        System.out.println("cat is running...");
    }
    void eat() {
        System.out.println("cat is eating...");
    }
}

public class AnimalDemo {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        dog.run();//dog is running...
        dog.eat();//animal is eating...  因为dog没有重写(overriding) eat()方法,所以执行父类方法
        cat.run();//cat is running...
        cat.eat();//cat is eating...
    }
}

 

 方法表

JVM结构

 JVM在方法区调用目标方法,通过invokeVirtual指令进行调用,通过方法表寻找方法的入口地址,通过invokeindex调用方法。

总结

在回答时,要答出:多态是什么?一个类的多种形式即多态。(一个对象变量可以指示多种实际类型的现象,称为多态。)多态的实现方式:编译时多态和运行时多态,也称为静态多态和动态多态。多态实现原理,以及方法表的作用。方法的实际入口地址指向的是最终实现了该方法的那个类的实例。

这篇关于谈谈你对于java多态的理解?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!