Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java有类型?他们在运行时做什么?_Java_Types_Casting - Fatal编程技术网

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

为什么java有类型?他们在运行时做什么?,java,types,casting,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();

我最近学习了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.
在这种情况下,我们会得到一个错误,因为动物不会吠叫。尽管如此,该对象是狗的参考,狗可以吠叫

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

谢谢


迪恩

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

为什么java有类型

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

无类型编程语言是可能的,并且允许对任何数据执行任何操作。示例包括组装和转发。但我认为Java的设计目的是将类型作为一种安全措施,并帮助确保正确性,还有其他原因

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

嗯,你可以,正如程序员所指出的。你只需要使用反射就可以了。这样做可能会引发一个例外

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

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

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

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

为什么会这样


根据设计,我想?

这是一个简单的多态性问题。任何关于Java的书都可以解释它。或者只是在Google上搜索一下。Java是类型安全的。这里是开始阅读的好地方。我的目标C非常基本,但据我所知,您可以要求在对象的给定实例上执行方法,但这并不保证执行会发生。这与在Java中尝试对未知对象执行反射调用非常相似。通过自动装箱,您可以将所有内容都视为对象,通过反射,您可以执行duck类型。简而言之,您可以用Java做同样的事情;但是代码并不漂亮。@DeanLeitersdorf您最后一条评论的答案基本上是关于静态类型的用途的答案,并且是最近一场规模相当大的辩论的主题……好吧!这样更好!所以基本上,键入只是为了更容易地检测bug和提高代码的清晰度。所以我猜这意味着类型在命令JVM中不起作用。谢谢,你回答了我的问题:@DeanLeitersdorf老实说,我可能甚至没有触及这个话题的表面,因为我还没有接触到CS/语言设计的更多理论部分。正如底部所指出的,JVM可以使用类型,我将在稍后进行更新,因为它们确实起到了一定的作用……酷,期待更新:@DeanLeitersdorf OK,finished。我真的希望我没有把事情搞砸。。。