关于Java对象的传递和返回,我们需要注意以下细节问题。
Java对象传递的细节问题
在Java中,我们可以将对象作为参数传递给方法,这种传递方式是引用传递。即方法得到的是对象的地址,我们通过地址来操作这个对象。在这个过程中,如果对象被修改了,那么原对象也会相应的被修改。
示例一:
public class Student {
String name;
int age;
}
public class Test {
public static void main(String[] args) {
Student stu1 = new Student();
stu1.name = "Tom";
stu1.age = 18;
System.out.println("调用前:name=" + stu1.name + ", age=" + stu1.age);
modifyStudent(stu1);
System.out.println("调用后:name=" + stu1.name + ", age=" + stu1.age);
}
public static void modifyStudent(Student stu) {
System.out.println("修改前:name=" + stu.name + ", age=" + stu.age);
stu.name = "Jerry";
stu.age = 20;
System.out.println("修改后:name=" + stu.name + ", age=" + stu.age);
}
}
输出结果为:
调用前:name=Tom, age=18
修改前:name=Tom, age=18
修改后:name=Jerry, age=20
调用后:name=Jerry, age=20
从输出结果可以看出,在方法中更改了对象的属性,原对象也随之改变。
但是需要注意,在Java中无论如何都不能改变对象的地址。
示例二:
public class Test {
public static void main(String[] args) {
String str = "Hello";
System.out.println("调用前:" + str);
modifyString(str);
System.out.println("调用后:" + str);
}
public static void modifyString(String str) {
System.out.println("修改前:" + str);
str = "World";
System.out.println("修改后:" + str);
}
}
输出结果为:
调用前:Hello
修改前:Hello
修改后:World
调用后:Hello
可以看出,在方法中修改了字符串,但是没有改变原来的字符串,而是返回了一个新的字符串。
Java对象返回的细节问题
在Java中,方法可以返回对象类型。同样,返回的也是对象的地址。需要注意的是,如果返回的是对象的引用,那么在外部操作这个对象时,同样会影响到这个对象的原始值。
示例三:
public class Test {
public static void main(String[] args) {
Student stu1 = getStudent();
System.out.println("调用后:name=" + stu1.name + ", age=" + stu1.age);
}
public static Student getStudent() {
Student stu = new Student();
stu.name = "Tom";
stu.age = 18;
System.out.println("调用前:name=" + stu.name + ", age=" + stu.age);
return stu;
}
}
输出结果为:
调用前:name=Tom, age=18
调用后:name=Tom, age=18
在Example3中,getStudent方法返回了Student对象,而在main方法中,将返回值赋值给了stu1变量。从输出结果可以看出,stu1的值与getStudent方法返回的对象是同一个,因此修改stu1的值会影响原始对象。
示例四:
public class Test {
public static void main(String[] args) {
Student stu1 = getStudent();
Student stu2 = getStudent();
System.out.println("调用后:stu1 name=" + stu1.name + ", age=" + stu1.age);
System.out.println("调用后:stu2 name=" + stu2.name + ", age=" + stu2.age);
}
public static Student getStudent() {
Student stu = new Student();
stu.name = "Tom";
stu.age = 18;
System.out.println("调用前:name=" + stu.name + ", age=" + stu.age);
return stu;
}
}
输出结果为:
调用前:name=Tom, age=18
调用前:name=Tom, age=18
调用后:stu1 name=Tom, age=18
调用后:stu2 name=Tom, age=18
可以看出,无论用getStudent方法返回多少个对象,这些对象在外部的操作是互不干扰的,每个对象是独立的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象传递与返回的细节问题详析 - Python技术站