Given:
1. package test;
2.
3. class Target {
4. public String name = "hello";
5. }
What can directly access and change the value of the variable name?
A.any class
B.only the Target class
C.any class in the test package
D.any class that extends TargetAnswer: C
如果name 不是static,在同一个包内也访问不到啊,会提示错误
如果是static,不同的包也可以访问 void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
obj.wait();
obj.notify();
}Which statement is true?
A.This code can throw an InterruptedException.
B.This code can throw an IllegalMonitorStateException.
C.This code can throw a TimeoutException after ten minutes.
D.Reversing the order of obj.wait() and obj.notify() might cause this method to complete normally.
E.A call to notify() or notifyAll() from another thread might cause this method to complete normally.
F.This code does NOT compile unless "obj.wait()" is replaced with "((Thread) obj).wait()".
Answer: B
为什么答案不是A呢?
Given:
10. interface Foo {}
11. class Alpha implements Foo {}
12. class Beta extends Alpha {}
13. class Delta extends Beta {
14. public static void main( String[] args ) {
15. Beta x = new Beta();
16. // insert code here
17. }
18. }
Which code, inserted at line 16, will cause a java.lang.ClassCastException?
A.Alpha a = x;
B.Foo f = (Delta)x;
C.Foo f = (Alpha)x;
D.Beta b = (Beta)(Alpha)x;
Answer: B
这一题转来转去搞晕了,为什么选B

解决方案 »

  1.   

    1. class的权限是默认,因此,就算name是public也只能是包级的访问权限
    2. obj是一个方法内部定义的局部变量,在obj上调用wait之后,就永远不可能notify了,因为其他的线程不可能调用obj.notify()。
    3.
    A.Alpha a = x;  //父类引用引用子类对象
    B.Foo f = (Delta)x;//x是Beta类型,转型为子类可以编译通过,但是运行时会出异常
    C.Foo f = (Alpha)x;//x是Beta类型,可以转化为父类类型Alpha
    D.Beta b = (Beta)(Alpha)x;//x是Beta类型,最后还是Beta类型
      

  2.   

    第三题,派生关系 Foo <-- Alpha <-- Beta <-- Delta
    x是一个Beta对象实例
    在派生过程中,可以安全进行向上强制类型转换,即派生子类可以安全强制转换为父类型。但父类型不能强制转换成派生类型。
    按照上述规则,所以为B。
      

  3.   

    3.首先编译时,都不会报错,但是B运行时会报java.lang.ClassCastException的异常。
      

  4.   

    1.package test;class Target {
    public String name = "hello";
    }其实这主要是由你的Target类来决定的(Default类型),这只能在相同的包中引用。
      

  5.   

    第二题看二楼的解释,第三题看三楼的解释。
    第一题:package test;public class Target {//如果把Taget类的public去掉,下面testPackage类的test()方法就会出错了 public String name="zcc";
    }package anotherpackage;import test.Target;public class testPackage {
    Target t=new Target();
    public void test(){//注意一定要在方法里面
    t.name="a";
    }
    }
      

  6.   

    这里的题目都是scjp的题目,第一道题目,是缺省的,所以所有在包里面的类都可以访问改类的变量。第二题: obj是一个方法内部定义的局部变量,在obj上调用wait之后,就永远不可能notify了,因为其他的线程不可能调用obj.notify()。第三题:是继承的关系,静下心来看就可以了,简单
      

  7.   

    第三题将父类下转成子类不就会classcastexception了吗
      

  8.   

     1、class的权限是default,只有同包的类才能访问到;
     2、synchronized (Thread.currentThread()) 改成synchronized (obj)就可以啦;
     3、父类转成子类是可以编译通过,但运行会抛异常。 
      

  9.   

    谢谢大家,
    第二题我是问为什么不抛出InterruptedException的异常,我编译的时候就显示是InterruptedException异常