为什么围绕Java中的类名使用括号?

虽然我已经做了一些广泛的搜索,但我遇到了一些代码并且无法理解它的某个方面!

我的问题是:为什么有时在括号中声明类,如下面的代码?

public class Animal { public static void hide() { System.out.println("The hide method in Animal."); } public void override() { System.out.println("The override method in Animal."); } } public class Cat extends Animal { public static void hide() { System.out.println("The hide method in Cat."); } public void override() { System.out.println("The override method in Cat."); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = (Animal)myCat; myAnimal.hide(); myAnimal.override(); } } 

我特别关注这一行代码:

  Animal myAnimal = (Animal)myCat; 

我认为它与一个类扩展另一个类但不确定括号中定义的类表示什么的事实有关。

对此有任何帮助表示赞赏。 先谢谢你。

您所看到的是一个演员,告诉编译器可以将Cat分配给Animal。

转换是针对编译器无法安全地将一种类型转换为另一种类型的情况,或者因为它不知道涉及的类型是什么,或者因为转换会丢失信息(例如,如果你有一个你想要的双重存储在float类型的变量中。

在你的例子中,演员是完全没必要的,因为Cat扩展了Animal; 由于所有Cats都是Animal,编译器不需要显式转换来告诉它可以将Cat分配给Animal。

铸造应保留用于特殊场合。 如果你经常使用显式的强制转换,那么这可能意味着你没有从类型系统中获得最大的好处。

这是一个演员 – 类型为CatmyCat变量被myCat转换为基类Animal

这意味着它可以被认为是Animal

这是Java中inheritance的基本function。


正如@Sebastian Koppehel 评论的那样 ,在这种情况下不需要演员 – myAnimal变量(类型为Animal )可以接受任何实现Animal类型。

即使代码生成正确的输出,如果必须将对象强制转换为父类,然后调用父类的静态方法,则可能需要以更好的方式设计类。 Java中的inheritance应该提供对常用方法和字段的访问。 如果需要在Parent类中编写静态方法并使用子类的对象调用它,则父类和子类之间的关系不明确。

您明确保证编译器/运行时您传递的cat引用类型是Animal的类型。 在java中,它被称为强制转换

如果没有遵守此合同的运行时(这意味着cat和Animal之间没有定义关系),您将获得ClassCastException