黑马程序员技术交流社区
标题:
看下代码
[打印本页]
作者:
che201311
时间:
2013-11-23 22:20
标题:
看下代码
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
作者:
ysunday
时间:
2013-11-23 22:47
难道不是输出 小王 55 小天 18? 你把结果打出来
作者:
樊志伟
时间:
2013-11-24 00:43
这个我搞了一晚上也和楼主一样,跟想象的不一样,同求大神解答啊。。
作者:
樊志伟
时间:
2013-11-24 10:15
我明白了,你的代码中这两句话
arr[0]=stu;
arr[1]=stu;
复制代码
就是就arr[0],arr[1]指向了同一个实体,如同一个人起了两个名字而已,其中一个改变属性,在另一个看来也变了属性。虽然你adminStu.create()两次,产生了两个Student对象,但实际上,每次产生产生一个Student对象,arr[0],arr[1]总是都指向同一个
Student对象。我明白了,你明白了吗?
作者:
樊志伟
时间:
2013-11-24 10:22
本帖最后由 樊志伟 于 2013-11-24 10:44 编辑
给你上个图
无标题.jpg
(32.71 KB, 下载次数: 45)
下载附件
2013-11-24 10:44 上传
作者:
还不到时候
时间:
2013-11-24 10:56
我同意楼上的观点 。我个人认为,这里的代码的内存数据传递跟深克隆的原理很相似
package thread;
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; 我觉得这段代码改成下面的会更加健壮点*/
//arr数组的每个元素都是一个对象
for (int i = 0; i < arr.length; i++) {
arr[i]=stu;
}
}
//函数的重载。arr数组的每个元素都是一个基本数据类型int型
public void create(int[] arr){
for (int i = 0; i < arr.length; i++) {
arr[i]=1;
}
}
}
public class Test1 {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Student[] stuArr=new Student[2];
int[] arr = new int[2];
System.out.println("10:添加一个学生");
int b=in.nextInt();
Admin adminStu=new Admin();
if(b==10){
// adminStu.create("小红",17,stuArr);这句代码创建的对象与下面的代码无关
adminStu.create("小天",18,stuArr);
adminStu.create(arr);
}
arr[0]=0;//这里改变arr[0],并不影响arr[1]
stuArr[0].setName("小王");
stuArr[0].setAge(55);
//strArr[0]和strArr[1]的引用变量相同
System.out.println(stuArr[0]==stuArr[1]);
for(int i=0;i<2;i++){
System.out.println(stuArr[i]);// 结果:小王 55
小王 55
}
for(int i=0;i<2;i++){
System.out.println(arr[i]);//结果:0
1
}
}
}
复制代码
作者:
还不到时候
时间:
2013-11-24 11:01
我上基础班是时候老师讲到了深克隆和浅克隆的知识点,我觉得跟你的代码有可比性,如果楼主感兴趣的话,我可以发给你老师上课讲解的视频和代码!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2