繁体   English   中英

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

[英]What is the difference between C structures and Java classes?

我是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结构,但具有以下附加功能:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM