58.向上(向下)转型
- 向上转型:父类的引用指向子类对象,自动进行类型转换
<父类型><引用变量名>=new<子类型>()
通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
通过父类引用变量无法调用子类特有的方法
- 向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换。
(使用向上转型无法调用子类独有的方法,可使用向下转型)
<子类型><引用变量名>=(<子类型>)<父类型的引用变量>;
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常
(向下转型,如果没有转化为真实的子类类型,此时会引发ClassCastException)
Java中提供了instanceof运算符来进行类型的判断减少在向下转型的过程中,没有转换为真实子类类型的类型转换异常(instanceof:进行类型判断,减少向下转型时的ClassCastException)
对象名 instanceof 类型
使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类在继承上有上下级关系
/*
* 宠物狗狗类Dog类
* */
public class Dog extends Pet{
//品种
private String strain="聪明的拉布拉多犬";
public Dog(){
System.out.println("子类狗狗的无参构造方法");
}
public Dog(String name,int health,int love){
super(name,health,love);
System.out.println("子类狗狗带三个参数的构造方法");
}
public Dog(String name,int health,int love,String strain){
/*//通过super调用父类的构造方法,必须是第一行
//super();注意参数顺序必须和父类一致
super(name,health,love);*/
this(name,health,love);
this.strain=strain;
System.out.println("子类狗狗的带四个参数的构造方法");
}
public String getStrain() {
return this.strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public void print(){
//调用父类的非private方法print()
super.print();
System.out.println(",我是一只:"+this.strain);
}
//宠物生病后看病
public void toHospital(){
System.out.println("打针、吃药");
this.setHealth(60);
}
//狗狗吃骨头
public void eat(){
if (this.getHealth()>100){
System.out.println("狗狗"+this.getName()+"吃饱了,不想吃了!");
}else{
//狗狗的健康值加3
t