import java.util.*;
class Student {
private String name;
private int age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
String msg="\t"+this.name+"\t"+this.age;
return msg;
}
}class Admin {
public void create(String name ,int age,Student[] arr){
Student stu=new Student();
stu.setName(name);
stu.setAge(age);
arr[0]=stu;
arr[1]=stu;
}
}
public class test {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Student[] stuArr=new Student[2];
System.out.println("10:添加一个学生");
int b=in.nextInt();
Admin adminStu=new Admin();
if(b==10){
adminStu.create("小红",17,stuArr);
adminStu.create("小天",18,stuArr);
}
stuArr[0].setName("小王");
stuArr[0].setAge(55);
for(int i=0;i<2;i++){System.out.println(stuArr[i]);}}
}
哪个兄弟看一哈
为什么
stuArr[1]输出的不是
小天 18
class Student {
private String name;
private int age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
String msg="\t"+this.name+"\t"+this.age;
return msg;
}
}class Admin {
public void create(String name ,int age,Student[] arr){
Student stu=new Student();
stu.setName(name);
stu.setAge(age);
arr[0]=stu;
arr[1]=stu;
}
}
public class test {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Student[] stuArr=new Student[2];
System.out.println("10:添加一个学生");
int b=in.nextInt();
Admin adminStu=new Admin();
if(b==10){
adminStu.create("小红",17,stuArr);
adminStu.create("小天",18,stuArr);
}
stuArr[0].setName("小王");
stuArr[0].setAge(55);
for(int i=0;i<2;i++){System.out.println(stuArr[i]);}}
}
哪个兄弟看一哈
为什么
stuArr[1]输出的不是
小天 18
public void create(String name ,int age,Student[] arr){
Student stu=new Student();
stu.setName(name);
stu.setAge(age);
arr[0]=stu;
arr[1]=stu;
}
}
这个函数写的有问题,
你把数组里的两个位置都用一个值填充了,所以出现不了就是arr[0]=stu;
arr[1]=stu;这两句,运行adminStu.create("小红",17,stuArr);这句的时候,arr[0],arr[1]的值都变成了"小红",17.当运行adminStu.create("小天",18,stuArr); 时候,arr[0],arr[1]的值都变成了"小天",18.然后运行
stuArr[0].setName("小王");
stuArr[0].setAge(55);
就出现了你现在的运行结果了.
if (b == 10) {
adminStu.create("小红", 17, stuArr);
adminStu.create("小天", 18, stuArr);
}后,stuArr[0]和 stuArr[1]都是 “ 小天,18”,
stuArr[0]和stuArr[1]指向的是同一个对象(同一个地址空间),所以当执行
stuArr[0].setName("小王");
stuArr[0].setAge(55);后
stuArr[0]和stuArr[1]都会发生改变,(因为是同一个对象)
亲测了下
问题在于:Student[] stuArr=new Student[2]; 你创建的是stuArr引用 而未分配内存,当你输入10时,即b=18时,进行if语句
if(b==10){
adminStu.create("小红",17,stuArr);
adminStu.create("小天",18,stuArr);
}
因为Creat函数含有参数stuArr,传入的是引用(类传的是引用)
然后你的
Student stu=new Student();
stu.setName(name);
stu.setAge(age);
arr[0]=stu;
arr[1]=stu;
使得arr[0]和arr[1]引用指向了同一块内存
这使得你在改变arr[0]时,改变的是arr[0]和arr[1]引用共同指向的内存,当然arr[0]指的内存变了,arr[1]也跟着变,而且值相等。 你的这个改变在这个语句:
stuArr[0].setName("小王");
stuArr[0].setAge(55);如果不懂 请参考 函数的参数值传递与引用传递的区别