为什么java有类型?他们在运行时做了什么吗?

时间:2014-07-02 05:15:06

标签: java types casting

我最近在学习Objective C,并了解到在Objective C中,你可以在一个对象上运行一个方法,即使它的类型没有声明它。我想知道为什么你不能用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无法吠叫。尽管如此,该对象是狗的参考,狗可以吠叫。

因此,问题是:类型在Java中执行代码时起什么作用?为什么会这样?

谢谢,

迪安

1 个答案:

答案 0 :(得分:2)

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

  

为什么java有类型?

关于type systems的维基百科文章提供了一个非常好的总结:减少计算机程序中可能存在的错误。更广泛的陈述可能是“类型理论所解决的根本问题是确保程序具有意义。”

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

  

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

嗯,你可以 ,正如MadProgrammer所指出的那样。你只需要用反射就可以了。这样做可能会引发异常。

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

  

类型在Java中执行代码时起什么作用?

确保如果程序编译,您可以确保程序的某些部分不会导致错误。类型还允许执行反射和铸造;没有它们,如果没有程序员方面的额外工作,程序将没有必要的信息。

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

  

为什么会这样?

按照设计,我想?