A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© che201311 中级黑马   /  2013-11-23 22:20  /  1514 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
FFF + 1 + 3 还需要再努力努力 !加油加油!!!.

查看全部评分

6 个回复

倒序浏览
难道不是输出 小王 55   小天 18?  你把结果打出来  
回复 使用道具 举报
这个我搞了一晚上也和楼主一样,跟想象的不一样,同求大神解答啊。。
回复 使用道具 举报
我明白了,你的代码中这两句话
  1. arr[0]=stu;
  2. arr[1]=stu;
复制代码
就是就arr[0],arr[1]指向了同一个实体,如同一个人起了两个名字而已,其中一个改变属性,在另一个看来也变了属性。虽然你adminStu.create()两次,产生了两个Student对象,但实际上,每次产生产生一个Student对象,arr[0],arr[1]总是都指向同一个
Student对象。我明白了,你明白了吗?

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
FFF + 1 + 3 骚年,很给力。很赞呐!

查看全部评分

回复 使用道具 举报
本帖最后由 樊志伟 于 2013-11-24 10:44 编辑

给你上个图

无标题.jpg (32.71 KB, 下载次数: 51)

无标题.jpg
回复 使用道具 举报
我同意楼上的观点 。我个人认为,这里的代码的内存数据传递跟深克隆的原理很相似
  1. package thread;
  2. import java.util.*;

  3. class Student {
  4.          private String name;
  5.          private int age;
  6.          
  7.          public String getName() {
  8.                  return this.name;
  9.          }
  10.          public void setName(String name) {
  11.                  this.name = name;
  12.          }
  13.          public int getAge() {
  14.                  return this.age;
  15.          }
  16.          public void setAge(int age) {
  17.                  this.age = age;
  18.          }

  19.          public String toString(){
  20.                 String msg="\t"+this.name+"\t"+this.age;
  21.                 return msg;
  22.          }
  23. }

  24. class Admin {        
  25.          public void create(String name ,int age,Student[] arr){
  26.                 Student stu=new Student();
  27.                 stu.setName(name);
  28.                 stu.setAge(age);
  29.                 /*arr[0]=stu;
  30.                 arr[1]=stu; 我觉得这段代码改成下面的会更加健壮点*/
  31.                 //arr数组的每个元素都是一个对象
  32.                 for (int i = 0; i < arr.length; i++) {
  33.                         arr[i]=stu;
  34.                 }
  35.          }
  36.                 //函数的重载。arr数组的每个元素都是一个基本数据类型int型
  37.                 public void create(int[] arr){
  38.                         for (int i = 0; i < arr.length; i++) {
  39.                                 arr[i]=1;
  40.                         }
  41.                 }
  42.                        
  43. }

  44.          
  45.        
  46. public class Test1 {
  47.          public static void main(String[] args){
  48.                  Scanner in=new Scanner(System.in);
  49.                  Student[] stuArr=new Student[2];
  50.                  int[] arr = new int[2];
  51.                  System.out.println("10:添加一个学生");
  52.                  int b=in.nextInt();
  53.                  Admin adminStu=new Admin();
  54.          if(b==10){        
  55.                 // adminStu.create("小红",17,stuArr);这句代码创建的对象与下面的代码无关
  56.                  adminStu.create("小天",18,stuArr);
  57.                  adminStu.create(arr);      
  58.          }
  59.                  arr[0]=0;//这里改变arr[0],并不影响arr[1]
  60.                  stuArr[0].setName("小王");
  61.                  stuArr[0].setAge(55);
  62.                 //strArr[0]和strArr[1]的引用变量相同
  63.                  System.out.println(stuArr[0]==stuArr[1]);
  64.                 

  65.          for(int i=0;i<2;i++){
  66.                  System.out.println(stuArr[i]);// 结果:小王 55
  67.                                                         小王 55

  68.          }
  69.          for(int i=0;i<2;i++){
  70.                  System.out.println(arr[i]);//结果:0
  71.                                                     1
  72.                  
  73.          }

  74.          
  75. }
  76.        


  77. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
FFF + 2 很给力。活动技术分额外+1

查看全部评分

回复 使用道具 举报
我上基础班是时候老师讲到了深克隆和浅克隆的知识点,我觉得跟你的代码有可比性,如果楼主感兴趣的话,我可以发给你老师上课讲解的视频和代码!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马