A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 徐晓磊 于 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这个关键字是空呢还是也是一个对象呢,它在对对象引用赋值,到底表示的什么意思,运行机制到底是怎么样的。

7 个回复

正序浏览
这可能是虚拟机做了优化,因为调用的是静态方法,把((test)null).greet()当做test.greet编译运行了;
回复 使用道具 举报
是不是,因为greet是静态的,可以直接调用啊,跟前面的没关系
回复 使用道具 举报
  1. Test test=null;
  2.                   System.out.println(test==(Test)null);
复制代码
这一句输出为真,即(Test)null相当于一个未初始化的Test对象,这个对象虽然没有实例化,但是可以调用类的静态方法
回复 使用道具 举报
((Test)null).greet();这句相当于Test.greet()。
静态成员不依赖对象,null是指定对象为空,对于不依赖对象的操作没影响。
回复 使用道具 举报
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()方法,不需要在主函数中创建对象

}

}

回复 使用道具 举报
我觉得null被强行抓换成了Test类型的,当然就直接调用它的方法了,然后就输出了呗
回复 使用道具 举报

  ((Test)null).greet();//null具有自适应性,这里null被强制转换为Test类型,这样它就可以调用Test类的静态方法了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马