构造函数和构造函数重载

3

有人可以解释一下吗?

当我们用不同参数类型重载构造函数时,一个是对象类型,另一个是字符串类型。当我们提供空输入参数创建该类的对象时,它会调用以字符串为输入参数的构造函数,而不是以对象为输入参数的构造函数。由于对象是字符串的超类,有人能告诉我为什么会调用带有字符串输入参数的构造函数吗?

Class A
{
  public A(Object o)
   {
     System.out.println("Object Drawn");
   }
   public A (String o)
   {
     System.out.println("String Drawn");
   }
   public static void main(String args[])
   {
   new A(null);
   }
 }

输出:- 字符串绘制


1
这是一个C++或Java问题,但不是两者都有的问题。看起来是Java,那为什么要使用“c ++”标签? - j_random_hacker
2
我不认为语言有什么关系,因为答案是相同的。 - Peter Lawrey
2
@PeterLawrey:这很明显。作为一名有经验的C++开发者,我无法自信地回答有关Java的问题,因此该标签浪费了像我这样仅限于C++的人的时间;而且没有任何一个寻找C++答案的人不知道这两种语言在这方面的行为方式相同,也无法从中获得有用的关于C++的信息。 - j_random_hacker
1
@PeterLawrey 答案在 C++ 中是不同的。由于 A 是用 null 构造的,唯一可能的 C++ 等效方式是让构造函数接受一个指向 ObjectString 的指针,并且调用 A(nullptr) 将导致编译错误,因为存在二义性重载。 - juanchopanza
@EJP:我本应该对Peter Lawrey的“等价性”断言提出异议,正如juanchopanza所观察到的,并且http://ideone.com/mBdC9证明的那样,答案是C++等效版本无法编译,因此这两种语言在这里实际上*不等价*。 - j_random_hacker
显示剩余5条评论
1个回答

4

它总是调用最具体的匹配方法或构造函数。如果不这样做,您将始终调用Object,并且重载它将毫无意义。

这种方法在Java和C++中使用。


是因为空字符串""更合适吗?还有什么叫做null对象吗? - Coding Mash
1
如果你使用 "",那么它肯定是一个空字符串。如果你使用 null,那么它可以是一个字符串或对象。"null字符串"和"null对象"这个术语只会让人困惑,而且没有标准值。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接