`
liuwei1981
  • 浏览: 775170 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:162024
社区版块
存档分类
最新评论

java解惑--令人混淆的构造器案例

阅读更多

       下面的这个类呈现了两个令人混淆的构造器。 main方法调用了一个构造器,但它调用的究竟是哪一个?该程序的输出取决于这个问题的答案。它会打印什么?甚至它是否合法?

     

public class Confusing {
   private Confusing(Object o){
        System.out.println("Object!");
  }

  private Confusing(double[] fArray){
       System.out.println("double array!");
 }

   public static void main(String[] args){
        new confusing(null);
  }
}

 

 

  传递给构造器的是一个空的对象引用,因此,初看起来,改程序好像应该调用参数类型为Object的重载版本,并且打印Object。另一方面,数组也是引用类型,因此null也可以应用于类型为double[]的重载版本。看起来这个调用是模棱两可的,改程序不能编译,但如果试着运行改程序,就会发现它打印的是double array。

 

   java的重载解析过程是分两阶段运行的,第一阶段选取所有可获得并且可应用的方法或构造器;第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性

 

   在我们的程序中,两个构造器都可以获得并且可应用的,构造器Confusing(Object)可以接受任何传递给Confusing(double【】)的参数,因此Confusing(double【】)相对更精确,因此,最终选择该方法。

 

   一般来说,要想强制要求编译器选择一个精确的重载版本,需要将实参转型为形参所声明的类型

  

分享到:
评论

相关推荐

    java解惑--疑难问题解疑

    本文将针对"java解惑--疑难问题解疑"的主题,对一些常见的Java疑难问题进行详细解析,旨在帮助初学者更好地理解和解决这些问题。 1. **内存管理与垃圾回收**:Java通过自动垃圾回收机制来管理内存,这为开发者减轻...

    java解惑--异常地危险

    ### Java解惑——异常地危险 #### 背景与问题描述 在Java开发过程中,开发者经常需要处理多线程编程。随着Java平台的发展和完善,一些早期提供的API由于设计上的考虑不足或者潜在的安全隐患,逐渐被标记为废弃,并...

    java解惑-语法细节介绍

    ### Java解惑——语法细节介绍 #### 概述 Java作为一种广泛应用的编程语言,拥有庞大的用户群体和丰富的应用场景。在日常开发过程中,我们往往会遇到一些容易忽视却又十分重要的语法细节。这些细节虽然不起眼,但...

    java解惑 - 最后的笑声

    《Java解惑——最后的笑声》这篇博文主要探讨了Java编程中一些常见但往往被忽视的问题,这些问题可能会在开发过程中导致意料之外的错误或性能瓶颈。作为一个专业的IT大师,我将深入解析这些知识点,帮助你更好地理解...

    JAVA解惑-Pg285.pdf

    表达式之谜,符号之谜,循环之谜,异常之谜,类之谜,库之谜,各种谜题。

    java 解惑 java 解惑 java 解惑

    java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑

    Java解惑(中文版)_java_java解惑_solve65p_

    《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...

    Java学习利器-JAVA解惑

    然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...

    最新版的Java-解惑

    《Java解惑》是一本专为Java初学者和进阶者设计的指南,旨在帮助读者解决在学习和实践中遇到的各种问题。这本书深入浅出地解析了Java编程中的常见困惑,涵盖了语言基础、类库应用、多线程、网络编程、异常处理、内存...

    JAVA面试题解惑--经典面试题

    接下来,当创建一个新对象时,非静态变量和初始化块会根据定义的顺序进行初始化,最后执行构造器,这是创建新对象的最后一环。 (二)关于创建 String 对象的问题,Java中的String是不可变的,这意味着一旦创建了一...

    Java解惑.pdf

    理解类的构造器、继承、封装和多态性对于Java编程至关重要。 3. **异常处理**:Java的异常处理机制帮助程序员捕获和处理运行时错误。try-catch-finally语句块用于处理可能出现的异常,使程序更加健壮。 4. **集合...

    Java解惑(中文).pdf

    2. **this关键字**:`this`用于引用当前对象,常在方法内部用来区分局部变量和成员变量,或者在构造器中调用其他构造器。 3. **接口与抽象类**:Java支持接口和抽象类作为多态的实现方式。接口完全由抽象方法组成,...

    JAVA 解惑 java经典

    5. **垃圾回收机制**:Java自动管理内存,通过垃圾回收器自动回收不再使用的对象,理解其工作原理有助于优化内存使用。 6. **多线程**:Java提供了丰富的API支持多线程编程,如Thread类、Runnable接口,以及...

    java解惑 PDF版

    在Java编程中,开发者经常会遇到各种误区和混淆之处,这些问题可能涉及语言特性、算法逻辑、性能优化等多方面。文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误...

    Java PUZZLE Java 解惑

    Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑

    Java解惑 中文版

    《Java解惑中文版》是一本专为Java程序员设计的指南,旨在帮助读者解决在编程过程中遇到的各种问题,提升程序的健壮性。本书深入浅出地探讨了Java语言的核心概念、常见疑惑以及最佳实践,旨在使开发者能够编写出更...

    2010年-Java解惑(中文)

    《Java解惑(中文)》是一本专注于解决Java编程中常见问题和困惑的资源集合,旨在帮助初学者和有经验的开发者更好地理解和掌握Java语言。本文将深入探讨Java编程中的关键概念、常见问题以及解决方案。 1. **Java...

Global site tag (gtag.js) - Google Analytics