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 回答
没有,它是隐含的。由于它没有显式extends
任何类,它将隐式扩展Object
. 由于 Object 有一个无参数的构造函数,它会隐式调用那个构造函数。
真的,这个类可以包含一个这样写的构造函数,它是等价的:
public class EqualsTest {
public EqualsTest() {
super();
}
//the methods...
}
如果您扩展的类也没有“无参数”构造函数(无论是隐式还是显式),则不能使用隐式构造函数。如果您提供任何显式构造函数,则不会为您创建隐式无参数构造函数。
当没有提供显式构造函数时,Java 提供了一个默认构造函数,它不接受参数并且不执行特殊操作或初始化。
隐式默认构造函数采取的唯一动作是使用 super() 调用来调用超类构造函数。
在您的情况下存在一个隐式构造函数,它正在调用对象类构造函数
隐式构造看起来像
public EqualsTest()
{
super();
}
类中没有定义构造函数,因此 Java 将在编译时添加默认构造函数。检查http://en.wikipedia.org/wiki/Default_constructor#Java_and_C.23
您的类中没有显式构造函数。您在以下语句中使用类中的implicit
构造函数:Object
EqualsTest et1 = new EqualsTest();
为了您的理解,构造函数通常定义如下:
public EqualsTest(){ //without param
}
public EqualsTest(int param1){ //with one param
}
请注意:构造函数和其他方法的主要区别是:构造函数与您的类同名并且没有任何返回类型。
所有没有显式声明构造函数的 java 类都会获得一个默认的无参数构造函数,其形式为
public ClassName()
{
super();
}
在隐式构造函数内部是对类的超类的构造函数的调用(默认为 Object),因此是“super();”
如果您未指定任何构造函数,则会提供一个。如果您提供一个,则必须覆盖默认情况下的一个。所以在这里你提供了构造函数。
如果一个类没有任何构造函数,它会创建一个隐式构造函数,在你的情况下
public EqualsTest(){}
将在那里。如果你创建一个带有任何参数的构造函数,你将失去这个隐式构造函数,如果你想要一个无参数构造函数,你将不得不构造它。
该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
课程将不会被实例化。
如果未指定,则构造函数是隐式的。
这意味着您可以通过调用来实例化该类new EqualsTest()
。
相反,当您定义带参数的构造函数时,您将失去此功能,并且如果需要,您也被迫为默认的无参数构造函数编写代码。
如果未指定构造函数,则存在隐式构造函数。在你的情况下
public EqualsTest(){
super();
}
如果您声明一个构造函数,则此隐式构造函数不再存在,您必须显式声明一个无参数构造函数