好啦,这里紧接着上次没说的向下转型,请读者结合上次讨论的向上转型的例子一起探讨(其实本次代码也有加上,放心)。
我们这里希望从向下转型会出现的两种基本情况进行探讨
package downcasting;
//动物类Animal父类
class Animal{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//动物会叫
public void cry(){
System.out.println("不知道怎么叫");
}
//动物吃东西
public void eat(){
System.out.println("不知道吃什么");
}
}
//创建Dog子类并extends继承Animal父类及覆盖cry方法
class Dog extends Animal{
//狗叫
public void cry(){ //覆盖父类方法
System.out.println("汪汪叫");
}
//狗吃东西
public void eat(){ //覆盖父类方法
System.out.println("狗爱吃骨头");
}
public void bite(){
System.out.println("狗会咬人...");
}
}
public class Downcasting {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Animal g1=new Dog(); //向上转型
g1.cry();
g1.eat();
/*
* 情况一:如果父类引用的对象如果引用的是指向的子类对象,
* 那么在向下转型的过程中是安全的。也就是编译运行是不会出错误的
*/
Dog dog=(Dog)g1; //向下转型,编译和运行皆不会出错
dog.cry();
dog.eat();
Animal g2=new Animal();
/*
*情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,
*编译不会出错,但是运行时会出现java.lang.ClassCastException错误。
*它可以使用instanceof来避免出错此类错误。
* */
/*
*错误如下: Exception in thread "main" java.lang.ClassCastException:
* downchange.Animal cannot be cast to downchange.Dog
at downchange.Downchange.main(Downchange.java:62)
Dog dog1=(Dog)g2;
dog1.cry();
dog1.eat();
*/
if(g2 instanceof Dog){
Dog dog1=(Dog)g2;
dog1.cry();
dog1.eat();
}
else if(g2 instanceof Animal){
System.out.println("g2是Animal的实例");}
//Dog g3=new Animal(); //不存在从Animal转换到Dog
}
}
ps:
instanceof:
1.用instanceof来测试它所指向的对象是否是某个类。
2.instanceof在对象类型的强制转换,先判断是否是某种类型,是的话再强制转换成改类型。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 22:21:50