引入
Java基础对于Java的深入学习相当重要。对于Java基础中的东西,在做了很多项目后,再回顾,对其便理解的十有八九了,今天来说说转型。
性质
对象转型有这么几点性质:
1、一个基类的引用类型变量可以“指向”其子类的对象;
2、一个基类的引用不可以访问其子类对象新增加的成员(属性和方法);
3、可以使用引用变量instanceof类名来判断该引用类型变量所“指向”的对象是否属于该类或该类的子类;
4、子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。
demo
我们从代码的角度来理解一下以上四句话:
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.furname); //!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
}
}
性质说明
性质1:
a = new Dog("bigyellow","yellow");
性质2:
System.out.println(a.furname); //!error
性质3:
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
性质4:
向上转型:
a = new Dog("bigyellow","yellow");
向下转型:
Dog d1 = (Dog)a; //要加强制转换符
备注:左为堆,右为栈。
补充
在这里需要说明一点,向下转型的前提是要先向上转型,否则在执行的时候会出错(编译不会出错)。无论是访问属性还是方法输出的都是由实际指向的对象的属性和方法。