Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于类型转换对象和访问方法的问题_Java_Object_Types_Casting_Upcasting - Fatal编程技术网

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通过方法重写来运行子类的方法。我知道有一个“超级”方法,但它需要更改方法中的一些实现。有什么方法可以调用超类方法吗?