三个小问题

arthur.dy.lee 2010-03-29 01:27:43

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);
}
}


上面同是两代码访问私有属性的问题。为何下面的可以,上面的会报错。
...全文
214 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
doudou 2010-03-29
  • 打赏
  • 举报
回复
楼主是不是忘了main方法里的这句话
date = changeDate_1(date);
doudou 2010-03-29
  • 打赏
  • 举报
回复
实践是检验真理的唯一标准
doudou 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 paincupid 的回复:]
引用 14 楼 doudou15223155621 的回复:

引用 10 楼 hjh811 的回复:
引用 9 楼 doudou15223155621 的回复:
上面我写错了一个地方,忘了return了。失误失误!

Java code

public static MyDate changeDate_1(MyDate mydate) {
mydate = new MyDate……
[/Quote]
我的代码如下:

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下来试试。
liu_liyang 2010-03-29
  • 打赏
  • 举报
回复
建议楼主看看创建对象,和new出对象来的内存。。了解了这个就不难了。。
第二段代码只要了解了各个修饰符的权限就明白了 。
arthur.dy.lee 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 applerockhool 的回复:]

有没有返回值都一样,java就是 传值的,也就是传一个对象的引用的“副本”,
但是你可以通过这个“副本“区修改对象内部一些信息。
[/Quote]
怎么样才能让它改变呢?
applerockhool 2010-03-29
  • 打赏
  • 举报
回复
有没有返回值都一样,java就是 传值的,也就是传一个对象的引用的“副本”,
但是你可以通过这个“副本“区修改对象内部一些信息。
arthur.dy.lee 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 doudou15223155621 的回复:]

引用 10 楼 hjh811 的回复:
引用 9 楼 doudou15223155621 的回复:
上面我写错了一个地方,忘了return了。失误失误!

Java code

public static MyDate changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
return mydate;
}
……
[/Quote]
你的是错误的 即使有返回值,也仍然是:1981-12-10
不信你可以自己运行一下。
doudou 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hjh811 的回复:]
引用 9 楼 doudou15223155621 的回复:
上面我写错了一个地方,忘了return了。失误失误!

Java code

public static MyDate changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
return mydate;
}
。。你这样也还是不变的 对象引用不可以改变……
[/Quote]
10楼,如果返回了之后它的地址是已经改变了的哦。相当于重新赋值了一个新对象给date。
kyousuke 2010-03-29
  • 打赏
  • 举报
回复
没分发帖了 OTZ
doudou 2010-03-29
  • 打赏
  • 举报
回复

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
dobe1987 2010-03-29
  • 打赏
  • 举报
回复
把mydate弄成全局变量,changeDate方法就有用了
hjh811 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 doudou15223155621 的回复:]
上面我写错了一个地方,忘了return了。失误失误!

Java code

public static MyDate changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
return mydate;
}
[/Quote]。。你这样也还是不变的 对象引用不可以改变,mydate还是指向原来的地址 对象的属性可改 所以第二个方法就能改变月份
doudou 2010-03-29
  • 打赏
  • 举报
回复
上面我写错了一个地方,忘了return了。失误失误!

public static MyDate changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
return mydate;
}
doudou 2010-03-29
  • 打赏
  • 举报
回复
因为他是在原来的对象修改的,changDate_1是新建了一个对象,但是却没有把新对象的地址赋值回去。所以changeDate_1什么都没有做。而changeDate_2是把原来的那个对象,的一个属性修改了。它的地址是没有变的。
doudou 2010-03-29
  • 打赏
  • 举报
回复
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);
}
arthur.dy.lee 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 doudou15223155621 的回复:]

原因是:
Java code

public static void changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
}


这个方法没有返回值,传进去的参数 mydate 只在changeDate_1方法内部有效,执行结束后mydate依旧是指向原来的地址,就说说你的changeDate_1方法是毫无作……
[/Quote]

为何changeDate_2发生了作用,它也没有返回值呀
doudou 2010-03-29
  • 打赏
  • 举报
回复
所以说结果很自然应该是1981-12-10.
doudou 2010-03-29
  • 打赏
  • 举报
回复
原因是:

public static void changeDate_1(MyDate mydate) {
mydate = new MyDate(1979, 2, 3);
}

这个方法没有返回值,传进去的参数 mydate 只在changeDate_1方法内部有效,执行结束后mydate依旧是指向原来的地址,就说说你的changeDate_1方法是毫无作用的,调用了也相当于没调用。
wslzxql 2010-03-29
  • 打赏
  • 举报
回复
String a=new String("1");
a=new String("2");
System.out.println(a);

当a=new String("2")时,a就从开始指身的new string("1")这个内存单元转到了new String("2")了,原先的内存单元就等着被回收
wslzxql 2010-03-29
  • 打赏
  • 举报
回复
我想第一个两个都是1981 9 10:因为java只支持值传递
第二个你看看书,private,public,..的访问范围
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧