`
dandy
  • 浏览: 67972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Null与Void

    博客分类:
  • java
阅读更多
出自《java puzzle》

下面仍然是经典的Hello World程序的另一个变种。那么,这个变种将打印什么呢?
public class Null {
  public static void greet() {
   System.out.println("Hello world!");
  }
  public static void main(String[] args) {
   ((Null) null).greet();
  }
}

这个程序看起来似乎应该抛出NullPointerExceptioin异常,因为其main方法是在常量null上调用greet方法,而你是不可以在null上调用方法的,对吗?嗯,某些时候是可以的。如果你运次该程序,就会发现它打印出了“Hello World!”

理解本谜题的关键是Null.greet是一个静态方法。在静态方法的调用中,使用表达式作为其限定符并非是一个好主意,而这也正是问题之所在。不仅表达式的值所引用的对象的运行期类型在确定哪一个方法将被调用时并不起任何作用,而且如果对象有标识的话,其标识也不起任何作用。在本例中,没有任何对象,但是这并不会造成任何区别。静态方法调用的限定表达式是可以计算的,但是它的值将被忽略。没有任何要求其值为非空的限制。

要想消除该程序中的混乱,你可以用它的类作为限定符来调用greet方法:

public static void main(String[] args) {
Null.greet();
}

然而更好的方式是完全消除限定符:

public static void main(String[] args) {
greet();
}

总之,本谜题的教训与谜题48的完全相同:要么用某种类型来限定静态方法调用,要么就压根不要限定它们。对语言设计者来说,应该不允许用表达式来污染静态方法调用的可能性存在,因为它们只会产生混乱。


2
1
分享到:
评论

相关推荐

    法律英语翻译词汇:无效的“void”和“nullandvoid”.pdf

    在法律英语中,“void”和“null and void”是两个重要的词汇,它们都用来描述某种法律行为、合同或决定在法律上不具备效力的状态。本文主要探讨这两个术语的区别和使用。 首先,"void"是一个常见的法律术语,意为...

    C#难点逐个击破(8):可空类型System.Nullable

    null与void null值用来表示数据类型未被赋予任何值,它是一种引用类型;void表示没有类型,或者说是没有任何值。null与void的区别可以认为void是根本没有,而null是一个空箱子,里面什么都没有。 null值只能赋值给...

    void_指针 使用

    4. **兼容性**:`void`指针与其他类型指针之间的赋值转换遵循一定的规则。例如,从`void`指针到其他类型指针的转换是允许的,但反向转换(即从特定类型指针到`void`指针)需要显式转换。 5. **应用场合**:`void`...

    Java中String判断值为null或空及地址是否相等的问题

    本文主要讨论了如何正确判断Java中的String对象是否为null、空值("")以及它们的地址是否相等。在处理字符串时,了解这些概念对于避免程序出错至关重要。 首先,我们需要区分`null`和空字符串`""`。`null`表示变量...

    C语言中的"NULL"到底是什么?有什么用?

    1. **定义**:“NULL”在C语言中通常定义为 `(void *)0` 或者 `0`。在《标准C库》中,`<stdlib.h>` 头文件定义了 “NULL”,这使得“NULL”可以在不同的平台上保持一致性。 2. **作用**: - **标识空指针**:当一...

    c和c++中NULL和0的区别

    "C和C++中NULL和0的区别" ...这可以通过与空指针常量或者其他的空指针的比较来实现。例如,假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用多种形式的比较。

    空指针和0、NULL之间的关系

    这可以通过与空指针常量或其他空指针的比较来实现。例如,假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用多种形式的比较,例如 if ( p == 0 )、if ( p == NULL )、if ( p == ...

    java.lang.Void 与 void的比较及使用方法介绍

    例如,`Map, Void>` 可以模拟一个仅允许插入键而不存储值的集合,这与 `Set<T>` 类似。这样的映射将不允许插入值,因为 `Void` 不可实例化,所以试图添加值会导致编译错误。这在某些场景下可能很有用,例如定义接口...

    IOS 去null

    + (void)load { // 使用method_exchangeImplementations交换方法 Method originalMethod = class_getInstanceMethod(self, @selector(objectForKey:)); Method swizzledMethod = class_getInstanceMethod(self, @...

    c和c++中NULL和0的区别.docx

    ### C和C++中NULL与0的区别 #### 一、空指针常量(Null Pointer Constant) 在C和C++语言中,空指针常量是一个具有特定含义的整型常量表达式,其值为0,或者经过类型转换成为`void *`类型的表达式。根据标准文档...

    深入理解void类型

    2. 空指针常量与NULL 在C语言中,空指针常量通常用NULL表示,它是一个预定义的宏,等同于0或者(void*)0。NULL的目的是在指针上下文中提供一个明确的空指针表示,使得在赋值、初始化或比较时,编译器能够自动将其转换...

    C语言中void.pdf

    7. C++与C语言的差异:文档中也提到了C++和C语言中void的使用差异,其中函数声明“C++int function(void){ return 1; }”表示一个在C++中合法的无参数函数声明,它在C语言中也是有效的。这一点表明,C++在许多方面与...

    还在用if(obj!=null)做非空判断,带你快速上手Optional

    Java Optional 详解与应用 Optional 是 Java 8 中引入的新特性,旨在解决空指针异常(Null Pointer Exception,NPE)这个长期困扰开发者的问题。下面我们将对 Optional 的基本概念、使用方法、优点等进行详细的...

    javascript:void(0);

    public void addMr(String mtime,String mzno,String mpeople,String mname,String mquantity,double mmoney,String mno){ try { String sql = "insert into Material(mtime,mzno,mpeople,mname,mquantity...

    c和c++中NULL和0的区别.pdf

    需要注意的是,尽管NULL通常与(void*)0等价,但它们在某些系统中的实现可能会有所不同。 4. **空指针的内部实现**:C和C++标准并未规定空指针必须指向内存的哪个特定位置。空指针的具体值(如0x0地址或其他特定地址...

    C语言程序设计(第2版)-2期 拓展知识7-6 指针值NULL.pdf

    在C语言中,NULL通常被定义为0或者((void*)0),这取决于编译环境。在stdio.h头文件中,NULL的定义如下: ```c /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define ...

    Java中对null进行强制类型转换的方法

    Java中对null进行强制类型转换的方法 在 Java 中,对 null 进行强制类型转换是一个常见的操作,但是在实际开发中,是否会抛出异常呢?今天,我们将通过实例代码来介绍 Java 中对 null 进行强制类型转换的方法。 ...

    未将对象引用设置到对象的实例 (System.NullReferenceException)

    //a是Null对象 protected void Page_Load(object sender, EventArgs e) { a.ToString();//调用一个Null对象的方法 } 当然啦!结果就如下图了: 这么赤裸裸的写出这种代码,不太容易,通常更倾向于下面一种: 2:...

    java.lang.Void类的解析与使用详解

    `Void`类与`void`关键字的主要区别在于,`void`是Java的关键字,表示方法不返回任何值,而`Void`是Java中的一个类型,可以用于表示对`void`类型的一种引用。例如,你可以声明一个`Void`类型的变量并赋值为`null`,但...

Global site tag (gtag.js) - Google Analytics