一.对象和引用

要了解Java中对象在内存中的位置,首先要分清楚两个概念,对象和引用。在Java中,使用

new Object()

来产生一个新的对象,这时,对象存在于堆内存中。而使用

Object object

仅仅产生了一个Object引用,引用存在于栈内存中,但此时仅仅声明了一个引用,并没有指向任何Object对象。可能到这里你还是不太理解对象和引用的概念。做一个很形象比喻,引用就像是一台电视机的遥控器,而对象则是电视机。引用是一个可以操控对象的入口,而对象则是操作的实体。它们两个在内存位置如下图:

Java中大对象和引用 java对象的引用在哪存着_父类

如果仅仅只是声明了一个引用,则JVM仅仅在类的栈区内存分配了一个空间,用来保存引用的值。这里可以将引用看做C语言中的指针,或者可以看做C++中的句柄。这时就出现了第二个问题,如何将对象赋值给引用?Java给了我们两种方法:

引用赋值的两种方法:


1.先声明引用,再进行赋值


Object object;
object = new Object();

2.直接在声明引用时赋值


Object object = new Object();

这时,引用就和对象连接在一起了,我们就可以通过引用来对对象进行操作了。他们现在在内存中如下:


Java中大对象和引用 java对象的引用在哪存着_父类_02


需要注意的时,Java中一个对象可以被多个引用指向,但是一个引用只能指向一个对象。


二.继承中的引用和对象


我们先来看一段代码


public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		father fa = new son();
		fa.sub();//调用父类sub方法
		//fa.Test();  //无法调用
		fa.test();  //调用子类test方法
		son b = (son)fa;
		//b.test();
		   b.Test();       //调用子类Test方法
	}

}

class father{	void sub(){		System.out.println("father.sub()");	}
	void test(){
		System.out.println("father.test()");
	}
}

class son extends father{
	void Test(){
		System.out.println("son.Test()");
	}	void test(){			System.out.println("son.test()");

	}
}
		fa.sub();//调用父类sub方法
		//fa.Test();  //无法调用
		fa.test();  //调用子类test方法
		son b = (son)fa;
		//b.test();

		   b.Test();       //调用子类Test方法
	}

}

class father{
	void sub(){
		System.out.println("father.sub()");
	}
	void test(){
		System.out.println("father.test()");
	}
}

class son extends father{
	void Test(){
		System.out.println("son.Test()");
	}

	void test(){	

		System.out.println("son.test()");
	}
}