|
null对象与static成员变量
1. class MyClass { 2. static String myName = "SCJP"; 3. 4. MyClass getMyClass() { 5. System.out.println(myName); 6. return null; 7. } 8. 9. public static void main(String[] args) {10. System.out.println(new MyClass().getMyClass().myName);11. }12. }大家认为这个程序应该输出什么东西呢?看过程序后给我的第一个印象是, 第6行和第10行有些蹊跷.可
能有的朋友会说用null对象来调用类中的成员这肯定是要抛出异常的呀!!! 但事实上并不是这样, 这个程序没有任何的错误,
而且会正确地输出两个字符串"SCJP". 首先, 变量myName是一个static的成员变量, 也就是说这个变量是类属变量,
它与对象没有任何关系. 用一个对象来调用static成员时用的是对象的类型来调用的, 跟对象本身并没有什么关系,
所以一个引用即使它的值为null, 但只要它属于那个类型, 那么它就可以正确访问类中的static成员.线程是否立刻运行?
你觉得下面的程序输出的是10个"No"吗?public class MyThread implements Runnable { String myString = "Yes "; public void run() { this.myString = "No "; } public static void main(String[] args) { MyThread t = new MyThread(); new Thread(t).start(); for (int i=0; i < 10; i++) System.out.print(t.myString); } } 首先可以肯定地讲, 结果是不可预知的, 也就是说并不能肯定输出的是多少个"No"或者是否还包括有"Yes".
当在程序的这一行"new Thread(t).start()"执行完后, 如果此时的线程立刻被执行了并且没有任何耽搁,
那么结果肯定是10个"No", 但start方法并不是调用什么线程的run方法来强制执行线程, 而是start方法只简单地发出一个通知,
告知操作系统和其它的正在执行中的线程, 说"我这个线程此时属于可执行状态", 并且在线程队列里轮到此线程执行时, 这时此线程才得以执行.
所以说在这些繁琐的步骤里另一方面主程序线程可能早已经到了for循环处, 但此时可能执行的start方法的那个线程还没有得到执行,
这样输出就可能是几个"Yes"再加几个"No", 其二者的个数也是无法得知的(但有一点可以肯定,
"Yes"和"No"加起来的总数肯定是10个), 因为谁也不能预知被通知的线程会在什么被执行起来. |
|
| |