0
public class EqualsTest {
  public static <T> boolean equalTest(T o1, T o2) {
      return o1.equals(o2);
  }
  public static void main(String[] args) {
      EqualsTest et1 = new EqualsTest();
      EqualsTest et2 = new EqualsTest();
      System.out.println(et1.equals(et2));
      System.out.println(equalTest(et1, et2));
  }
  public boolean equals(Object o) {
      if (o instanceof EqualsTest) {
          System.out.println("equals(Object)");
          return true;
      }
      return false;
  }
  public boolean equals(EqualsTest et) {
      System.out.println("equals(EqualsTest)");
      return this.equals((Object)et);
  }
}
4

11 回答 11

14

没有,它是隐含的。由于它没有显式extends任何类,它将隐式扩展Object. 由于 Object 有一个无参数的构造函数,它会隐式调用那个构造函数。

真的,这个类可以包含一个这样写的构造函数,它是等价的:

public class EqualsTest {
    public EqualsTest() {
        super();
    }

    //the methods...
}

如果您扩展的类也没有“无参数”构造函数(无论是隐式还是显式),则不能使用隐式构造函数。如果您提供任何显式构造函数,则不会为您创建隐式无参数构造函数。

于 2012-11-05T17:11:32.750 回答
2

当没有提供显式构造函数时,Java 提供了一个默认构造函数,它不接受参数并且不执行特殊操作或初始化。

隐式默认构造函数采取的唯一动作是使用 super() 调用来调用超类构造函数。

于 2012-11-05T17:17:29.340 回答
2

在您的情况下存在一个隐式构造函数,它正在调用对象类构造函数

隐式构造看起来像

public  EqualsTest()
{
 super();
}
于 2012-11-05T17:23:10.927 回答
2

类中没有定义构造函数,因此 Java 将在编译时添加默认构造函数。检查http://en.wikipedia.org/wiki/Default_constructor#Java_and_C.23

于 2012-11-05T17:13:01.057 回答
2

您的类中没有显式构造函数。您在以下语句中使用类中的implicit构造函数:Object

  EqualsTest et1 = new EqualsTest();

为了您的理解,构造函数通常定义如下:

  public EqualsTest(){ //without param
  }


  public EqualsTest(int param1){ //with one param
  }

请注意:构造函数和其他方法的主要区别是:构造函数与您的类同名并且没有任何返回类型。

于 2012-11-05T17:13:06.287 回答
2

所有没有显式声明构造函数的 java 类都会获得一个默认的无参数构造函数,其形式为

public ClassName()
{
  super();
}

在隐式构造函数内部是对类的超类的构造函数的调用(默认为 Object),因此是“super();”

于 2012-11-05T17:13:07.290 回答
2

如果您未指定任何构造函数,则会提供一个。如果您提供一个,则必须覆盖默认情况下的一个。所以在这里你提供了构造函数。

于 2012-11-05T17:13:25.720 回答
2

如果一个类没有任何构造函数,它会创建一个隐式构造函数,在你的情况下

public EqualsTest(){}

将在那里。如果你创建一个带有任何参数的构造函数,你将失去这个隐式构造函数,如果你想要一个无参数构造函数,你将不得不构造它。

于 2012-11-05T17:13:29.863 回答
2

main方法是您的应用程序的入口点。它在你启动它时被调用,这里没有实例化。如果需要,您可以创建一个构造函数:

public class Main {
    /**
     * Main.
     * @param args
     */
    public static void main(String[] args) {
        Main main = new Main();
        // do something more
    }

    public Main() {
        // do something
    }
}

你甚至Main可以在我的代码中看到实例化。在这种情况下,您可以创建一个构造函数,Main否则Object将调用默认构造函数。

你甚至可以这样做,这对你来说很有意义:

public class Main {
    /**
     * Main.
     * @param args
     */
    public static void main(String[] args) {
        Main main = new Main("some param");
    }

    public Main() {
        // do something
    }

    public Main(String someParameter) {
        this();
    }

}

但请记住,如果没有您的干预,您的Main课程将不会被实例化。

于 2012-11-05T17:14:10.340 回答
2

如果未指定,则构造函数是隐式的。

这意味着您可以通过调用来实例化该类new EqualsTest()

相反,当您定义带参数的构造函数时,您将失去此功能,并且如果需要,您也被迫为默认的无参数构造函数编写代码。

于 2012-11-05T17:14:41.253 回答
2

如果未指定构造函数,则存在隐式构造函数。在你的情况下

 public EqualsTest(){
     super();
 }

如果您声明一个构造函数,则此隐式构造函数不再存在,您必须显式声明一个无参数构造函数

于 2012-11-05T17:15:22.300 回答