日期:2014-05-20  浏览次数:20942 次

同步方法中的Object.class - SCJP考题求助
原题如下:
Which three will compile and run without exception? (Choose three.)
A. private synchronized Object o;
B. void go() {
synchronized() { /* code here */ }
C. public synchronized void go() { /* code here */ }
D. private synchronized(this) void go() { /* code here */ }
E. void go() {
synchronized(Object.class) { /* code here */ }
F. void go() {
Object o = new Object();
synchronized(o) { /* code here */ }


E当中的synchronized(Object.class)还是头一次看到。这是什么语法呢?



------解决方案--------------------
synchronized(Object.class)括号里面是一个对象,synchronized语句获得该对象的锁。
Object.class也是个对象,是Object类的类对象。
------解决方案--------------------
探讨

同问同问,在Object中并没有找到该属性呢。

------解决方案--------------------
A中不允许使用synchronized修饰符来修饰属性。
B中是非法的表达式。
C是正确的。
D中括号里不可以存在this关键字,里面可以是类,接口,和枚举。
E是正确的。
F也是正确的。
而对于E中Object.class其实就是一个类。
------解决方案--------------------
探讨

虽然都能点出来,但是我确实在API文档中没有找到呢

------解决方案--------------------
探讨

虽然都能点出来,但是我确实在API文档中没有找到呢

------解决方案--------------------
探讨

引用:

synchronized只能跟具体的对象吧
我也觉得应该跟具体对象。在api还有Object源代码中都找不到这个语法。是不是这样:即便选项E的代码可以编译,在实际运用时可能还要根据具体的情况将Object.class替换成相应的实例对象,就像<? extends Object>一样。请高手继续。

------解决方案--------------------
没太注意 看楼上各位 牛人的回答 如有重复 算我抄袭好了

Object.class 就和 Class 类中的 forName一样 (返回一个 Class 对象) (Object.class --> 想象成相对路径 想象字节码是什么结尾的 .class) Class也是一个具体的对象! Class 也是继承自 Object的! (java中一切皆对象 void 都是对象 当然int云云的 基本类型 我就不清楚了)```

再来看synchronized(Object obj){} synchronized 获得Class对象的锁 很理所当然么 是吧!

Class可以 利用反射类 调用任何方法 (包括私有方法哦!!) 
有不懂的 可以继续提问滴 我很热心 呐 \(^o^)/~