【问题标题】:Why does java have types? Do they do anything at runtime? [closed]为什么java有类型?他们在运行时做任何事情吗? [关闭]
【发布时间】:2014-08-22 18:50:52
【问题描述】:

我最近在学习Objective C,了解到在Objective C中,你可以在一个对象上运行一个方法,即使它的Type没有声明它。我想知道为什么你不能在 Java 中做到这一点。

例如:

class Animal{

public void move(){/*something*/}
}

class Dog extends Animal{

public void bark(){/*barks*/}
}

//In another class:
Animal anInstanceOfADog = new Dog();
anInstanceOfADog.bark()// <- This would be an error, as Animal doesn't have the method bark.

在这种情况下,我们会收到一个错误,因为 Animal 不能吠叫。尽管如此,该对象是一个 Dog 的引用,而 Dog 可以吠叫。

因此,问题是:类型在 Java 代码的执行中扮演什么角色?为什么会这样?

谢谢,

院长

【问题讨论】:

  • 这是一个简单的多态问题。任何关于 Java 的书都可以解释它。或者只是在 Google 上搜索。
  • Java 是“类型安全的”。这是开始阅读的好地方。 en.wikipedia.org/wiki/Type_safety
  • 我的 Objective C 非常基础,但据我了解,您可以“询问”在对象的给定实例上执行方法,但这并不能保证执行会发生。这很像尝试在 Java 中针对未知对象进行反射调用
  • 通过自动装箱,您可以将所有内容视为对象,通过反射您可以进行鸭式打字。简而言之,您可以在 Java 中做同样的事情;但代码并不漂亮。
  • @DeanLeitersdorf 您上一条评论的答案基本上是“静态类型的用途是什么”的答案,并且是这些天相当规模辩论的主题......

标签: java types casting


【解决方案1】:

你有很多问题在这里,所以我会尝试分解它。对于读者:更正并根据需要添加内容。编程语言/理论/等。 不是我的强项:

为什么java有类型?

type systems 上的维基百科文章给出了一个很好的总结:减少计算机程序中可能出现的错误。更广泛的说法可能是“类型理论解决的基本问题是确保程序有意义。”

无类型编程语言可能的,并且允许对任何数据执行任何操作。示例包括汇编和 Forth (source)。但我认为 Java 被设计为将类型作为一种安全措施并帮助确保正确性,以及其他原因。

...并了解到在Objective C中,您可以在对象上运行方法,即使它的Type没有声明它。我想知道为什么你不能在 Java 中做到这一点。

嗯,你可以,正如 MadProgrammer 指出的那样。你只需要使用反射来做到这一点。这样做可能会引发异常。

您不能在编译时调用一个类型不存在的方法的原因是因为这就是 Java 类型系统的工作方式。可用于调用特定引用的方法取决于该引用的类型,而不是引用指向的对象的类型。这可能是为了确保某种程度的正确性,并且允许在对象上调用任意方法可能被确定为允许足够多的错误无益。

类型在 Java 代码的执行中扮演什么角色?

确保如果程序编译通过你有一定的保证,程序的某些部分不会导致错误。类型还允许执行反射和转换;没有它们,如果程序员没有额外的工作,程序就没有必要的信息。

另外,如果我没记错的话,JVM 在内部使用类型来帮助进行虚拟方法分派。每个对象都包含一个指向其类对象的指针,该类对象包含一个表,该表引用构成该类型声明的方法的代码位。如果 JITC 没有内联该方法,则使用类对象中定义的 vtable 来确定运行时应该执行什么实现。如果没有类型,我想对象必须包含它们的方法,我想这会导致一些非常严重的代码膨胀。

为什么会这样?

我想是设计使然?

【讨论】:

  • 好的!这个更好!所以基本上打字只是为了更容易检测错误并提高代码的清晰度。所以我猜这意味着类型在控制 JVM 中不起任何作用。谢谢,你回答了我的问题:)
  • @DeanLeitersdorf 老实说,我可能还没有触及到这个话题的表面,因为我还没有进入 CS/语言设计的更多理论部分。正如在底部附近指出的那样,JVM 可以使用类型 (我将稍作更新,因为它们肯定确实发挥了作用...... )
  • 酷,期待更新:)
  • @DeanLeitersdorf 好的,完成。我真的希望我没有搞砸任何事情......
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 2021-08-11
  • 2021-12-20
  • 1970-01-01
  • 2011-07-25
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多