首页 > 解决方案 > 关于类型转换对象和访问方法的问题

问题描述

我对类型转换的语法和对象的创建有点困惑。这里我有一个代码

class OverridingTest{
public static void main(String [] args){
    Dog dog = new Hound();
    ((Hound)dog).sniff();
   }
}

class Dog{
    public void bark(){
        System.out.println("woof ");
    }
}

class Hound extends Dog{
    public void sniff(){
        System.out.println("sniff ");
    }
    public void bark(){
        System.out.println("bowl");
    }
}

我确实有一些关于语法和转换的背景。但是,当我尝试不投射“狗”对象时,它会发送错误。我对编译器为什么这样做有点困惑。

我阅读了一些关于它的参考资料,并看到了在强制转换上下文中实例化对象背后的语法。它说在这行代码中:

Dog dog = new Hound();

行首的“狗”决定了对象的“类型”。具体来说,它决定了对象可以执行的操作,而作为“狗”类的子类的“猎犬”是“类”,并决定了实例化对象可用的方法的实现。

现在这就是我开始感到困惑的部分。“狗”对象的实例化方式不是已经参考了“猎犬”类吗?意思是“狗”对象具有猎犬类的实现,因此可以访问它的方法?为什么在访问其方法时需要添加类型转换运算符?像这样?

((Hound)dog).sniff();

另外,我还有另一个问题,这是一个单独的问题,但引用了相同的代码。我尝试用这样的“狗”类的类引用实例化“狗”对象。

Dog dog = new Dog();

然后我把它放到一个新行的子类中

Hound newdog = (Hound) dog;

这遵循类型转换的语法并且编译得很好。但是,我收到运行时错误。这不遵循铸造的方法吗?如果没有,我将如何以另一种方式做到这一点?

标签: javaobjecttypescastingupcasting

解决方案


推荐阅读