靠,java白学了,这两段代码只看见ref指来又指去,太玄妙了,倒是请大师们出来说说清楚。
解决方案 »
- 如何判断List<String> list中是否包含某个字符串呢?
- 帮忙分析一个java程序
- 实现两个窗口相互切换,AWT
- 高手来啊,为什么用java读取的证书DN信息乱码?C++,C#都没有问题,第一贴没人回复。。。。,有能力的来。。。。
- 求助!!聊天室的问题,,在线等..急急急!!!
- 看个小问题,不能出现界面
- JDK安装一直错误,~~~~~~~~~~~~
- 在WINDOWS中有什么方法访问和修改应用程序的内存 如游戏
- 急!!!帮忙写个有关I/O的小程序。
- java.util.Hashtable有没有排序功能?用element逐个取hashtable的key怎么是乱序的?
- 天!!!在 java 代码中竟然出现 goto
- socket类中isClosed()和isConneted()方法的问题
this.value = v;
这里的对象有几个?答案是:只有一个。这两句赋值语句过后,v、result、value(请注意,这三个都是reference)都指向同一个对象,它们三者是完全等价的。这么玩一趟,平白增加一个local variable有什么用?我看不出来。另外,setXxx方法的返回值是毫无意义的——唯一的意义就是使这个方法不符合Java Bean规范。一个糟糕的设计。不过这是题外话了。
法一返回v 的值
法二返回return this.value的值,有可能因为线程问题不是v的值
第一种生成两个对象,一个由this.value保存,而返回一个和this.value相同但分离的对象,这样对返回的对象进行任何操作可以不会破坏this.value的值,而第二个方法就不行了.看 java高效编程,最好用clone方法,返回一个副本
Object result = v;
this.value = v;
这两条语句执行以后,v、result、this.value三者的object identity是否相等?
看看有多少人答错的。
private Object value;
public Object setValue(Object v)
{
Object o = v;
Object b = o;
Object j = b;
Object e = j;
Object c = e;
Object t = c;
Object e = t;
this.value = v;
return e;
}怎么样,高明多了吧?
不太明白有什么区别
有可能就是象 jinbuquan(金不全) 说的线程同步问题
这段代码怎么高明.在下不才.搞不明白,胡涂啦!
给个解释一下.ok?^_^
他逗你玩呢。这个家伙就爱乱开玩笑。不过这玩笑开得也有点道理:如果加上一个不必要的变量就让这个方法变得“高明”的话,加上一大堆不必要的变量不就是“极其高明”了?
以上拙论,见笑!
CSDN的后辈们虽然技术不见长,搞笑的功夫倒是青出于蓝,后生可畏呀。
public Object setValue(Object v)
{
Object o = v;
Object b = o;
Object j = b;
Object e = j;
Object c = e;
Object t = c;
Object e = t;
this.value = v;
return e;
}
eyeieye(魔之眼)朋友的这段代码最高明了,整个方法的N多个reference同时指向同一个对象,不多占一丝空间,同时多产生N-1行代码,老板对你的工作量也会另眼相看,还有一个好处就是去面试的时候考官问你写了多少行代码,你可以理直气壮地多说N-1行,成功机率将会大增,一举多得。 高、高、实在高!同时也建议楼上N多的朋友真正去理解一下面向对象的基本理论。
this.value = v;
这里的对象有几个?答案是:只有一个。这两句赋值语句过后,v、result、value(请注意,这三个都是reference)都指向同一个对象(内存),它们三者是完全等价的。这么玩一趟,平白增加一个local variable有什么用?我看不出来。另外,setXxx方法的返回值是毫无意义的——唯一的意义就是使这个方法不符合Java Bean规范。一个糟糕的设计。不过这是题外话了。
你也满会开玩笑的!不过倒是很新颖啊!
要你这么说,他那段所谓高明的程序果然"高明"
而且是极其"高明"
哈哈哈!
Method java.lang.Object setValue(java.lang.Object)
0 aload_1
1 astore_2
2 aload_0
3 aload_1
4 putfield #19 <Field java.lang.Object value>
7 aload_2
8 areturn方法二:
Method java.lang.Object setValue(java.lang.Object)
0 aload_0
1 aload_1
2 putfield #19 <Field java.lang.Object value>
5 aload_0
6 getfield #19 <Field java.lang.Object value>
9 areturn方法一和方法二中不同的指令:
方法一:
0 aload_1
1 astore_2
7 aload_2
方法二:
5 aload_0
6 getfield #19 <Field java.lang.Object value>我的结论:
1.方法一编译出来的代码短。2.方法一的速度快。方法一中两条aload加一条astore指令比方法二中一条aload指令加调用函数getfield快。
如果把方法二改成 return v; 呢?
再说了,这样生成vm指令的方式是spec允许的多种方式之一呢,还是必须的做法?既然this.value和v指向同一个对象,getfield完全可能被编译器优化掉。
我认为是线程的问题理由?
具体解释我说不来那么多了,说实话我也说不透。
这种概念也是照搬书上的。请翻阅Concurrent Programming in Java™: Design Principles and Patterns, Second Edition
2.4节中的一个例子:
class SynchronizedInt {
private int value; public SynchronizedInt(int v) { value = v; } public synchronized int get() { return value; } public synchronized int set(int v) { // returns previous value
int oldValue = value;
value = v;
return oldValue;
} public synchronized int increment() { return ++value; } // and so on}
呵呵,既然自己都看出问题了,我就不说什么了。
this.value = v;
return v;