java按值传递

public class Test {

public static void main(String[] args) {

int a =0;

        String b ="b";

        StringBuilder c =new StringBuilder("c");

        test(a,b,c);

        System.out.println("a = " + a +",b = " + b +",c = " + c);

    }

public static void test(int a, String b, StringBuilder c) {

a = a +1;

        b = b +"1";

        c = c.append(1);

    }

}

这是遇到的面试题。当时我的回答是a = 1,b = b1,c = c1。

so,当然这个是错的。回来run了一下程序,答案是a = 1,b = b,c = c1。

然后和同学讨论了一下,加上百度,发现要理解这个答案,并不容易。这里仅仅了解按值传递这个概念是不够的,这里设计到的java基础知识还包括对象引用和对象的关系,形参和实参的关系。

String b = "b"中,String b创建了一个对象引用,"b"则是创建了一个对象(在内存中开辟了一块区域),= 号则讲对象引用指向了这个对象,换个说法就是对象引用保存了对象的内存地址。(这里只是简单介绍了对象引用和对象的关系)

调用一个函数,实参传递值给形参时,基本数据类型是直接拷贝一个新的值,引用类型则是拷贝一个内存地址,所以实参和形参指向的是同一个对象。String和StringBuilder都是引用类型,但是在test里对他们的操作其实是有区别的。

//这里是重点

b = b + "1",由于String具有不可变现,这个操作相当于创建了一个新的对象,所以这里形参是指向了一个新的对象。而c = c.append(1)并没有创建新的对象,还是对原有对象进行操作。

public class hello{

 public static void main(String[] args){

      int a = 0;

        String b = "b";

        StringBuilder c = new StringBuilder("c");

        int a1 = a;

        a1 = a1 +1;

        String b1 = b;

        b1 = b + "1";

        StringBuilder c1 = c;

        c1.append(1);

//      test(a,b,c);

        System.out.println("a = "+a+" b = "+b+" c = "+c);

}

或者把test里的方法放到外边写,效果也是一样的。b1 = b+"1",b1这个对象引用指向了新的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,516评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,161评论 19 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,893评论 0 17
  • 奥迪R8在国内市场价格为215.8万起,然而对于这样一款豪华轿跑,看看国外评测对它是怎样的评价。 2018款奥迪R...
    谈谈SUV阅读 1,778评论 0 0
  • " 这是我第一篇原创文章 " 四个月前,木子在期末音乐考试唱了一首歌,这首歌她练习了很久。但是很多时候,努力是没有...
    Niceser阅读 4,221评论 0 2

友情链接更多精彩内容