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

2024-04-16

我是 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以及一组对这些进行操作的函数structs。例如,如果你有一个这样的类:

 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() syntax.

如果您开始引入方法重写,这会变得有点复杂,因为您在对象上调用的方法取决于dynamic对象的类型,而不是static类型。模拟这种情况的一种方法是使用称为vtable or 虚函数表,因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 类可能看起来非常相似。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 结构和 Java 类有什么区别? 的相关文章

随机推荐

  • AltBeacon 应用程序在几分钟后重新启动

    我的应用程序遇到一些问题 我在禁用 RegionBootstrap 并通过 System exit 0 关闭应用程序后 我的应用程序在几分钟后 通常是 3 4 分钟 会自行重新启动 这是我每次重新启动应用程序时发现的 Logcat 行 20
  • 寻找硬币组合以产生给定找零的递归方法不正确

    我最近正在做一个项目欧拉问题 即 31 它基本上是找出使用集合 1 2 5 10 20 50 100 200 的元素可以求和到 200 的有多少种方法 我使用的想法是这样的 求和到 N 的方法的数量等于 对 N k 求和的方式数量 对 k
  • 如何提高派生类中属性的变化?

    我该如何提高PropertyChanged for SomeProperty在班上B 此示例无法编译 因为PropertyChanged无法通过这种方式访问 public class A INotifyPropertyChanged pub
  • 单元测试 Laravel FormRequest

    我正在尝试对各种自定义进行单元测试FormRequest输入 我找到的解决方案是 建议使用 this gt call 方法并断言response与预期值 答案链接 https stackoverflow com questions 2979
  • 需要帮助使用 Google Apps 脚本查找 Google 表格中的列中的最大值

    我有一张有几千行和两列的工作表 我需要编写一个脚本 该脚本将增加行并将其中一列中的值与同一列中的前 50 个值进行比较 并查看它是否大于前 50 个条目的最大值 我一直在尝试使用 Math max 但找不到正确的语法来使其在动态范围内工作
  • 如何获取文件目录的绝对路径?

    如何获取包含指定文件的目录的绝对路径 current dir is home me dev File file new File target test txt assert absolute file equals home me dev
  • 对三元运算符语句中的“意外 T_ECHO”进行故障排除

    DAO gt get num rows 1 echo is echo are 这似乎没有按预期为我工作 我收到错误 Unexpected T ECHO 我希望它能回应 是 或 是 我已经尝试过 条件周围没有括号 我是否无法以这种方式使用三元
  • 如何更改Vuforia AR相机对焦模式?

    我在用Vuforia 6 2 AR SDK对于在Unity中 但是当我在 Android 手机中测试该应用程序时 相机看起来像blurry 我在 Vuforia 的开发者网站中搜索并找到了一些相机对焦模式 但我无法实现 因为该指南适用于较旧
  • 何时使用 Hibernate 投影?

    我对 Hibernate 有点困惑预测 and criteria 何时使用预测以及何时使用标准 它们并不相互排斥 您可以同时使用两者 预测通常在某些标准的背景下使用 简而言之 Hibernate Projections 用于仅查询您使用 C
  • 无法在 Python 中分配 1.6 GB

    这段代码产生一个MemoryError from pylab import complex128 import numpy x numpy empty 100000000 dtype complex128 100 millions comp
  • 在 os.startfile() 中运行时隐藏控制台?

    我有一个 bat带有参数的文件 我使用运行它os startfile test bat 有没有办法隐藏其控制台 我尝试使用subprocess 效果很好 但是当我关闭父程序时subprocess这是使用编译的py2exe控制台模式也关闭 i
  • TinyMCE有效元素:只允许特定的CSS规则

    小MCE的valid elements属性允许您定义有效 HTML 元素及其属性的白名单 您可以仅允许段落和链接 tinyMCE init valid elements p a href 但是 那style属性有点问题 它对于某些事情 例如
  • SSRS堆叠条形图标签位置

    我正在使用 SQL Server 2012 SSRS 我有一个堆积的条形图 其中包括利息和股息 我想将这些值的总和添加到堆积条形图上方的区域 我尝试过调整标签的各种属性 但我无法将标签位置设置在堆叠条形图中间以外的任何位置 有什么想法如何让
  • 使用 PowerShell 将 Azure 活动日志连接到 Log Analytics 实例

    有没有办法使用 PowerShell 将 Azure 活动日志配置为转发到 Log Analytics 实例 本质上与使用本页概述的门户执行的操作相同 https learn microsoft com en us azure azure
  • 当使用 mkstemp() 创建的文件被删除时?

    我有一个程序调用 mkstemp 用返回的 fd 写入一些内容 然后关闭 fd 我希望保留该文件 直到我自己删除它 使用 rm 命令或其他命令 我的问题是 Linux会在close fd 后删除这个文件吗 Linux在close fd 后会
  • 返回对象的 ECMAScript 6 箭头函数

    当从箭头函数返回一个对象时 似乎有必要使用一组额外的 and a return关键字 因为语法中存在歧义 这意味着我不能写p gt foo bar 但必须写p gt return foo bar 如果箭头函数返回对象以外的任何内容 and
  • jquery 1.9 手风琴高度问题

    我正在使用一个手风琴 其父级高度为 400px 我希望手风琴的高度永远不会大于 400px 但我也希望手风琴的各个元素能够根据其内容的大小进行调整 通过将 heightStyle 设置为 fill 我可以使整个手风琴的高度为 400px 在
  • 模块化编译时数组扩展

    假设我处于这种情况 main c include
  • Rails 3:如何验证 A < B,其中 A 和 B 都是模型属性?

    我想验证一下customer price gt my price 我尝试了以下方法 class Product lt ActiveRecord Base attr accessor my price validates numericali
  • C 结构和 Java 类有什么区别?

    我是 Java 的新手 但对 C 有点熟悉 我想知道 C 结构和 Java 对象以及调用它们的方法之间有什么区别 或者完全等价 例如 自行车结构 class BicycleDemo public static void main Strin