一、对象转型的介绍
在java中,一个基类的引用类型变量可以指向其子类的对象。可以分为向上转型和向下转型。
(一)向上转型(upcasting):子类的对象可以当作基类的对象来使用,
格式:父类名称 对象名 = new 子类对象名称():如下

Animal aa = new Dog("JiaJia","black");

表示创建一个子类对象(Dog对象)aa,当作父类对象(Animal)使用。

(1)一个基类的引用不可以访问其子类对象新增加的成员变量和方法。(向上转型相当于失去一部分属性和方法)

否则会出错:

java 一个对象转换成另外一个对象 java对象转型_System


(2)可以访问子类继承的方法和子类重写的方法

如下均有父类和子类均有info()方法,当向上转型调用时,调用的是子类的info(根本原因是,调用方法时,用的是实际类,而不是父类,指向的是子类的方法,详细的参看多态那篇文章)。

java 一个对象转换成另外一个对象 java对象转型_java 一个对象转换成另外一个对象_02


java 一个对象转换成另外一个对象 java对象转型_子类_03

向下转型(downcasting):基类的对象可以当作子类的对象来使用

二、对象转型的使用

(一)、强制转型

可以将对象的向上转型强制转型为一个子类对象,这样这个子类对象就又具备了子类的对象的所有属性和方法。

格式:

子类名称 对象名 = (子类名称)向上转向的对象名

java 一个对象转换成另外一个对象 java对象转型_java 一个对象转换成另外一个对象_04


向上转型的对象不能强转为其它子类,否则会报错。

java 一个对象转换成另外一个对象 java对象转型_子类_05


(二)instanceof判断隶属(实际是:XX是一个XX)

判断引用类型变量所指向的对象是否属于该类或该类的子类,可使用

语法:引用变量 instanceof 类名

返回值是:true或false

java 一个对象转换成另外一个对象 java对象转型_System_06


三、对象转型的使用

当一个基类有多个子类,要判断某个子类的一些特征时,可以先定义为父类,之后再判断是哪个子类,这样可实现程序的可扩展性。

class Animal{
    public String name;
    Animal(String name ){
        this.name = name;
    }
    public String info(){
        return "name:"+this.name;
    }
}


class Dog extends Animal{
    public String furColor;
    Dog(String name,String furColor) {
        super(name);
        this.furColor = furColor;
    }

    @Override
    public String info() {
        return super.info() + "   furColor:" + furColor ;
    }
}
class Cat extends Animal{
    public String eyesColor;
    Cat(String name,String eyesColor) {
        super(name);
        this.eyesColor = eyesColor;
    }
}

public class CastingTest {
    public static void main(String[] args) {
        CastingTest ct = new CastingTest();
        Animal a = new Animal("HumanFriend");
        Cat c = new Cat("BeiBei", "Blue");
        Dog d = new Dog("DaHuang", "yellow");
        System.out.println("___________Animal a___________");
        ct.f(a);
        System.out.println("___________Cat c___________");
        ct.f(c);
        System.out.println("___________Dog d___________");
        ct.f(d);
    }
        public void f(Animal a){
            System.out.println("name:" + a.name);
            if (a instanceof Cat){
                Cat a1 = (Cat) a;
                System.out.println("eyesColor: " + ((Cat) a).eyesColor);
            }
            else  if (a instanceof Dog){
                Dog d1 = (Dog)a;
                System.out.println("furColor:  "+ ((Dog) a).furColor);
            }
        }
    }

运行结果:

java 一个对象转换成另外一个对象 java对象转型_System_07