1.一个基类的引用类型变量可以“指向”其子类对象
2.一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)
3.可以使用 引用变量 instanceof 类名 来判断该引用变量所“指向”的对象是否属于该类或该类的子类。
4.子类对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting).
public class TestCasting {
public void f(Animal a) {
System.out.println("name:" + a.name);
if (a instanceof Dog) {
Dog d = (Dog) a;
System.out.println("furColor:" + d.furColor);
}
}//如果传入的参数是Animal类的对象,则只打印name;如果传入的参数是它了子类Dog对象,则还需要打印furColor
public static void main(String[] args) {
Animal a=new Animal("animal");
Dog d=new Dog("Carl", "black");
System.out.println(d instanceof Animal);//true
System.out.println(a instanceof Dog);//false
System.out.println(a instanceof Animal);//true
Animal a1=new Dog("dog1", "white");
System.out.println("a1.name:"+a1.name+",a1.furColor:"+a1.furColor);//出错,基类的对象a1不能访问子类新增加的成员furColor
Dog d1=(Dog)a1;//可以将一个基类对象a1强制转换为子类对象d1
System.out.println("d1.name:"+d1.name+",d1.furColor:"+d1.furColor);
TestCasting test=new TestCasting();
test.f(a);//name:animal
test.f(d);//name:Carl furColor:black
}
}
class Animal{
String name;
public Animal(String name) {
this.name=name;
}
}
class Dog extends Animal{
String furColor;
public Dog(String name,String furColor) {
super(name);
this.furColor=furColor;
}
}