这个类中的构造函数在哪里?

时间:2012-11-05 17:11:02

标签: java constructor

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);
  }
}

11 个答案:

答案 0 :(得分:14)

没有,这是隐含的。由于它没有明确extends任何类,它将隐式扩展Object。而且由于Object有一个no-arg构造函数,它将隐式调用那个。

实际上,该类可以包含一个这样编写的构造函数,它将是等价的:

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

    //the methods...
}

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您的班级中没有明确的构造函数。您正在使用implicit类中的Object构造函数,如下所示:

  EqualsTest et1 = new EqualsTest();

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

  public EqualsTest(){ //without param
  }


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

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

答案 3 :(得分:2)

所有没有显式声明构造函数的java类都会获得格式

的默认no-arg构造函数
public ClassName()
{
  super();
}

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

public EqualsTest(){}

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

答案 6 :(得分: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课程将无法获得实例化。

答案 7 :(得分:2)

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

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

当您使用参数定义构造函数时,您将丢失此功能,并且如果需要,您还必须编写默认的no-arg构造函数的代码。

答案 8 :(得分:2)

如果没有指定构造函数,则有一个隐式构造函数。在你的情况下

 public EqualsTest(){
     super();
 }

如果你声明一个构造函数,那么这个隐式构造函数不再存在,你必须显式地声明一个no args构造函数

答案 9 :(得分:2)

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

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

答案 10 :(得分:2)

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

隐式构造 看起来像

public  EqualsTest()
{
 super();
}