常用总结是否会影响外部变量的值
基本变量类型
- 比如int,short,long,double,float,boolean,char ,byte 都不会被影响,都是值传递
非基本变量类型
- Interger,Short,Long,String,Double,Float,Boolean,Character,Byte 都不会被影响。这些虽然是类,但是被特殊处理过,所以不会被影响。
- 自定义类型会被影响,传入的是引用,会改变外部变量的值。
- List,Map,Set 常用的类都会被影响,会改变外部变量的值。
自定义对象中的变量类型
- 比如Student中的name(类型为String),通过get方法取出,并对取出的对象修改。并不会修改student对象中的值。如果student类中有一个class(自定义对象),通过get方法取出并对其修改,则会影响student中的class对象的值。
- 总结如果自定义对象中的属性是基本变量类型(包括衍生类和String),通过get方式取出,则不会影响原对象。如果是非基本变量类型,则会影响原对象。
代码
主干代码Main方法
package com.test.ljj;
public class MethodExplore {
public static void swap(String a,String b){
String temp=a;
a=b;
b=temp;
}
public static void swap(Integer a,Integer b){
Integer temp=a;
a=b;
b=temp;
}
public static void swap(Student student01,Student student02){
Student temp=new Student(student01);
student01.setName(student02.getName());
student01.setAge(student02.getAge());
student02.setName(temp.getName());
student02.setAge(temp.getAge());
}
public static void main(String[] args) {
String a="fujian";
String b="beijing";
swap(a,b);
System.out.println(a);
System.out.println(b);
Integer c=1;
Integer d=2;
swap(c,d);
System.out.println(c);
System.out.println(d);
Student student1=new Student("apple",2);
Student student2=new Student("balance",3);
swap(student1,student2);
System.out.println(student1);
System.out.println(student2);
}
}
非主干代码
- Student 类
package com.test.ljj;
public class Student {
private String name;
private Integer age;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Student(Student student) {
this.name = student.getName();
this.age = student.getAge();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
作者部分执行结果
一问一答
-
List<Student> 对象,从list中取出一个Student类型的对象,会是值传递还是引用传递?
引用传递
-
List<Student> list1 中调用add方法添加一个对象a,List<Student> list2 中也调用add方法对象添加一个对象a,修改list1中的a对象,是否会改变list2中a对象的值?
会修改list2中的值,因为是引用传递,指向的student对象都是同一地址,所以修改了一个,将会使他们都被修改。
补充
- Intger虽然有-127~127的缓冲池,但是哪怕用1000,2000的数据进行测试,方法内依旧不是引用的关系,而是新建了一个对象。所以不会影响外部变量的值。