尚硅谷JavaSE基础
6.3.2 对象的传递
1. 为什么要传递对象
在有些方法中, 功能的完成除了需要一些基本数据外, 还需要复杂类型, 比如在Teacher类中方法
public void lesson() {
// 老师上课的代码, 老师上课时, 需要一台电脑, 这时就可以通过参数传递一个电脑对象
}
修改为
public void lesson(Computer computer) {
// 老师上课的代码, 老师上课时, 需要一台电脑, 这时就可以通过参数传递一个电脑对象
// 这样在老师上课的代码中, 就可以直接使用传入的Computer对象.
}
2.对象如何传递
在方法调用时, 由调用者传实参时,负责把对象传给方法.
public class Computer { private double cpu; private int memory; public Computer() {} public Computer(double cpu, int memory) { this.cpu = cpu; this.memory = memory; } public void setCpu(double cpu) { this.cpu = cpu; } public double getCpu() { return cpu; } public void setMemory(int memory) { this.memory = memory; } public int getMemory() { return memory; } public String say() { return "CPU:" + cpu + "GHz, 内存:" + memory + "G"; } } |
public class Teacher { private String name; private int age = 30; private String gender = "女"; public Teacher() { // 无参构造器 this("佟刚", 35, "女"); } public Teacher(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setGender(String gender) { this.gender = gender; } public String getGender() { return gender; } public void lesson(Computer com) { // 这个方法应该需要一台电脑才能上课 System.out.println("[" + this.name + "] 老师使用电脑[" + com.say() + "]在上课"); } public String say() { return "姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.gender; } } |
public class TeacherTest { public static void main(String[] args) { Teacher t = new Teacher("李四", 25, "女"); Computer com = new Computer(3.5, 4); // 要传递的对象先创建好 t.lesson(com); // 通过实参传递对象 // 以上代码打印输出为”[李四] 老师使用电脑[CPU:3.5GHz,内存:4G]在上课" } } |
3.传递的是什么
在方法调用中的实参com是在main方法中声明的引用变量, 但是这个引用指向了在main中创建的新的Computer对象, 所以在lesson方法执行时, 接收到的是对象的引用, 通过引用使用了对象.
4.对象传递的优点
即使对象很大, 属性很多, 在对象传递时, 并不是把对象本身复制了一份, 而是只把对象的引用传递了, 优点就是速度快.
5.对象传递的危险性
危险性就在于因为传递了对象的引用, 这样通过引用一方面可以读取对象的属性或调用对象的方法, 同时如果通过引用直接修改对象的属性, 也会导致对象属性的变化, 所以当把对象传递给方法时, 如果在方法内部有对于对象的修改操作, 对于调用者来说, 这个修改也是同步的.
public class Teacher {
private String name;
public void lesson(Computer com) { // 这个方法应该需要一台电脑才能上课 System.out.println("[" + this.name + "] 老师使用电脑[" + com.say() + "]在上课"); com.setMemory(8); }
} |
public class TeacherTest { public static void main(String[] args) { Teacher t = new Teacher(); Computer com = new Computer(3.5, 4); // 要传递的对象先创建好 t.lesson(com); // 通过实参传递对象
System.out.println(com.getMemory()); // 输出的不是原来的4而是在方法中被修改后的8 } } |