黑马程序员技术交流社区

标题: 非常有意思的一个问题,大家进来分析一下 [打印本页]

作者: 奥特曼爱小怪兽    时间: 2012-4-26 13:31
标题: 非常有意思的一个问题,大家进来分析一下
本帖最后由 徐晓磊 于 2012-4-26 13:55 编辑
  1. public class Test{
  2. public static void greet(){
  3.   System.out.println("hello");
  4. }
  5. public static void main(String[] args){
  6.   Test test = null;
  7.   test.greet();
  8.   ((Test)test).greet();
  9.   ((Test)null).greet();
  10. }
  11. }
  12. <p> </p>
复制代码
输出结果是三个hello
大家分析一下第三条输出的原理

null这个关键字是空呢还是也是一个对象呢,它在对对象引用赋值,到底表示的什么意思,运行机制到底是怎么样的。


作者: 徐鑫    时间: 2012-4-26 13:40

  ((Test)null).greet();//null具有自适应性,这里null被强制转换为Test类型,这样它就可以调用Test类的静态方法了
作者: 张小庆    时间: 2012-4-26 13:47
我觉得null被强行抓换成了Test类型的,当然就直接调用它的方法了,然后就输出了呗
作者: 马浩    时间: 2012-4-26 15:33
public class Test{

public static void greet(){

  System.out.println("hello");

}

public static void main(String[] args){

  Test test = null;//表示在Test中生成一个不确定的对象null

  test.greet();//对象调用了Test类中的greet()方法

  ((Test)test).greet();//这个与test.greet()一样,这个代码执行必须要创建test这个对象,也就是要有Test test = null这条代码

  ((Test)null).greet();//这调代码中null就相当于是在Test类中的一个对象,直接调用了greet()方法,不需要在主函数中创建对象

}

}


作者: 罗旭维    时间: 2012-4-26 15:54
((Test)null).greet();这句相当于Test.greet()。
静态成员不依赖对象,null是指定对象为空,对于不依赖对象的操作没影响。
作者: 高彰谦    时间: 2012-4-26 17:05
  1. Test test=null;
  2.                   System.out.println(test==(Test)null);
复制代码
这一句输出为真,即(Test)null相当于一个未初始化的Test对象,这个对象虽然没有实例化,但是可以调用类的静态方法
作者: 马东华    时间: 2012-4-26 17:23
是不是,因为greet是静态的,可以直接调用啊,跟前面的没关系
作者: 林德燚    时间: 2012-4-26 18:14
这可能是虚拟机做了优化,因为调用的是静态方法,把((test)null).greet()当做test.greet编译运行了;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2