您的位置:首页 > 编程语言 > Java开发

JAVA多态学习2

2017-06-30 21:32 197 查看
好啦,这里紧接着上次没说的向下转型,请读者结合上次讨论的向上转型的样例一起探讨(事实上本次代码也有加上,放心)。

我们这里希望从向下转型会出现的两种基本情况进行探讨

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在对象类型的强制转换,先推断是否是某种类型,是的话再强制转换成改类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: