动态绑定和静态绑定

动态绑定

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

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);
    }

运行结果

parent
parent

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

### 动态绑定静态绑定的区别 在C++中,绑定(Binding)是将变量或函数名转换为内存地址的过程。根据绑定发生的时机不同,可以分为静态绑定动态绑定。 #### 静态绑定 静态绑定发生在编译期绑定的是对象的静态类型,即对象在声明时采用的类型。静态绑定依赖于对象的静态类型,而非实际向的对象类型。因此,静态绑定无法实现多态性。非虚函数通常使用静态绑定[^3]。 #### 动态绑定 动态绑定发生在运行期,绑定的是对象的动态类型,即针或引用当前所向的实际对象类型。动态绑定依赖于对象的动态类型,允许通过基类调用派生类中的重写函数,从而实现多态性。只有虚函数才支持动态绑定。 #### 静态绑定动态绑定的关键区别 1. **绑定时机**:静态绑定发生在编译期,而动态绑定发生在运行期。 2. **绑定依据**:静态绑定依据对象的静态类型,动态绑定依据对象的动态类型。 3. **多态性支持**:静态绑定不支持多态性,而动态绑定支持多态性。 4. **适用范围**:非虚函数使用静态绑定,而虚函数使用动态绑定[^3]。 以下是一个示例代码,展示静态绑定动态绑定的行为差异: ```cpp #include <iostream> using namespace std; class Base { public: void staticFunction() { cout << "Base::staticFunction" << endl; } // 静态绑定 virtual void virtualFunction() { cout << "Base::virtualFunction" << endl; } // 动态绑定 }; class Derived : public Base { public: void staticFunction() { cout << "Derived::staticFunction" << endl; } void virtualFunction() override { cout << "Derived::virtualFunction" << endl; } }; int main() { Base* obj = new Derived(); obj->staticFunction(); // 调用 Base::staticFunction,静态绑定 obj->virtualFunction(); // 调用 Derived::virtualFunction,动态绑定 delete obj; return 0; } ``` #### 输出结果 ```plaintext Base::staticFunction Derived::virtualFunction ``` #### 解释 - `obj->staticFunction()` 使用静态绑定调用的是 `Base::staticFunction`,因为静态绑定依据的是对象的静态类型 `Base`[^3]。 - `obj->virtualFunction()` 使用动态绑定调用的是 `Derived::virtualFunction`,因为动态绑定依据的是对象的动态类型 `Derived`[^3]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值