JAVA 引用与对象

参考:https://www.cnblogs.com/perfy/archive/2012/10/16/2726039.html

对象的引用

Person person = new Person("张三");
Person person;
person = new Person("张三");

此处,person只是一个指向对象的引用,new Person('张三')才是创建了这个对象。


Person person;
person = new Person("张三");
person = new Person("李四");

此处,首先声明了person这个"对象的引用",然后先让它指向"张三",后让其指向"李四"


Person person2 = person;

这句话并不是进行对象的复制,而是让person2也指向了 person指向的对象。

也就说,我们用person2改变值时,也会影响person指向对象的值。如下:

person2.setName("王五");
System.out.println(person.getName()); // 输出"王五"

函数传参

如果传入方法的是基本类型的东西,你就得到此基本类型的一份拷贝。如果是传递对象,则是传递了那个对象的引用。

详情请看如下代码与注释

package hello;

class Test03
{
    public static void main(String[] args)
    {
        StringBuffer s= new StringBuffer("good");
        StringBuffer s2=new StringBuffer("bad");
        test(s,s2);
        System.out.println("out of test, s is " + s); // 输出'goodhah'
        System.out.println("out of test, s2 is " + s2); // 输出'bad'
    }
    static void test(StringBuffer s,StringBuffer s2) 
    {
        System.out.println(s);
        System.out.println(s2);
        s2=s; //此时,局部变量s2已与  main中的s2所指向的StringBuffer脱离关系,而是指向了main中s指向的对象
        s=new StringBuffer("new"); // 此时,局部变量s已与  main中的s所指向的StringBuffer脱离关系,而是指向了新的StringBuffer对象
        System.out.println("after s is assigned to 'new', s is: " + s);
        System.out.println("after s2 is assigned to s('good'), s2 is: " + s2);
        
        s.append("hah");
        s2.append("hah");
        // 此时,局部变量s的操作与main中那两个StringBuffer无关了
        // 而s2改变的对象正是 main中的s指向的对象
        
        System.out.println("s is: " + s); // 输出 newhah
        System.out.println("s2 is: " + s2); // 输出 goodhah
    }
}

参考如上代码,我们发现,实际上JAVA的传递都是传递了值,只不过局部参数中的StringBuffer s其实是一个对于对象的引用。 换句话说,在java中,我们必须拥有一个对象的引用,才能去操作堆中的那个对象。而不能用c++中的思维去认为有"对象"及其"引用"。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏dotnet & java

[SpingBoot guides系列翻译]通过JDBC和Spring访问关系数据库

build的时候用到了spring-boot-maven-plugin插件。他提供了很多便捷的特性。

11650
来自专栏Java技术栈

Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!

前段我在Java技术栈微信公众号时间分享了《阅读跟踪 Java 源码的几个小技巧》是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读...

26320
来自专栏Java Web学习

SpringBoot整合shiro从初恋到失恋

另外三个跳转页面就不贴出来了,panpan账号登录可以查看和删除,用xiaoli账号登录则只有查看而没有删除的权限,代码见下面,sql文件在resources包...

9000
来自专栏A周立SpringCloud

有关 Spring 异步的有效建议

根据目前的趋势,我发现初级到高级的开发者都使用 Spring Boot 作为他们构建软件的首选务器。事实上,它对开发人员友好,它“约定优于配置”的风格有助于开发...

10810
来自专栏Java技术栈

搞懂这7个Maven问题,带你吊打面试官!

在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见。Maven的仓库管理、依赖管理、继承和聚合等特性为项目的构建提供了一整套完善的解决方案...

21920
来自专栏A周立SpringCloud

跟我学Spring Cloud(Finchley版)-26-使用Elasticsearch作为Zipkin的后端存储

前文搭建的Zipkin Server是没有后端存储的——数据会存储在Zipkin的内存中。这一般不适合生产,本节来探讨如何将Zipkin中的数据持久化。

30610
来自专栏码神联盟

ES | ElasticSearch在Linux下的安装和启动、常见问题解决

https://www.elastic.co/cn/downloads/elasticsearch

4.4K10
来自专栏Java架构师进阶

构造方法、封装、关键字(this、static)和代码块的介绍

构造方法在初始化一个类的对象时进行调用,它没有返回值,方法名与类名相同,而成员方法是则是由对象主动调用,它有返回值,表现为对象的操作行为。

9930
来自专栏IT大咖说

Java开发人员最常犯的9个错误

这是我觉得java中比较常见的问题。如果您不同意任一部分,请留下您的评论。如果您能提出其它一些常见的错误,我将会非常感激。

10410
来自专栏aoho求索

细说 Java 泛型及其应用

当获取列表中的第二个元素时,会报错,java.lang.ClassCastException: java.lang.Integer cannot be cast...

9210

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励