java中传参内幕

java中的参数传递传的其实是value。

先说一种现象,废话不多说,直接代码:

A类(作为参数传递):

public class A {
	 int i=1;

}

B类:

public class B {

	 B(A a){
		a.i+=1;

	}

}

Test类(运行类):

public class Test {

	public static void main(String[] args) {

		A a = new A();

		B b = new B(a);
		B b1 = new B(a);
		B b2 = new B(a);

		System.out.println(a.i);

	}
}

结果是:4

另一种情况:

B类:

public class B {

	 B(Integer i){
		i+=1;

	}

}

Test类:

public class Test {

	public static void main(String[] args) {

		Integer i = new Integer(1);

		B b = new B(i);
		B b1 = new B(i);
		B b2 = new B(i);

		System.out.println(i);

	}
}

结果是:1

为什么第一种情况会改变,第二种情况没变呢,想了一个晚上,个人觉得应该是这样的:

传参时传过去的是value,

对于第一种情况,我定义key为a的value名为va,如果是我想的那样,那么传过去的就是va,就算va如何变,他的索引,即key a一直对应的就是va。所以输出a时,就是输出va。

而第二种情况呢,

我定义key为i(Test的i)的value为vi1,同样将vi1传过去,vi1加一后将赋值给i(B的i),i的value定义为vi2,所以变的是vi2不是vi1,跳回Test,i(Test的i)对应的value还是vi1,所以没变。

如果要使它变,必须返回vi2赋值给i(Test的i)。

如果要使第一种情况不变,那就在方法里面new另外一个A类,那么改变的是新的A类,原来的key a对应的value就不会改变。这给第二种情况i不变的原因是一样的。

纯属个人观点,欢迎指导。

时间: 2024-10-11 15:39:40

java中传参内幕的相关文章

Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String'

一.发现问题 <select id="queryStudentByNum" resultType="student" parameterType="string"> select num,name,phone from student <where> <if test = " num!=null and num!='' "> AND num = #{num} </if> <

Mybatis中传参包There is no getter for property named &#39;roomName&#39; in &#39;class java.lang.String&#39;

一.发现问题 <select id="queryStudentByNum" resultType="student" parameterType="string"> select num,name,phone from student  <where> <if test = " num!=null and num!='' ">AND num = #{num}</if></w

Java URL传参中文乱码问题

我们经常会遇到这样的场景:在URL中传递参数,如果该参数为中文,如果设置不当,会出现乱码问题. URL传参所使用的编码为服务器中设置的编码,而ajax请求的编码为页面编码. 如果不设置tomcat的默认编码为ISO-8859-1,而如果在设置中加入 useBodyEncodingForURI="true" <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="

java 方法传参

这是小弟的第一篇博客,写得不好还请看官见谅哈! java 有两种数据类型:基本数据类型(int,short,long,byte,float,double,boolean,char),引用数据类型(基本数据类型之外的数组,String,对象等等). 在方法中传参数有两种方式:值传递和引用传递 先看下面的一个实例. public class Stu { String name; int age; public String getName() { return name; } public void

js在URL中传参中文出现乱码

最近用easyUI做一个下拉框,在输入某值后根据某值模糊查询: $('#comboboxA').combobox({ url:basePath+'form/formListForCombobox', method:'get', valueField:'formId', textField:'formDisplayName', panelHeight:200, multiple:false, keyHandler: { up: function (e) {               //[向上键

C# 中传参中的OUT 和 ref 区别 笔记

//out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) 2 { 3 int I = 10; 4 //int J = 10; 5 //int I; 6 int J; 7 //int[] k=new int[5]{1,2,3,4,5}; 8 int[] k = new int[5]; 9 //int[] l = new int[5]{1,2,3,4,5}; 10 int[] l = new

Java方法传参

1.创建students类-----//主要构造对象 http://vipnoon.blog.51cto.com/7589908/1792786 2.创建calc类---------//主要构造方法 public class calc { public void calc1(int num){  num = num + 1; } public void calc2(students stu){ stu.setAge(stu.getAge()+1); } } 3.创建calcDemo类-----/

慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用

来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 calSum( ) 方法中,返回值类型为 int 类型,因此在方法体中必须使用 return 返回一个整数值. 调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理.如:

说说java中传容器某些情况下失效

楼主今天写个方法移除map集合中的空值,遇到个问题,就是对容器操作后,发现失效了:先上代码 public static void removeValueNullAndEmpty(Map<String,String> A) { Map<String,String> B = new HashMap<>(); for(String key : B.keySet()){ if(A.get(key) != null || !"".equals(A.get(ke