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

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");
  }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值