`
AmwuYYGY
  • 浏览: 26789 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

直接传NULL到构造函数

    博客分类:
  • JAVA
 
阅读更多
先看下面这段代码:
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));
	}
}


结果是:NullConfusing [message=STRING]


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


结果是:无输出

多加一个构造方法:
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));
	}
}


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


为什么会这样呢?

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

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

相关推荐

    C#中字段、属性、只读、构造函数赋值、反射赋值的问题

    3、字段和自动属性声明时的直接赋值和构造函数赋值有什么区别? 4、为什么只读字段和只读自动属性(只有get没有set访问器)都可以在构造函数中进行赋值? 5、反射可以给只读字段或者只读属性进行赋值吗? 6、自动...

    revelator:将 errbacks 转换为揭示构造函数模式回调

    启示者承诺的替代方案将错误优先回调转换为原生 ES6 Promise构造函数所使用的回调。用法 function asyncOp ( val , cb ) { setTimeout ( cb , 500 , null , { val : val } )}function doAsync ( val ) { return new ...

    进程间通信_读者-写者问题.doc

    信号量对象的构造函数: CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL ); 单锁的构造函数: explicit CSingleLock( ...

    新手学习C++入门资料

    声明函数时可以包含一个或多个用不到的形式参数。这种情况多出现在用一个通用的函数指针调用多个函数的场合,其中有些函数不需要函数指针声明中的所有参数。看下面的例子: int fun(int x,int y) { return x*2;...

    MFC的程序框架剖析

    在构造子类对象时,会自动调用父类的构造函数,此时在父类的构造函数中的this指针所指向的是子类对象地址 10、AfxWinMain函数 MFC程序的WinMain函数是通过调用AfxWinMain函数来完成它的功能的 注:Afx前缀的函数代表...

    jsmap数据结构.pdf

    map的键值对个数通过 size属性获取,对象只能⾃⼰统计 new Map(params)构造函数params可以接收⼆维数组"null"undefined;注意传⼊null"undefined其实也就相当于不传参数,直接new Map() 1.初始化 初始化map对象的三种...

    javascript中函数和方法的区别

    复杂数据类型:对象(object)、构造函数(function)、数组(array)等 复杂数据类型又叫引用数据类型 函数是一个复杂数据类型,分别存储在栈里面的地址和存储在堆里面的数据 函数的概念 对于 js 来说,函数就是把任意一...

    c# program

    60. 除非在构造函数中调用其他构造函数否则不要使用this指针。 // 正确使用this的例子 public class MyClass { public MyClass(string message ) {} public MyClass() : this("hello") {} } ...

    创建一个数据类型为T的链表类模板List,实现以下成员函数的模拟测试.cpp

    1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_...

    C++使用模板实现单链表

    本文实例为大家分享了用模板实现单链表,供... 构造函数和析构函数一般不加类型参数 本类类中除了构造函数和析构函数以外 其它的地方都要加上类型参数 */ Node(T data = 0) { mdata = data; pnext = NULL; }

    xml与反射.txt

    第三:通过clazz获得构造函数:Constructors cons=clazz.getDeclaraedConstructors(Class[]null);//调 用默认的构造函数 第四:然后通过构造函数构造对象:Car car=(Car)cons.newInstance();//获取类的默认构造函数...

    Codeigniter-login-auth-admin

    在Controller中定义公共类My_Controller继承CI_Controller,在构造函数中直接加载,如下:admin/controllers/MY_Controller.php 2):在ci如何加载css,js,image等等公共文件,在对应的模块中helper中可以扩展url,...

    在c++中实现属性

    get和set方法可以使用任何的变量名字,只需他们的地址能被传递到property类中,如下面的PropTest构造函数里面的代码般,代码行" property, int, READ_WRITE> Count; "让我们在PropTest中得到可读写的int型的Count...

    MP3的载入和播放

    CMP3( void ) // 默认构造函数 { m_GraphBuilder = NULL; m_MediaControl = NULL; m_MediaEventEx = NULL; m_IsPlaying = false; } ~CMP3( void ); // 析构函数 ...

    java面试800题

    构造函数是和类同名的函数,没有返回类型,构造函数不能在普通的程序里面调用,只有当这个类被应用new实例化的时候才会被运行。构造函数没有返回类型,实际上,构造函数返回的就是这个class本身。 类初始化时构造函数...

    最新名企标准通用C++面试题,

    6、编写类String的构造函数、析构函数和赋值函数(25分) 已知类String的原型为: class String { public: String(const char *str = NULL);//普通构造函数 String(const String &other);//拷贝构造函数 ~ String...

    powerbuilder

    参数printjobnumber:用PrintOpen()函数打开的打印作业号fontnumber:指定赋给当前定义字体的编号,有效值在1到8之间 facename:string类型,指定字体名称,该字体应该是你的打印机支持的字体,比如“宋体”height:...

    slackwebhooks:按照api对slack incomingwebhooks 进行简单的封装,主要是发送消息到slack

    针对slackMessage的使用分两种形式,一种使用构造函数创建对象,set其他值;另外一种是直接调用设置值。示例代码:SlackApi api = new SlackApi("incomingwebhooksurl");api.call(new SlackMessage("my test message...

Global site tag (gtag.js) - Google Analytics