Java向上转型的问题

问题遇到的现象和发生背景

Java向上转型问题

问题相关代码,请勿粘贴截图

public class Animal{
public void eat(){
System.out.println("动物吃食物");
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("小狗吃骨头");
}
public void bark(){
System.out.println("小狗在叫");
}
}
public static void main(String[] args){
Animal animal = new Dog();
animal.eat();
//animal.bark(); 报错
}

运行结果及报错内容

不能使用子类中的特有方法

我的解答思路和尝试过的方法

如果方法的调用看的是运行类型,那么代码中运行类型是dog,应该能调用dog类中的bark()方法,但是这样会报错。如果方法调用看的是编译类型,那么这里编译类型是Animal,调用方法时应该调用Animal中的eat(),但运行时却调用的是Dog类中重写的eat(),这是什么原理呢?

我想要达到的结果

求详细解释向上转型的方法调用的原理

Animal animal = new Dog(); 能不能调看左边,调的到底是啥看右边。。为啥?就这么规定的,再仔细品品,这么规定是很合理的。

Animal animal = new Dog();
这一步是,父类的属性被子类的属性赋值,父类获得了子类的值,获得的是父类中存在的属性的值,若是子类特有的属性,父类是不能用的

关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:Java中向上转型的意义