JavaSE—9.对象转型

对象转型(casting)

  • 一个基类的引用类型变量可以“指向”其子类的对象。
  • 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
  • 可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该子类的子类。
  • 子类的对象可以当做基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)
class Animal {
    public String name;
    Animal(String name) {
        this.name = name;
    }
}
class Cat extends Animal {
    public String eyesColor;
    Cat(String n, String c) {
        super(n);
        eyesColor = c;
    }
}
class Dog extends Animal {
    public String furColor;
    Dog(String n, String c) {
        super(n);
        furColor = c;
    }
}
public class Test {
    public static void main(String args[]){
        Animal a = new Animal("name");
        Cat c = new Cat("catname", "blue");
        Dog d = new Dog("dogname", "black");
        
        System.out.println(a instanceof Animal);//true
        System.out.println(c instanceof Animal);//true
        System.out.println(d instanceof Animal);//true
        System.out.println(a instanceof Cat);//false
        
        a = new Dog("bigyellow", "yellow");
        System.out.println(a.name);//bigyellow
        System.out.println(a.furnmae);//error
        System.out.println(a instanceof Animal);//true
        System.out.println(a instanceof Dog);//true
        Dog d1 = (Dog)a;
        System.out.println(d1.furColor);//yellow
    }
}

父类引用指向子类对象,只能访问父类所拥有的属性和方法。a指向的是dog对象,但是只能访问其父类(animal)对象的属性和方法。

执行a = new Dog("bigyellow", "yellow");Dog d1 = (Dog)a;后的内存图。

在这里插入图片描述

public class Test {
    public static void main(String args[]) {
        Test test = new Test();
        Animal a = new Animal("name");
        Cat c = new Cat("catname", "blue");
        Dog d = new Dog("dogname", "black");
        test.f(a);
        test.f(c);
        test.f(d);
    }
    public void f(Animal a) {
        System.out.println("name: " + a.name);
        if(a instanceof Cat) {
            Cat cat = (Cat)a;
            System.out.println(" " + cat.eyesColor + " eyes");
        } else if(a instanceof Dog) {
            Dog dog = (Dog)a;
            System.out.println(" " + dog.furColor + " fur");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32661327/article/details/83218644