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)
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");
}
}
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");
}
}