黑马程序员技术交流社区
标题:
非常有意思的一个问题,大家进来分析一下
[打印本页]
作者:
奥特曼爱小怪兽
时间:
2012-4-26 13:31
标题:
非常有意思的一个问题,大家进来分析一下
本帖最后由 徐晓磊 于 2012-4-26 13:55 编辑
public class Test{
public static void greet(){
System.out.println("hello");
}
public static void main(String[] args){
Test test = null;
test.greet();
((Test)test).greet();
((Test)null).greet();
}
}
<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
Test test=null;
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