Java多态实现

多态

  • 一个函数根据对象不同而对应不同实现
    或者同一个行为具有多个不同表现形式或形态
多态实现

分为编译期多态和运行期多态
编译期多态通过函数重载来实现,在编译期就可以决定,也可以说为静多态

  • 静态多态(静态绑定/编译器多态): —>函数的重载,且条件为:函数名相同,参数列表不同;
public class TestDemo {
    public int add(int x,int y){//参数列表
        return x+y;
    }
    public  int add(int x,int y,int z){//参数列表
        return x+y+z;
    }
    public static void main(String[] args) {
        TestDemo t = new TestDemo();
        System.out.println(t.add(1,2));
        System.out.println(t.add(4,5,6));
    }
}


运行时多态通过方法重写和继承来实现, 在运行期间决定要执行的目标方法,也可以称为动多态

  • 动态多态(动态绑定/运行期多态):
    而动多态就是函数的重写;
    发生动态绑定的条件:1.继承 ,2.重写,3.向上造型(基类的引用,引用派生类的对象)
class Animal{
    private String name;
    public Animal(){ }

    public void eat(){
        System.out.println("怎么吃饭");
    }
}

class Dog extends Animal{
    public Dog(){
        super();
    }
    @Override  //重写:子类实现父类的方法
    public void eat() {
        System.out.println("dog吃饭");
    }
}
class cat extends Animal{
    public cat(){
        super();
    }

    @Override
    public void eat() {
        System.out.println("cat吃饭");
    }
}

public class TestDemo {
    public static void main(String[] args) {
        Animal a = new Dog();   //****
        Animal a1 = new cat();
        Animal animal = new Animal();
        a.eat();
        a1.eat();
        animal.eat();
    }
}

在这里插入图片描述

动多态的实现原理

动多态的实现原理是地址覆盖----->JVM中java栈,java堆,方法区
Animal a = new Dog();
a.eat();
堆里面有对象头,堆中开辟新的内存new Dog,对象头中有引用,引用的是class对象里的当前类的类信息(属性以及方法),通过class对象可以访问方法区的方法表(Dog的方法表和方法在栈里地址),重写完成后,Dog.eat()的地址覆盖掉了父类Animal.eat()的地址。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值