【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

在这里插入图片描述

目录
相关文章
|
7天前
|
Java 数据库连接 开发者
Java的Shutdown Hook机制:优雅地关闭应用程序
Java的Shutdown Hook机制:优雅地关闭应用程序
17 1
|
18天前
|
缓存 前端开发 安全
java的双亲委派机制
java的双亲委派机制
23 5
|
9天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
12天前
|
Java
【专栏】Java中的反射机制与应用实例
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
3天前
|
Java 数据库连接 开发者
Java中的异常处理机制详解
Java异常处理是确保程序健壮的关键,涉及Throwable的Error和Exception子类。Error由JVM抛出,不建议捕获;Exception分为检查异常(需要捕获)和未检查异常。处理异常的关键字有try、catch、finally、throw和throws。最佳实践包括捕获具体异常、不吞没异常、释放资源和避免滥用异常。示例展示了如何在main方法中处理IOException,并在finally块中进行资源清理。
|
7天前
|
缓存 NoSQL Java
17:缓存机制-Java Spring
17:缓存机制-Java Spring
22 5
|
7天前
|
存储 前端开发 搜索推荐
13:Session机制实现用户登录与注销功能-Java Web
13:Session机制实现用户登录与注销功能-Java Web
22 3
|
10天前
|
敏捷开发 机器学习/深度学习 Java
Java中的异常处理机制深入理解与实践:持续集成在软件测试中的应用探索自动化测试在敏捷开发中的关键作用
【4月更文挑战第29天】在Java编程中,异常处理是一个重要的概念。它允许开发者在程序执行过程中遇到错误或异常情况时,能够捕获并处理这些异常,从而保证程序的稳定运行。本文将详细介绍Java中的异常处理机制,包括异常的分类、异常的处理方式以及自定义异常等内容。 【4月更文挑战第29天】 随着敏捷开发和DevOps文化的兴起,持续集成(CI)已成为现代软件开发周期中不可或缺的一环。本文将探讨持续集成在软件测试领域内的关键作用、实施策略以及面临的挑战。通过对自动化构建、测试用例管理、及时反馈等核心要素的详细分析,揭示持续集成如何提高软件质量和加速交付过程。 【4月更文挑战第29天】 在当今快速发
|
10天前
|
安全 Java 测试技术
利用Java反射机制提高Spring Boot的代码质量:概念与实战
【4月更文挑战第29天】Java反射机制提供了一种强大的方法来在运行时检查或修改类和对象的行为。在Spring Boot应用中,合理利用反射可以提高代码的灵活性和可维护性。本篇博客将探讨Java反射的核心概念,并展示如何通过反射提高Spring Boot项目的代码质量。
28 0
|
11天前
|
Java API
Java包机制及JavaDoc
Java包机制及JavaDoc