12

尽管我进行了一些广泛的搜索,但我遇到了一些代码并且无法理解它的某个方面!

我的问题是:为什么类有时会像下面的代码一样在括号内声明?

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;

我相信这与一个类扩展另一个类的事实有关,但我不确定括号内定义的类意味着什么。

对此的任何帮助表示赞赏。先感谢您。

4

4 回答 4

12

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

强制转换适用于编译器无法安全地将一种类型转换为另一种类型的情况,或者因为它不知道所涉及的类型是什么,或者因为转换会丢失信息(例如,如果你有一个你想要的 double存储在浮点类型的变量中)。

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

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

于 2012-07-30T19:42:41.203 回答
7

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

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

这是Java中继承的一个基本功能。


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

于 2012-07-30T19:38:28.153 回答
1

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

于 2012-07-30T20:04:13.023 回答
0

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

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

于 2012-07-30T19:41:35.843 回答