java - 关于类型转换对象和访问方法的问题
问题描述
我对类型转换的语法和对象的创建有点困惑。这里我有一个代码
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;
这遵循类型转换的语法并且编译得很好。但是,我收到运行时错误。这不遵循铸造的方法吗?如果没有,我将如何以另一种方式做到这一点?
解决方案
推荐阅读
- c++ - 如何将动态矩阵复制到 CUDA 中的设备内存?
- python - pip:为什么有时不显示 twine 命令
- java - RemoteMessage.send() 在 Firebase 上触发什么功能?
- java - 多种通用类型
- android - 在 Decoview 中设置 Textview
- asp.net - 实体框架构建器尝试生成表两次
- machine-learning - 图像聚类的亲和传播
- php - 有没有用php编辑图像的好方法?
- amazon-web-services - 你如何模拟 *ec2.DescribeVolumesOutput 的值
- reactjs - 我想在模式框中逐行显示我的csv数据,方法是通过在反应中的映射单击按钮