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

Sid*_*idz 8 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的重点是这一行代码:

            Animal myAnimal = (Animal)myCat;
Run Code Online (Sandbox Code Playgroud)

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

对此有任何帮助表示赞赏.先感谢您.

Nat*_*hes 10

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

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

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

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


Ode*_*ded 7

这是一个强制转换 - myCat类型的变量Cat被强制转换为基类Animal.

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

这是Java 中继承的基本功能.


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