Java 关于类型转换对象和访问方法的问题
我对类型转换的语法和对象的创建有点困惑。这是我的密码Java 关于类型转换对象和访问方法的问题,java,object,types,casting,upcasting,Java,Object,Types,Casting,Upcasting,我对类型转换的语法和对象的创建有点困惑。这是我的密码 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 extend
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 dog = new Hound();
线条开始处的“狗”确定对象的“类型”。具体来说,它确定对象可以执行的操作,“Hound”是“Dog”类的子类,是“class”,并确定实例化对象可用的方法的实现
这就是我开始感到困惑的地方。“dog”对象实例化的方式是否已经引用了“Hound”类?意思是“dog”对象拥有Hound类的实现,因此可以访问它的方法?为什么在访问其方法时需要添加typecast运算符?像这样
((Hound)dog).sniff();
另外,我还有一个关于它的问题,这是一个单独的问题,但是引用了相同的代码。我尝试用“dog”类的类引用实例化“dog”对象,如下所示
Dog dog = new Dog();
然后我把它放到一个新行的子类中
Hound newdog = (Hound) dog;
这遵循类型转换的语法,并且编译得很好。但是,我得到了一个运行时错误。这不符合铸造方法吗?如果没有,我将如何以另一种方式执行它?编译器知道变量已声明的类型,而不是已分配给它的对象的类型——顺便说一句,以后在程序中可能会更改。在后一个示例中,当原始对象不是猎犬时,将Dog对象强制转换为更具体的Hound子类型,所以是的,运行该代码时会出现类强制转换异常。请注意,拥有有效的语法并不意味着运行该代码时可以假定没有错误。我明白了这一点,感谢您提供的其他链接!!但是,我有一个关于覆盖方法部分的问题。在这种情况下,如何在不更改实现的情况下访问超类中的“bark”方法?因为在输出时,java通过方法重写来运行子类的方法。我知道有一个“超级”方法,但它需要更改方法中的一些实现。有什么方法可以调用超类方法吗?