gpt4 book ai didi

java - C 结构和 Java 类之间有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:32 25 4
gpt4 key购买 nike

我是 Java 的新手,但对 C 有点熟悉。我想知道——C 结构和 Java 对象以及调用它们的方法之间有什么区别?还是完全等价?

例如Bicycle结构:

class BicycleDemo {
public static void main(String[] args) {

// Create two different Bicycle objects
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();

// Invoke methods on those objects
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();

bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}

我问的原因是因为它们看起来太像了!谢谢!

最佳答案

如果您不考虑方法覆盖,那么您可以将 Java 类和方法视为一对 C 风格的 struct 和一组操作这些 的函数结构。例如,如果您有这样一个类:

 public class MyJavaClass {
private int x;
public int getX() {
return x;
}
public int setX(int value) {
x = value;
}
}

这类似于为此效果编写 C 代码:

struct MyJavaClass {
int x;
};

int MyJavaClass_getX(struct MyJavaClass* this) {
return this->x;
}
void MyJavaClass_setX(struct MyJavaClass* this, int value) {
this->x = value;
}

主要思想是方法类似于将接收者对象作为隐式“this”参数的函数。在 C 中,您必须显式地将接收器作为参数传递给函数,而在 Java 中,这是通过 object.method() 语法隐式完成的。

如果您开始引入方法覆盖,这会变得有点复杂,因为您在对象上调用的方法取决于对象的动态 类型,而不是静态 类型。对此进行模拟的一种方法是使用称为 vtable虚函数表 的东西,之所以这样命名是因为 C++ 的 virtual 关键字。这个想法是每个对象存储一个指向函数指针表的指针,每个函数一个可以被覆盖,当在对象上调用方法时,从表中选择适当的函数指针并调用。所以,更恰本地说,上面的 Java 对象可能看起来像这样:

struct MyJavaClass_Vtable {
void (*getX)(struct MyJavaClass* this);
void (*setX)(struct MyJavaClass* this, int value);
};

struct MyJavaClass {
struct MyJavaClass_Vtable* vtable;
int x;
};

int MyJavaClass_getX(struct MyJavaClass* this) {
return this->x;
}
void MyJavaClass_setX(struct MyJavaClass* this, int value) {
this->x = value;
}

/* A global instance of the vtable for MyJavaClass */
struct MyJavaClass_Vtable MyJavaClassVtableInstance = {
&MyJavaClass_getX,
&MyJavaClass_setX
};

每当您创建 MyJavaClass 的实例时,您都会设置它的 vtable,执行如下操作:

struct MyJavaClass* mjc = malloc(sizeof *mjc);
mjc->vtable = &MyJavaClassVtableInstance;

然后,当调用这样的函数时(在 Java 中):

myJavaClass.getX();

在 C 中它看起来像

myJavaClass->vtable->getX(myJavaClass);

所以在某种意义上,Java 类只是一个带有一些额外元信息的结构。当然,对于程序员来说,它看起来完全不同 - 存在封装、多态性、更严格的类型系统等 - 但在 native 代码级别,常规 C 结构和 Java 类可能看起来非常相似。

希望这对您有所帮助!

关于java - C 结构和 Java 类之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5413001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com