直接传NULL到构造函数

先看下面这段代码:

public class NullConfusing {
String message = "";

public NullConfusing(Object o) {
message = "OBJECT";
}

public NullConfusing(String str) {
message = "STRING";
}
@Override
public String toString() {
return "NullConfusing [message=" + message + "]";
}

public static void main(String[] args) {
System.out.println(new NullConfusing(null));
}
}

[b]
结果是:NullConfusing [message=STRING][/b]

null 关键字类型判断
	
public static void main(String[] args) {
if (null instanceof String ) {
System.out.println("null is instanceof String ");
}
}


[b]结果是:无输出[/b]

多加一个构造方法:

public class NullConfusing {
String message = "";

public NullConfusing(Object o) {
message = "OBJECT";
}

public NullConfusing(String str) {
message = "STRING";
}

public NullConfusing(Character str) {
message = "STRING";
}

@Override
public String toString() {
return "NullConfusing [message=" + message + "]";
}

public static void main(String[] args) {
System.out.println(new NullConfusing(null));
}
}


[b]结果是:编译器提示异常 The constructor NullConfusing(Object) is ambiguous[/b]


[size=medium]为什么会这样呢?

java 编程思想每四版 P157 -- 构造器与多态
“它们实际上是static方法,只不过该方法的声明是隐式的”。而我们知道方法调用都是先检查子类再检查父类。如果子类有就现有子类的方法。这点很好理解,跟CSS选择器一样,谁更具体选择谁。所以,当只有NullConfusing(Object o)、NullConfusing(String str)两个构造函数时,null多适合调用,但是String继承自Object更具体些,所以选择String。当再出现一个构造函数NullConfusing(Character str),编译器就困惑了,选String好呢,还是选Character,多是同一个妈生的,选谁多不合适呀,所以摆工了。

null是java中的一个关键字,并不代表任何数据类似,所以它并不是String类型,只可以将其理解为一块分配的内存空间,至于这块内存空间将来会是存什么类型的值现在就不知道了。
[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值