【Java】动态绑定机制

简介: 【Java】动态绑定机制

Java 动态绑定机制

  • Java 重要机制:动态绑定机制
  • Java 动态绑定机制:
  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
package com.xdr630.dynamic_;

public class DynamicBinding {
    public static void main(String[] args) {
          // a 的编译类型是 A ,运行类型是 B
          //属性看编译类型是哪个,方法看运行类型是哪个。
        A a = new B();
        System.out.println(a.sum()); //40
        System.out.println(a.sum1()); //30
    }
}

class A { //父类
    public int i = 10;
    
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    
    public int getI(){
        return i;
    }
    
}

class B extends A { 

    public int i = 20;
    
    public int sum() {
        return i + 20;
    }
    
    public int getI(){
        return i;
    }
    
    public int sum1(){
        return i + 10;
    }
    
}

在这里插入图片描述

  • 演示结论1
  • 把上面子类中的 sum() 方法注释掉,main 方法中的 a.sum() 输出什么?
public class DynamicBinding {
    public static void main(String[] args) {
        // a 的编译类型是 A ,运行类型是 B
        A a = new B();
        System.out.println(a.sum()); //30
        System.out.println(a.sum1()); 
    }
}

class A { //父类
    public int i = 10;
    //动态绑定机制:
    public int sum(){
        return getI() + 10;// 20 + 10
    }

    public int sum1(){
        return i + 10;
    }

    public int getI(){//父类 getI()
        return i;
    }
    
}

class B extends A { //子类

    public int i = 20;
    
    public int getI(){// 子类 getI()
        return i;
    }

    public int sum1(){
        return i + 10;
    }

}
  • 代码分析:
  1. 这个时候 a 的运行类型是 Ba.sum() 就会先找子类中的 sum() 方法,而此时子类中的 sum() 方法被注销了,所以只能去父类找 sum() 方法,sum 方法中再去调 getI() 方法,而此时父类和子类都有 getI() 方法。
  2. 因为a.sum() 方法的运行类型B,根据动态绑定机制,所以找到子类中的 getI() 方法,而在 getI() 中的return i 这个 i 是属性,没有绑定机制,在子类中声明的,直接返回 20 ,然后回到父类中的 sum() 方法 ,20 + 10,所以最后 a.sum 的输出值为 30

在这里插入图片描述

  • 演示结论2
  • 把上面子类中的 sum1() 方法注释掉,main 方法中的 a.sum1() 输出什么?
public class DynamicBinding {
    public static void main(String[] args) {
        // a 的编译类型是 A ,运行类型是 B
        A a = new B();
        System.out.println(a.sum());//30
        System.out.println(a.sum1());//20
    }
}

class A { //父类
    public int i = 10;
    //动态绑定机制:
    public int sum(){
        return getI() + 10;//20 + 10
    }

    public int sum1(){
        return i + 10;
    }

    public int getI(){//父类 getI()
        return i;
    }

}

class B extends A { //子类

    public int i = 20;
    
    public int getI(){// 子类 getI()
        return i;
    }

}
  • 代码分析:
  1. a 的运行类型是 B,所以从子类B开始找,而此时 sum1 方法被注释了,只能去找父类A中的 sum1 方法,在 sum1 方法中 return i + 10,而 i 是属性,没有动态绑定机制,哪里声明,哪里使用,此时 i 属性在父类A中声明,所以 i10,所以 a.sum1 的输出值为 20

在这里插入图片描述

目录
相关文章
|
5天前
|
Java 数据库连接 开发者
Java的Shutdown Hook机制:优雅地关闭应用程序
Java的Shutdown Hook机制:优雅地关闭应用程序
22 1
|
5天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
3天前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
5天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
3天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
5天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
19 1
|
5天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
23 4
|
5天前
|
Java 数据安全/隐私保护
java中异常处理机制
java中异常处理机制
15 1
|
5天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
25 0
|
5天前
|
Java API 开发者
解密Java反射机制与动态代理
解密Java反射机制与动态代理
14 0