java改变引用数据类型的值-金沙1005

java改变引用数据类型的值_8种基本数据类型java改变引用数据类型的值在java中,引用数据类型的数据传递的是值(地址)的拷贝对于以下代码上述是一个对生日对象进行初始化,并进行修改的程序。程序通过构造函数进行初始化,并尝试使用不同方法对对象存储的值进行修改。birthdate是一个引用数据类型,简单地用方法传递值不能改变对象存储的值

在java中,引用数据类型的数据传递的是值(地址)的拷贝
对于以下代码

class birthdate {
    private int day;
    private int month;
    private int year;
    
    public birthdate(int d, int m, int y) {
        day = d; 
        month = m; 
        year = y;
    }
    
    public void setday(int d) {
    	day = d;
  	}
  	
    public void setmonth(int m) {
    	month = m;
    }
    
    public void setyear(int y) {
    	year = y;
    }
    
    public int getday() {
    	return day;
    }
    
    public int getmonth() {
    	return month;
    }
    
    public int getyear() {
    	return year;
    }
    
    public void display() {
    	system.out.println
        (day   " - "   month   " - "   year);
    }
}
public class test {
    public static void main(string args[]){
        test test = new test();
        int date = 9;
        birthdate d1= new birthdate(7,7,1970);
        birthdate d2= new birthdate(1,1,2000);    
        test.change1(date);
        test.change2(d1);
        test.change3(d2);
        system.out.println("date="   date);
        d1.display();
        d2.display();
    }
    
    public void change1(int i){
    	i = 1234;
    }
    
    public void change2(birthdate b) {
    	b = new birthdate(22,2,2004);
    }
    
    public void change3(birthdate b) {
    	b.setday(22);
    }
}

希望我今天分享的这篇文章可以帮到您。

上述是一个对生日对象进行初始化,并进行修改的程序。程序通过构造函数进行初始化,并尝试使用不同方法对对象存储的值进行修改。

birthdate是一个引用数据类型,简单地用方法传递值不能改变对象存储的值,应该使用类birthdate的特定方法setday。

图解引用数据类型的值传递和内存变化

局部变量存储在栈内存中,对象的值存储在堆内存中,故进行初始化后,内存中的分布会呈现如下图

potplayermini64_lj4jogfnof.png

此时栈内存中存储了对象test、d1、d2的地址以及局部变量date的值,而堆内存中存储了d1的值和d2的值,由栈内存中d1和d2的地址指向堆内存中各自的值。

而当执行了下面程序段后

        test.change1(date);
        /*
          省略中间的代码
        */
    public void change1(int i){
    	/*
          尚未执行的代码
        */
    }

此时内存如下图所示

potplayermini64_ci7fsnjcxj.png

在方法change1中,程序段在栈内存中为形式参数i分配了新的空间,并通过值传递将其赋值为date的值,也就是9。

当开始执行代码段

    public void change1(int i){
    	i = 1234;
    }

potplayermini64_bocqo5i6lq.png

形式参数i的值被改为1234,而date中的值并没有改变。

当change1方法执行完毕后,为局部变量所分配的空间全部消失,而date的值依然为9,修改失败。

potplayermini64_lj4jogfnof.png

继续执行change2

        test.change2(d1);
        /*
          省略中间的代码
        */
    public void change2(birthdate b) {
    	/*
          尚未执行的代码
        */
    }

此时内存如下图所示

potplayermini64_x5dlzkd9em.png

系统在栈内存中开辟新的空间给b,并将对象d2的值(地址)传递给了形式参数对象b,使得b的地址指向了一个和d2地址指向相同的堆内存空间,也就是指向对象d2存储的值。看起来就要修改成功了,不是吗?

但当执行下面代码段

    public void change2(birthdate b) {
    	b = new birthdate(22,2,2004);
    }

gmustge52x.png

这时b的地址改为指向新new出来的对象,内容悄然发生改变。

当change2方法执行完毕后,为局部变量所分配的空间全部消失,存储在堆内存中的值也会在一段时间后被垃圾回收机制回收,而d2的值并没有发生变化,修改依然失败。

potplayermini64_lj4jogfnof.png

最后看change3代码段

        test.change3(d2);
        /*
          省略中间的代码
        */
    public void change3(birthdate b) {
    	/*
          尚未执行的代码
        */
    }

potplayermini64_x5dlzkd9em.png

类似于change2,系统给形式参数b分配了空间,指向d2对象的值

接下来执行setday方法

    public void setday(int d) {
    	day = d;
  	}
        /*
          省略中间的代码
        */
    public void change3(birthdate b) {
    	b.setday(22);
    }

setday是类birthdate中的方法,调用setday方法后,会将setday(int d)中的形式参数d传递给day这个成员变量,反映在内存中就是b的属性day变为22,由于b和d2在堆内存中所指向的是同一块内存空间,所以修改成功。

potplayermini64_9uwcbvspmm.png

最后b这块内存消失,此时birthdate对象d2的值已经发生改变。

potplayermini64_ob4t6bsmh1.png

金沙1005的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/381397.html

(0)


相关推荐

  • java cxf教程_cxf使用教程(一)——简介以及入门案例「终于解决」一.简介apachecxf是一个开源的service框架,可以用于简化用户的service开发,基于cxf开发的应用可提供soap、xml/http、restfulhttp或corba等服务。cxf底层页可以使用不同的传输协议,包括http、jms或jbi等。特性:支持大量的webservice标准,包括soap、ws-ibasicprofile、wsdl、ws-addressing、w…

  • 【java程序设计】(c00073)基于ssh(非maven)便利店管理系统-有文档基于ssh框架非maven开发的便利店管理系统共分为三个角色:系统管理员、销售管理员角色包含以下功能:系统管理、用户管理、商品管理、采购管理、库存管理、销售管理、财务管理(成本报表、收入报表、利润报表)销售角色包含以下功能:销售记录的添加、删除、修改;

    2023年10月22日
  • java实现自定义注解前言    上一篇文章介绍了注解的一些基本知识,这次来介绍下如何实现自定义注解及注解如何使用。正文    注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。…

    2022年11月23日
  • javacms开源免费_java搭建网站[通俗易懂]自从6月5日发布1.1版以来,javapms研发工作一直在持续进行,期间得到了很多朋友的意见反馈支持,在此一并表示感谢!javapmsv1.2的定位是正式版发布前的最后一个beta版本,为之后的资讯门户正式版和政府门户版打下坚实基础。新版继续采用springmvc架构,并将spring升级到了3.2版,新加入了文档自定义工作流、问卷调查、广告管理等实用模块,总共进行了30…_推荐几个javapms系统

    2023年11月26日
  • 11-javascript for 循环1、javascript 循环 如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的。 我们可以这样输出数组的值: 一般写法: document.write(cars[0] “
    “); document.write(cars[1] “
    “); docu …

  • java list的remove()方法陷阱[亲测有效]java的list在删除元素时,一般会用list.remove(o)/remove(i)方法。在使用时,容易触碰陷阱,得到意想不到的结果。_remove(0)

  • mysql-connector-java详解「终于解决」mysql-connector-java是什么?怎么下载?怎么使用?

  • java图形界面框架_javagui界面设计java图形化界面设计之容器(jframe)详解java图形化界面设计——容器(jframe)程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程。一、java基本类(jfc)java基本类(“javafoundationclasses”,jfc),由一些软件包组成。这些软件包主要包括下面一些应用程序接口(api):·抽象窗口工具集(awt)(1.1及以上版本)。_jframe

发表回复

您的电子邮箱地址不会被公开。

联系js555888金沙老品牌

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图