java 重载和多态的区别

本文介绍了虚函数表的概念及其在实现多态中的作用,并详细解释了Java中成员方法及数据的解析过程,包括静态类型与动态类型的分派机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员
--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键。

 http://m.blog.youkuaiyun.com/blog/seekcreation/40116455

虚函数表

成员方法的解析

java中方法分派指令:

invokespecial

invokevirtual

invokedynamic

involveinterface

 

 

静态类型,静态分派

实际类型,动态分派

 

 

成员数据解析

根据 java7虚拟机规范 , 成员数据解析过程描述如下:

为了将一个还没有解析的符号引用D解析成一个类(或者接口)C的一个成员,符号引用C必须被先解析。因此任何因在C被解析成类(或者接口)时失败导致抛出的异常都可以被解析符号引用D时抛出。如果C可以被解析成一个类(或者接口),则因D被解析成一个成员引用失败抛出的异常才可以被抛出。

  1. 如果C声明了和D符号引用(名称和描述符)一样的成员引用,则解析成功;
  2. 否则,解析过程递归到类C的直接实现(或者接口C直接继承)的接口中;
  3. 否则,如果C有父类S,则解析过程递归到S中;
  4. 否则,解析失败。

纵使上面解析成功,接着还会验证访问权限:

  1. 如果上面的解析过程解析失败,则直接抛出 NoSuchFieldError;
  2. 否则,如果没有对D没有 获取权限 ,则直接抛出 IllegalAccessError;
  3. 。。。

 

从上面的解析过程可以看到,对于成员数据的访问,虽然成员数据也和方法声明一样有访问限制,但Java并没有用不同的虚拟机指令来区分对不同访问限制的成员数据的访问,而是符号解析后统一进行访问权限的验证检查,而且还可以看出java语言中子类型中声明的成员数据可以覆盖父类型中声明的成员数据的语法在符号解析的规则中就可以实现。下面举例说明四条成员数据访问相关的指令。 

package com.baidu.test;

public class T {
    private int data = 100;
    public static void main(String[] args) {
        T t = new T();
        System.out.println(t.data);
    }
}

部分常量池数据:

 

构造函数中对data赋值:( putfield)

main函数中读取data值:(getfield)

 

package com.baidu.test;

public class T {
    static class A {
        static int data = 1000;
    }

    static class B extends A {

    }

    public static void main(String[] args) {
        System.out.println(B.data);
    }
}

 部分常量池数据:

类A的静态构造初始化块中给data赋值(putstatic)

main方法中读取data的值(getstatic)

稍微留意下可以发现,虽然data是声明在父类A中,但是在T中使用A的子类B访问data时,常量池中依然是描述为对B的成员data访问(见 T的常量池 #22)

转载于:https://www.cnblogs.com/LuLei1990/p/4583817.html

内容概要:文章基于4A架构(业务架构、应用架构、数据架构、技术架构),对SAP的成本中心利润中心进行了详细对比分析。业务架构上,成本中心是成本控制的责任单元,负责成本归集与控制,而利润中心是利润创造的独立实体,负责收入、成本利润的核算。应用架构方面,两者都依托于SAP的CO模块,但功能有所区分,如成本中心侧重于成本要素归集预算管理,利润中心则关注内部交易核算获利能力分析。数据架构中,成本中心与利润中心存在多对一的关系,交易数据通过成本归集、分摊利润计算流程联动。技术架构依赖SAP S/4HANA的内存计算ABAP技术,支持实时核算与跨系统集成。总结来看,成本中心利润中心在4A架构下相互关联,共同为企业提供精细化管理决策支持。 适合人群:从事企业财务管理、成本控制或利润核算的专业人员,以及对SAP系统有一定了解的企业信息化管理人员。 使用场景及目标:①帮助企业理解成本中心利润中心在4A架构下的运作机制;②指导企业在实施SAP系统时合理配置成本中心利润中心,优化业务流程;③提升企业对成本利润的精细化管理水平,支持业务决策。 其他说明:文章不仅阐述了理论概念,还提供了具体的应用场景技术实现方式,有助于读者全面理解并应用于实际工作中。
Java中的重载多态是面向对象编程的重要概念。 重载(Overloading)是指在同一个类中定义多个方法,它们具有相同的名称但参数列表不同。通过重载,可以根据不同的参数类型个数来调用不同的方法。重载可以提高代码的复用性可读性。 多态(Polymorphism)是指同一个方法名可以在不同的类中具有不同的实现。多态通过继承方法重写来实现。在多态中,父类的引用可以指向子类的对象,通过父类引用调用同名方法时,会根据实际对象的类型来确定调用哪个子类的方法。 下面是Java重载多态的示例代码: 1. 重载示例[^1]: ```java public class Calculator { public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } } // 调用示例 Calculator calculator = new Calculator(); int result1 = calculator.add(1, 2); // 调用int类型参数的add方法 double result2 = calculator.add(1.5, 2.5); // 调用double类型参数的add方法 ``` 2. 多态示例[^2]: ```java public class Animal { public void sound() { System.out.println("动物发出声音"); } } public class Cat extends Animal { @Override public void sound() { System.out.println("猫发出喵喵的声音"); } } public class Dog extends Animal { @Override public void sound() { System.out.println("狗发出汪汪的声音"); } } // 调用示例 Animal animal1 = new Cat(); // 父类引用指向子类对象 Animal animal2 = new Dog(); // 父类引用指向子类对象 animal1.sound(); // 调用子类Cat的sound方法 animal2.sound(); // 调用子类Dog的sound方法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值