JAVA八种基本数据类型
字符类型 char 布尔类型boolean 数值类型byte、short、int、long、float、double
一个特殊类型String
经验证八种基本数据类型以及对应的包装类以及String类型不会被形参的值改变而影响本身的值。
代码
import java.util.List;
import java.util.ArrayList;
class Solution {
public void test(int a){
a=2;
}
public void test(int[] a){
a[0]=5;
a[1]=5;
}
public void test(ArrayList a){
a.clear();
a.add(new Integer(5));
}
public void test(Integer a){
a=15;
}
public void test(String a){
a="改变了";
}
public void test(animal a){
a.ans=10;
}
public static void main(String[] args) {
Solution a=new Solution();
int exam1=1;
a.test(exam1);
System.out.println("int类型测试:"+exam1);
int[] exam2={1,2};
a.test(exam2);
System.out.println("int数组类型测试:"+exam2[0]+" "+exam2[1]);
ArrayList<Integer> exam3=new ArrayList<>();
exam3.add(new Integer(1));
a.test(exam3);
System.out.println("List测试:"+exam3.get(0));
Integer exam4=new Integer(1);
a.test(exam4);
System.out.println("Integer包装类测试:"+exam4);
String exam5="未改变";
a.test(exam5);
System.out.println("String类型测试:"+exam5);
animal exam6=new animal(1);
a.test(exam6);
System.out.println("自定义类型测试:"+exam6.ans);
}
//自定义类型测试
public static class animal{
int ans;
public animal(int ans){
this.ans=ans;
}
}
}
结果
int类型测试:1
int数组类型测试:5 5
List测试:5
Integer包装类测试:1
String类型测试:未改变
自定义类型测试:10
原因
基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。
引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果直接改变副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。
其实就相当于基本数据类型和String传入的其实是一个副本,所以改变形参对原本值无影响。而其余类型包括自定义类型传入的其实是一个引用,形参改变,实参跟着改变。