在Java中的引用类型,是指除了基本的变量类型之外的所有类型,所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失),
基本的变量类型只有一块存储空间(分配在stack中)
引用类型有两块存储空间(一块在stack中,一块在heap中),
方法形参的值传递(引用)是指形参和传进来的参数指向同一个值的内存(heap)中;
1) 简单类型是按值传递的
以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值
一个方法不能够修改一个基本类型的实参的值
public class SimpleTypeTest { public static void changeMethod(int simpleData){ simpleData = 456; System.out.println("inside method--"+simpleData); } public static void main(String[] args){ int simpleData = 123; System.out.println("before call--"+simpleData); changeMethod(simpleData); System.out.println("after call--"+simpleData); } }
before call--123
inside method--456
after call--123
1) 引用类型
引用其实就像是一个对象的名字或者别名,一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问
引用是一种数据类型,保存了对象在内存中的地址
不同的引用可能指向同一个对象
一个方法可以改变对象的状态
一个方法不能让实参引用指向另一个对象
public class ReferenceTypeTest { public static void changeMethod(StringBuffer sbuffer){ sbuffer.append(" World"); sbuffer = new StringBuffer("My new Object"); System.out.println("inside method--"+sbuffer.toString()); } public static void main(String[] args){ StringBuffer sb = new StringBuffer("Hello"); System.out.println("before call--"+sb.toString()); changeMethod(sb); System.out.println("after call--"+sb.toString()); } }
before call--Hello
inside method--My new Object
after call--Hello World
形参sbuffer指向实参sb所指向的对象,之后让sbuffer指向changeMethod中新建的对象,实参只是在开始起了作用,后面便没有用到