Java多态中的关键的技术——Vtable

本文探讨了多态在Java和C++中的实现,重点关注Java中的Vtable(虚方法表)机制。通过示例代码解释了动态绑定的概念,展示了如何在运行时根据对象类型调用相应的方法,从而实现多态。C++中,虚函数表(vtable)用于存储方法指针,实现方法的动态分派,增强了面向对象编程的灵活性和解耦能力。

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

Vtable,计算机术语,中文译名虚函数表,简称虚表。每一个有虚函数的类都有这样一个东西。实际上记录了本类中所有虚函数的函数指针,也就是说是个函数指针数组的起始位置Vtable虚表。比如virtual void TheSecondFun()记录在数组的第二个元素,当一个该类的对象实例调用TheSecondFun时就根据对应关系把第二个函数指针取出来,再去执行该函数,这种行为叫晚绑定,也就是说在运行时才知道调用的函数是什么样子的,而不是在编译阶段就确定的早绑定。

 

多态

Java是一门面向对象的编程语言,面向对象的一-大特色便是多态。 多态的具体体现便是在运行期能够根据对象实例的不同而执行不同的接口方法,换成业界对多态的标准定义便是:允许不同类的对象对同一-消息做出响应,即同一-消息可以 根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。多态是面向对象编程的特性,而这种特性并不仅仅是喊贼口号就算的,而是必须使用特定的机制或技术去实现。实现多态的技术称为动态绑定(dynamicbinding).是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

在Java中,动态绑定也叫“晚绑定”.这是因为在Java中还有一-类绑定 是在编译期间便能确定,所以所谓的晚绑定的概念,是相对于编译期绑定而言的。面向对象编程语言之所以要实现多态这一-特性, 最主要的目的就是为了消除类型之间的耦合关系,通俗地讲就是解桐。从计算机软件一产生,“解糊”便是一切计算机程序所要重点考虑的原则之-一。 其实何止是软件.计算机硬件之间也是以解糊为主要原则的,这类例子举不胜举,例如内存插槽,10接口之类,都是实现解耦的手段。解耦的最大好处在于,一-旦系统发生了变化,能够将变化降低到最小,仅变化新增的部件,而对于已经存在的部件,则尽量保持不变。所以-一个优秀的系统设计师总是想办法设计拥有良好兼容性和扩展性的架构,而面向对象语言的多态性,则是从语言特性上直接实现对象的解桐,这极大地提升了面向对象编程语言构建一套高内聚、 低耦合系统的能力。由于多态通过“动态绑定”的方式得以实现,而绑定通俗一点讲就是让不同的对象对同一个函

### Java 中的三大特性 #### 封装 (Encapsulation) 封装是指将数据字段(属性)和操作数据的方法绑定在一起作为一个单元处理,并尽可能隐藏对象内部细节的过程。通过访问修饰符 `private` 或者 `protected` 来控制成员变量对外部不可见,仅提供公共接口来获取或修改这些私有属性。 ```java public class Person { private String name; // Getter method to get the value of name. public String getName() { return this.name; } // Setter method to set the value of name. public void setName(String name) { this.name = name; } } ``` 这种方式不仅保护了数据的安全性和完整性,还提高了模块化程度,便于维护和发展程序[^1]。 #### 继承 (Inheritance) 继承是一种机制,在这种机制下新类可以从现有的类派生而来,从而获得现有类的数据结构和功能。这有助于减少重复代码并促进软件组件之间的重用。在Java中,使用关键字`extends`表示一个类是从另一个类派生出来的;被继承的那个称为超类(Superclass),也叫基类(Base Class)或者父类(Parent Class), 而新的那个则叫做子类(Subclass)[^3]。 下面是一个简单的例子展示了如何利用继承: ```java // 定义动物类作为父类 class Animal { protected String type; public Animal(String t){ this.type=t; } public void sound(){ System.out.println("Animal makes a sound"); } } // 创建狗类扩展自动物类 class Dog extends Animal{ public Dog(){ super("Mammal"); } @Override public void sound(){ System.out.println("Dog barks"); } } ``` 在这个案例里,`Dog` 类继承了来自 `Animal` 的所有非私有的属性与方法,并且还可以覆盖其中的一些行为以适应特定需求。 #### 多态 (Polymorphism) 多态意味着同一个实体能够表现出多种形态的能力。具体来说就是在编译期间确定调用哪个版本的方法而不是运行时刻才决定的现象被称为静态/编译期多态性;反之如果是在执行过程中动态选择实际应该被执行的对象,则属于动态/运行时多态性。后者通常借助于虚函数表(Virtual Table, VTable)实现,它允许不同类型的对象共享相同的接口却有着各自独特的实现方式。 这里有一个展示运行时期多态性的简单示例: ```java // 抽象类 Shape 可能会有多个具体的形状如 Circle 和 Rectangle 实现此抽象类 abstract class Shape { abstract double area(); } class Circle extends Shape { final double PI=3.14; int radius; Circle(int r){radius=r;} @Override double area(){ return PI*radius*radius; } } class Rectangle extends Shape { int width,height; Rectangle(int w,int h){ width=w;height=h; } @Override double area(){ return width * height ; } } // 测试上述定义的功能 public class MainTest { public static void main(String[] args) { Shape s1=new Circle(5); Shape s2=new Rectangle(4,7); System.out.printf("Circle Area:%f\n",s1.area()); System.out.printf("Rectangle Area:%f\n",s2.area()); } } ``` 这段代码说明即使两个不同的对象都被声明为同一类型(`Shape`),它们仍然可以根据各自的实际情况计算面积——这就是典型的运行时多态现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值