结论:java中是值传递
1、java内存模型
int n = 20; String string = new String("Happy!");
String str = "Happy!";
在赋值操作中,基本类型的20及其引用n都被存在了栈空间中;
引用类型的引用的地址被存储在栈空间,新建的对象则被存储在堆空间。(String字面量赋值方式除外,字面量会存储在常量池里)
2、方法调用过程
方法的调用就是给形参赋值的过程。
static void foo(int num) { num = 100; } static void foo(String str) { str = "Hello World!"; } static void foo(StringBuilder builder) { builder.append("bich"); } public static void main(String[] args) { //测试基本数据类型 int n = 20; foo(n); System.out.println("n=" + n);//n=20 //测试字符串类型 String string = "Happy!"; foo(string); System.out.println("string=" + string);//string=Happy! //测试类型可变的引用类型 StringBuilder bui = new StringBuilder("Happy!"); foo(bui); System.out.println("bui=" + bui);//bui=Happy!bich }
对于基本类型来说:int n=20,调用foo(int num),先对形参赋值,使得num=20,在foo方法中的操作对于n=20来说是没有任何影响的;
对于引用类型来说:StringBuilder bui = new StringBuilder("Happy!"),先对形参赋值使得builder=bui所引用的对象,即此时有bui和builder这两个引用同时指向了同一个StringBuilder对象,StringBuilder对象是可变的,所以foo方法对其进行append()操作之后,这个共同的StringBuilder对象也会发生变化,从而输出bui引用时,输出的是变化的StringBuilder对象。
对于String来说:String string = "Happy!",虽然调用foo(String str)也会对str赋值,但是对str的操作是不会影响原来的传入对象的,即string永远引用的事"Happy!"这个对象。
=============================================================================================================================
最怕一生碌碌无为,还说平凡难能可贵
=============================================================================================================================