总结:
基本类型的变量值小,可直接拷贝;
对象包含多个值,不容易复制,赋值采用共享同一块内存区域。
基本类型示例:
public class Test{
public static void main(String[] args){
int a = 5;//基本数据类型的赋值过程就是值拷贝的过程,将5这个值拷贝给a
int b = 0;//同理,将0这个值拷贝给a
b = a;//执行这一步时,将a的值拷贝给了b,b此时的值就是5
b = 6;//将6这个值拷贝给了b
System.out.println("a:" + a);//输出 a:5
System.out.println("b:" + b);//输出 b:6
}
}
从上面可以看出,修改 a或者b的值时,另一个变量的值不会受到任何影响
引用类型示例:
/**
* 实体类(引用类型)
*/
public class User{
public int age;//int默认值为0
}
public class Test{
public static void main(String[] args){
User u1 = new User();//u1的引用指向u1的引用
User u2 = new User();//u2的引用指向u2的引用
u1.age = 20;
u2 = u1;//将u2的引用指向u1的引用,即 u2和u1共享同一个内存区域中的数据
System.out.println("u1的age:" + u1.age);//输出 u1的age:20
System.out.println("u2的age:" + u2.age);//输出 u2的age:20
u2.age = 30;
System.out.println("u1的age:" + u1.age);//输出 u1的age:30
System.out.println("u2的age:" + u2.age);//输出 u2的age:30
}
}
从上面可以看出,修改 u1.age或者u2.age的值时,另一个变量的值也会一起变化,因为它们所指向的数据是同一份数据
因为前面讲到基本数据类型和引用数据类型存储的方式不同(详见开头总结),所以因此在对数据进行修改时也会有不同
public class Test {
public static void main(String[] args) {
String name = "张三";
int age = 8;
String[] su = new String[]{"语文", "数学", "英语"};
Student stu1 = new Student(age, name, su);
/*
* 测试代码
* int是基本数据类型
* String是比较特殊的引用数据类型
* []数组是引用数据类型
* */
System.out.println("修改前输出");
System.out.println(age+"\t"+name+"\t"+ Arrays.toString(su));
//直接调用方法修改数据
stu1.直接修改基本数据类型(age);
stu1.直接修改引用数据类型(name);
stu1.直接修改引用数据类型2(su);
System.out.println("修改后输出");
System.out.println(age+"\t"+name+"\t"+ Arrays.toString(su));
System.out.println();
System.out.println("修改前输出");
System.out.println(stu1.toString());
//传入引用数据类型修改
stu1.修改引用数据中的基本数据类型(stu1);
stu1.修改引用数据中的引用数据类型(stu1);
stu1.修改引用数据中的引用数据类型2(stu1);
System.out.println("修改后输出");
System.out.println(stu1.toString());
}
}
class Student {
//基本数据类型
int age;
//引用数据类型
String name;
//引用数据类型2
String[] subject;
public Student(){}
public Student(int age, String name, String[] subject) {
this.age = age;
this.name = name;
this.subject = subject;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", subject=" + Arrays.toString(subject) +
'}';
}
public void 直接修改基本数据类型(int age) {
age++;
}
public void 直接修改引用数据类型(String name) {
name += "已修改";
}
public void 直接修改引用数据类型2(String[] su) {
su[0] = "已修改";
}
public void 修改引用数据中的基本数据类型(Student stu) {
stu.age += 2;
}
public void 修改引用数据中的引用数据类型(Student stu) {
stu.name += "已修改2";
}
public void 修改引用数据中的引用数据类型2(Student stu) {
stu.subject[0]="已修改";
}
}
输出结果
总结 :
( 一 ) int作为基本数据类型,是直接把一个值传进方法体进行修改,
而String虽然是引用数据类型,但是因为其特殊性质,也有int这种基本数据类型直接把值拷贝一份传入的特性,
而 [ ] 数组作为正常的引用数据类型,很明显就是把存储值的地址值传入方法进行操作,进而在修改后影响了外部的数据值
(二) 后用 Student对象 存储基本数据类型和特殊的String引用数据类型和正常的 [ ] 数组引用类型,然后进行修改其值,可以发现在外部调用的值都是修改后的结果,因为对象也是引用数据类型,把存储值的地址值传入方法,而方法根据地址值修改后,在外部调用的依旧是地址值链接的值