动态绑定和静态绑定

来源:互联网 发布:linux c 创建文件 编辑:程序博客网 时间:2024/05/18 22:42

动态绑定

动态绑定是指编译器在编译阶段不知道要调用哪个方法

Parent父类,父类有两个方法一个是类方法shout,一个是实例方法say

public class Parent {    String name;    public static void shout(){        System.out.println("我是父类shout静态方法");    }    public void say(){        System.out.println("我是父类say方法");    }}

Son子类继承父类,并重写了say实例方法

public class Son extends Parent {    String name;    @Override    public void say() {        System.out.println("我是子类say");    }}

测试函数

public class MainTest {    public static void main(String[] args) {        Parent parent = new Parent();        Parent son = new Son();        parent.say();        son.say();    }}

声明的两个对象都是parent类型,但运行时他们指向的都是不同的对象类型

虽然调用的是say方法但是编译器在编译阶段不能确定调用的是子类还是父类的方法,方法的动态绑定是基于实际的对象类型,而不是它们声明的对象引用类型

静态绑定

我们知道静态方法不能被重写,为什么呢,其实这就和静态绑定有关.编译器在编译期间就能完成绑定的叫做静态绑定也叫前期绑定,基本上实例方法都在运行时绑定,静态方法是静态绑定在编译期间就已经决定的

给父类和子类同时加上静态方法

public static void shout(){        System.out.println("我是父类shout静态方法");}
public static void shout(){        System.out.println("我是子类shout静态方法");}

测试

public static void main(String[] args) {        Parent parent = new Parent();        Parent son = new Son();        parent.shout();        son.shout();    }

运行结果

我是父类shout静态方法我是父类shout静态方法

虽然java允许重写静态方法但是无效,调用的静态方法是父类的静态方法

成员变量的静态绑定

父类添加属性

String name="parent";

子类添加属性

String name="son";

测试

public static void main(String[] args) {        Parent parent = new Parent();        Parent son = new Son();        System.out.println(son.name);        System.out.println(parent.name);    }

运行结果

parentparent

总结一下静态绑定存在于以下几种情况
1. 类方法
2. 私有方法(不会被继承)
3. 访问成员变量