1、基本数据类型(值传递
)
java中的基本数据类型可以在栈(stack)中直接分配内存,它有以下八种:
boolean,byte,char,short,int,long,float,double
2、引用数据类型(址传递
或 引用传递
)
除了基本数据类型外,他们的对象的引用在栈(stack)中,对象实际存放在堆(heap)中,实际上是将对象的地址赋值了过去。
3、特殊类型(效果等同于值传递
)
String类型、Integer类型等,这些类型保存数据的变量是final类型,只要牵涉到数据变更,都需要返回一个新建的对象,但原来的对象的数据并不会变更,效果等同于值传递。
测试代码
package org.goodStudy.test;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
/**
* @Author dingws
* @PackageName JavaStudy
* @Package org.goodStudy.test
* @Date 2023/1/5 16:35
* @Version 1.0
*/
public class testPassParam {
@Data
static class MyClass {
private Integer aa = 00;
}
static void changIntegerValue(Integer param){
param = 1;
}
static void changStringValue(String param){
param = "xyz";
}
static void changClassValue(MyClass param){
param.setAa(11);
}
static void changMapValue(HashMap param){
param.put("0", "xyz");
}
static void changArrayValue(char[] param){
param[0] = 'x';
param[1] = 'y';
param[2] = 'z';
}
static void changCharValue(char param) {
param = 'x';
}
public static void main(String[] args) {
Integer a = new Integer(0);
System.out.println("a = " + a);
changIntegerValue(a);
System.out.println("after chang value --- a = " + a);
String b = "abc";
System.out.println("b = " + b);
changStringValue(b);
System.out.println("after chang value --- b = " + b);
String c = new String("abc");
System.out.println("c = " + c);
changStringValue(b);
System.out.println("after chang value --- c = " + c);
HashMap d = new HashMap();
d.put("0", "abc");
System.out.println("d = " + d);
changMapValue(d);
System.out.println("after chang value --- d = " + d);
char[] e = new char[]{'a', 'b', 'c'};
System.out.println("e = " + e[0] + e[1] + e[2]);
changArrayValue(e);
System.out.println("after chang value --- e = " + e[0] + e[1] + e[2]);
char f = 'a';
System.out.println("f = " + f);
changCharValue(f);
System.out.println("after chang value --- f = " + f);
MyClass myClass = new MyClass();
System.out.println("myClass = " + myClass);
changClassValue(myClass);
System.out.println("after chang value --- myClass = " + myClass);
}
}
上面代码输出结果:
a = 0
after chang value --- a = 0
b = abc
after chang value --- b = abc
c = abc
after chang value --- c = abc
d = {0=abc}
after chang value --- d = {0=xyz}
e = abc
after chang value --- e = xyz
f = a
after chang value --- f = a
myClass = testPassParam.MyClass(aa=0)
after chang value --- myClass = testPassParam.MyClass(aa=11)