对象转型是Java语法中比较重要的一部分,以下是关于对象转型几点要了解的内容:
1)一个基类的引用类型变量可以“指向”其子类的对象;
2)一个基类的应用不可以访问其子类对象新增加的成员(属性和方法);
3)可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类;
4)子类的对象可以当做基类的对象来使用称作向上转型,反之成为向下转型。
下面用一个小程序来解释一下对象转型:
class Animal {
public String name;
Animal(String name) {
this.name = name;
}
}
class Cat extends Animal {
public String eyeColor;
Cat(String n,String c) {
super(n);
this.eyeColor = c;
}
}
class Dog extends Animal {
public String furColor;
Dog(String n,String c) {
super(n);
this.furColor = c;
}
}
//在上面的类中:Animal是父类,Dog和Cat从Animal继承
//Animal的成员变量是name,Dog和Cat新增加属性eyeColor、furColor
public class Test {
public static void main(String[] args) {
Animal a = new Animal("name"); // a是animal
Cat c = new Cat("catname","blue"); // c是cat
Dog d = new Dog("dogname","black"); // d是dog
System.out.println(a instanceof Animal); // a是Animal,输出true
System.out.println(c instanceof Animal); // c是cat,从animal继承,是animal,输出true
System.out.println(d instanceof Animal); // d是dog,从animal继承。是animal,输出true
System.out.println(a instanceof Cat); // a是Animal。是cat的父类,不是cat,输出false
//下面是重点
a = new Dog("bigyellow","yellow"); //重新定义一只狗:name是bigyellow,furcolor是yelloe
//在这里要注意,由于a的数据类型animal,所以虽然a是新定义出来的狗,但a只能访问这个dog中属于animal的部分,即不能访问dog.furcolor
//这就是父类引用指向子类对象,它看不到单独属于子类的那部分内容
System.out.println(a.name); //可以访问a.name
//System.out.println(a.furColor); //不能访问a.furColor,若执行这句话会出错
System.out.println(a instanceof Animal); //a是一只狗,属于animal,输出true
System.out.println(a instanceof Dog); //a实际上是狗,所以输出true
Dog d1 = (Dog)a; //强制转换,d1是整个的狗,可以访问dog.furColor了
System.out.println(d1.furColor);
}
}