【Java笔记】在强制转换中理解动态绑定

来源:互联网 发布:淘宝欢乐逛如何使用 编辑:程序博客网 时间:2024/06/04 18:44
package Test04;
public class Test04 {
 public static void main(String[] args) {
  Animal aa= new Dog();
  aa.eat();//此时aa实际上是一个Dog对象,当通过aa调一个子类和父类都有的方法的时候,Java会先看父类中有没有这个方法,如果有,就再去子类看有没有重写这个方法,如果重写了,那实际调用的会是子类的方法
  aa.run();//这样调用是非法的,因为声明的时候是声明的一个Animal类,虽然我们知道实际上是一个Dog对象,但它的类还是Animal
  //我们可以通过强制转换来实现把类为Animal的Dog对象转为Dog类
  Dog bb=(Dog)aa;
  bb.run();//这样再调用是合法的
  
  
  
  
  Animal cc=new Animal();
  Dog dd=(Dog)cc;           //编译时不报错的,但是运行会出错,因为cc实际上是一个Animal对象,不能转为Dog类,运行结果:I am a dog,so i eat meat
//  I can run
//  Exception in thread "main" java.lang.ClassCastException: Test04.Animal cannot be cast to Test04.Dog
//   at Test04.Test04.main(Test04.java:16)
  dd.run();
 
 
  Dog ee=new Dog();
     Animal ff=(Animal)ee;//其实这个地方的是没必要写这个Animal,来进行自动转换的,因为子类转换为父类是自动转换,这一行代码也可以写成Animal ff=ee;
  ff.eat();   //合法
 }
 
}
class Animal{
 
 void eat(){
  System.out.println("I eat food");
 };
 
}
class Dog extends Animal{
 //重写eat()
 void eat(){
  System.out.println("I am a dog,so i eat meat");
 }
  //写一个Dog类独有的方法
  void run(){
   System.out.println("I can run");
  }
 }