package newGet;public class D3 {
public static void changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
} public static void changeDate_2(MyDate mydate) {
mydate.setMonth(12); } public static void main(String[] args) {
MyDate date = new MyDate(1981, 9, 10);
changeDate_1(date);
changeDate_2(date);
System.out.println(date.year + "-" + date.month + "-" + date.day);
}
}class MyDate {
public int year; public int month; public int day; public MyDate(int y, int m, int d) {
year = y;
month = m;
day = d;
} public void setMonth(int m) {
month = m;
} public void setDay(int d) {
day = d;
}
}
输出是什么,重要的解释一下为何不是1979-12-3
如果执行:
String a=new String("1");
a=new String("2");
System.out.println(a);
输出肯定是2
两者有什么不同,都是在new对象呀?!====================class Cal{
private int x,y,z;
}
public class D6_exam {
public static void main(String[] args){
Cal tmp=new Cal();
tmp.x=10;tmp.y=20;
}
}//========
public class D6_exam {
private int i=1;
private int j=2;
public static void main(String[] args){
System.out.println((new D6_exam()).i);
}
}
上面同是两代码访问私有属性的问题。为何下面的可以,上面的会报错。

解决方案 »

  1.   

    我想第一个两个都是1981 9 10:因为java只支持值传递
        第二个你看看书,private,public,..的访问范围
      

  2.   

    String a=new String("1");
    a=new String("2");
    System.out.println(a);当a=new String("2")时,a就从开始指身的new string("1")这个内存单元转到了new String("2")了,原先的内存单元就等着被回收
      

  3.   

    原因是:public static void changeDate_1(MyDate mydate) {
        mydate = new MyDate(1979, 2, 3);
    }这个方法没有返回值,传进去的参数 mydate 只在changeDate_1方法内部有效,执行结束后mydate依旧是指向原来的地址,就说说你的changeDate_1方法是毫无作用的,调用了也相当于没调用。
      

  4.   


    为何changeDate_2发生了作用,它也没有返回值呀
      

  5.   

    String a=new String("1");
    a=new String("2");
    System.out.println(a);
    输出肯定是2
    这个也解释一下吧,因为a原来指向的是new String("1")的地址,但是后来又通过a=new String("2"),这时a指向的就是new String("2")这个对象所在的地址了。所以肯定输出的是2。
    在回想一下你的changeDate_1方法并没有把修改后的地址重新赋值给mydate,上面也说了因为你的changeDate_1方法没有返回值。changeDate_1内部的mydate只在其内部的时候有效,离开该方法后就无效了。如果想达到你要的那个效果的话,应该修改一下代码: public static MyDate changeDate_1(MyDate mydate) {
            mydate = new MyDate(1979, 2, 3);
     }
     public static void main(String[] args) {
            MyDate date = new MyDate(1981, 9, 10);
            date=changeDate_1(date);
            changeDate_2(date);
            System.out.println(date.year + "-" + date.month + "-" + date.day);
    }
      

  6.   

    因为他是在原来的对象修改的,changDate_1是新建了一个对象,但是却没有把新对象的地址赋值回去。所以changeDate_1什么都没有做。而changeDate_2是把原来的那个对象,的一个属性修改了。它的地址是没有变的。
      

  7.   

    上面我写错了一个地方,忘了return了。失误失误!public static MyDate changeDate_1(MyDate mydate) {
            mydate = new MyDate(1979, 2, 3);
            return mydate;
    }
      

  8.   

    。。你这样也还是不变的 对象引用不可以改变,mydate还是指向原来的地址 对象的属性可改 所以第二个方法就能改变月份
      

  9.   

    把mydate弄成全局变量,changeDate方法就有用了
      

  10.   


    public class D3{
    public static MyDate changeDate_1(MyDate mydate) {
    mydate = new MyDate(1979, 2, 3);
    return mydate;
    } public static void changeDate_2(MyDate mydate) {
    mydate.setMonth(12); } public static void main(String[] args) {
    MyDate date = new MyDate(1981, 9, 10);
    date = changeDate_1(date);
    changeDate_2(date);
    System.out.println(date.year + "-" + date.month + "-" + date.day); }
    }class MyDate {
    public int year; public int month; public int day; public MyDate(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
    } public void setMonth(int m) {
    month = m;
    } public void setDay(int d) {
    day = d;
    }
    }楼上的我这样是可以的啊!测试结果如下。
    运行结果:1979-12-3
      

  11.   

    10楼,如果返回了之后它的地址是已经改变了的哦。相当于重新赋值了一个新对象给date。
      

  12.   

    有没有返回值都一样,java就是 传值的,也就是传一个对象的引用的“副本”,
    但是你可以通过这个“副本“区修改对象内部一些信息。
      

  13.   

    建议楼主看看创建对象,和new出对象来的内存。。了解了这个就不难了。。
    第二段代码只要了解了各个修饰符的权限就明白了 。
      

  14.   

    我的代码如下:public class D3 {
    public static MyDate changeDate_1(MyDate mydate) {
    mydate = new MyDate(1979, 2, 3);
    return mydate;
    } public static void changeDate_2(MyDate mydate) {
    mydate.setMonth(12); } public static void main(String[] args) {
    MyDate date = new MyDate(1981, 9, 10);
    date = changeDate_1(date);
    changeDate_2(date);
    System.out.println(date.year + "-" + date.month + "-" + date.day); }
    }class MyDate {
    public int year; public int month; public int day; public MyDate(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
    } public void setMonth(int m) {
    month = m;
    } public void setDay(int d) {
    day = d;
    }
    }运行结果:1979-12-3  ,不信自己copy下来试试。
      

  15.   

    楼主是不是忘了main方法里的这句话
     date = changeDate_1(date);