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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013037201/article/details/54565112

引入

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; //要加强制转换符

备注:左为堆,右为栈。

补充

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


猜你喜欢

转载自blog.csdn.net/u013037201/article/details/54565112