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...
}
拡張するクラスに'no-arg'コンストラクター(暗黙的または明示的)がない場合は、暗黙的コンストラクターを使用できません。明示的なコンストラクターを指定した場合、暗黙的な引数なしのコンストラクターは作成されません。
クラスにはコンストラクターが定義されていないため、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();
}
コンストラクターを宣言すると、この暗黙のコンストラクターはもう存在しないため、引数なしのコンストラクターを明示的に宣言する必要があります。
Javaは、明示的なコンストラクターが提供されていない場合に、引数をとらず、特別なアクションや初期化を実行しないデフォルトのコンストラクターを提供します。
暗黙のデフォルトコンストラクターによって実行される唯一のアクションは、super()呼び出しを使用してスーパークラスコンストラクターを呼び出すことです。
オブジェクトクラスコンストラクターを呼び出している暗黙のコンストラクターがあなたの場合にあります
暗黙の構成は次のようになります
public EqualsTest()
{
super();
}