对象转型及其在内存中的分析

来源:互联网 发布:淘宝差价链接怎么做 编辑:程序博客网 时间:2024/05/21 04:40

引入

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); //trueSystem.out.println(c instanceof Animal); //trueSystem.out.println(d instanceof Animal); //trueSystem.out.println(a instanceof Cat);  //falsea = new Dog("bigyellow","yellow");System.out.println(a.name);  //bigyellowSystem.out.println(a.furname);  //!errorSystem.out.println(a instanceof Animal);//trueSystem.out.println(a instanceof Dog); //trueDog 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); //trueSystem.out.println(c instanceof Animal); //trueSystem.out.println(d instanceof Animal); //trueSystem.out.println(a instanceof Cat);  //false
性质4:

向上转型:

a = new Dog("bigyellow","yellow");
向下转型:

Dog d1 = (Dog)a; //要加强制转换符

备注:左为堆,右为栈。

补充

在这里需要说明一点,向下转型的前提是要先向上转型,否则在执行的时候会出错(编译不会出错)。无论是访问属性还是方法输出的都是由实际指向的对象的属性和方法。


0 0
原创粉丝点击