C结构和Java类有什么区别?

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

例如,自行车结构:

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和一组对这些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类只是一个带有一些额外元信息的结构。 当然,对于程序员来说,它看起来完全不同 – 有封装,多态,更严格的类型系统等等 – 但在本机代码级别,常规C结构和Java类可能看起来非常相似。

希望这可以帮助!

C struct中不能包含方法/函数。 它只是不同数据类型的集合。 class可以声明变量和方法。

Java类允许您定义字段,如C结构,但具有以下附加function:

  • 正如您在问题中所述,您可以将方法添加到可以对数据进行操作的类中。
  • 您可以将字段和方法声明为private (以及一些其他访问设置),这意味着只有该类的其他方法可以访问它们,而不是来自外部的代码。 (在结构上使用它是没有意义的,因为没有办法访问私有字段 – 这只有在允许方法时才有意义)。
  • 类可以从其他类inheritance。 除此之外,只要Binheritance自A,就可以传递B类型的对象,其中A类型是预期的。

还有另一个微妙的区别。 在C中,结构是值类型,但在Java中,类是引用类型 。 这意味着当您在C中复制结构(例如分配给变量或作为参数传递)时,它会复制所有字段,而在Java中,复制类对象时,它只是复制对象的引用 (因此,如果您修改其字段,您也可以修改原始对象,而不仅仅是副本)。

在C中,您经常使用指向结构的指针来模拟Java的引用行为。 在Java中,您不使用指针,因为类对象已经是引用。

关键的区别,恕我直言是类允许的

  • 封装
  • 多态性

这是OOP的两个非常重要的特性。