动态绑定与静态绑定

先看代码
定义了一个父类和一个子类

public class Animal {
    private String name;

}

public class Dog extends Animal {

    public void eat() {
        System.out.println("狗吃骨头");
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Animal dog1=new Dog();
        dog1.eat();
    }
}

运行结果却会报错

java: 找不到符号
  符号:   方法 eat()
  位置: 类型为Animal的变量 dog1

明明子类中的eat方法是存在的,函数编译却不通过。将Test类稍改一下

public class Test {
    public static void main(String[] args) {
        Dog dog1=new Dog();
        dog1.eat();

    }
}

程序又能正常运行,这就引发了我们的思考
1:Animal dog1=new Dog();
2:Dog dog1=new Dog();
这二者有什么区别,单看右边明明都是Dog类型的对象,都是Animal的子类,为什么第一种运行子类的方法不通过?

首先我们容易看出的是第一种情况
当代码编译时,当电脑看到 dog1.eat();他是先去父类里找,而不是子类。

因为子类是有这个方法的,如果先找子类,程序的编译是能通过的。

改回Test类,再将子类改成

public class Dog extends Animal {

    public void eat() {
       while (true){

       }
    }
}

发现程序报的同样的错误,程序先找到的是父类有错,而不是陷入死循环同样可以证明先找的父类

改回之前子类,再这样改

public class Animal {
    private String name;
    public void eat() {
        while (true){
            
        }
    }
}

程序编译也能正常通过,说明编译时并不会进入父类的eat方法,只是找到了便能通过。

查了一下,这就是多态里的静态绑定,即编译时先在父类里找那个调用的方法,找到就编译通过。如果父类没有,就算子类有,我想调用的就是子类的eat方法,也不通过。
有静态就有动态,动态绑定就是当程序编译通过,运行时,看到方法直接在子类里找,因为既然通过了编译,也就说明父类有这个方法,且极大可能子类重写了这个方法,如果子类没有再去父类找,体现了程序的高效性。

这也就解释了父类与子类方法调用优先级的问题了。

静态绑定和动态绑定都属于多态的范畴,而多态说白了就是

父类 x=new 子类( );
父引用指向子对象

所以当我们写出像

Dog dog1=new Dog();

这样的语句时,自然不属于多态,而且这样写也不符合OCP(开闭原则)设计理念,这里就不再多说了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值