this()
とsuper()
の両方をコンストラクタで一緒に使用できないのはなぜですか?this()とsuper()の両方をコンストラクタで一緒に使用できないのはなぜですか?
このようなことを組み込む理由は何ですか?
this()
とsuper()
の両方をコンストラクタで一緒に使用できないのはなぜですか?this()とsuper()の両方をコンストラクタで一緒に使用できないのはなぜですか?
このようなことを組み込む理由は何ですか?
this(...)
は、同じクラスで別のコンストラクタを呼び出しますが、super()
はスーパーコンストラクタを呼び出します。コンストラクタ内にsuper()
がない場合、コンパイラは暗黙的に1つを追加します。
したがって、両方が許可された場合は、super
コンストラクタを2回呼び出すことになります。
例(パラメータの感覚で見ていない):あなたはnew B(5)
を呼び出す場合
class A {
public A() {
this(false);
}
public A(boolean someFlag) {
}
}
class B extends A {
public B() {
super();
}
public B(boolean someFlag) {
super(someFlag);
}
public B (int someNumber) {
this(); //
}
}
、次のコンストラクタが呼び出されます。
this(false);
A() ---------------> A(false)
^
|
| super();
|
| this();
B() <--------------- B(5) <--- you start here
更新を:
this()
とsuper()
を使用できる場合は、このようething:
(注意を:これは、間違って行くことができるかを示すためのものですあなたは何を許可された場合に - あなたは幸いではありません)することができますように
this(false);
A() ---------------> A(false)
^ ^
| |
| super(); | super(true); <--- Problem: should the parameter be true or false?
| |
| this(); |
B() <--------------- B(5) <--- you start here
さまざまなパラメータでA(boolean)
コンストラクタを呼び出すことができる問題にぶつかり、どちらを使うべきかを決める必要があります。さらに、他のコンストラクタ(A()
およびB()
)には、super(true)
への呼び出しがそれらを回避するため、this()
はそうではないため、正しく呼び出されない可能性があるコードが含まれている可能性があります。
this()
とはいずれもコンストラクタ呼び出しであり、コンストラクタ呼び出しはコンストラクタ内の最初の(かつ最初の)呼び出しでなければなりません。それ以外の場合は、単一のオブジェクトをインスタンス化するときにObject
コンストラクターが複数回呼び出されます。
super()
とthis()
の間に違いがあります。
super()
は -
this()
に対し、基本クラスのコンストラクタを呼び出す - 現在のクラスのコンストラクタを呼び出します。
this()
とは、どちらもコンストラクタコールです。
コンストラクタ呼び出しは常に最初の文でなければなりません。したがって、最初のステートメントとして2つのステートメントを使用することはできません。したがって、super()
を呼び出すか、this()
をコンストラクターから呼び出すことができますが、両方を呼び出すことはできません。
基本的に時間がたった1つのステートメントが使用されている場合、「最初のステートメントとして2つのステートメントを持つことはできません」という意味はどういう意味ですか? –
thats私が言ったことです。 –
意味がありません。コンストラクタはthis()
またはsuper()
(暗黙的または明示的)のいずれかを呼び出す必要があります。this()
は、前と同じようにthis()
またはsuper()
などのいずれかを呼び出す別のコンストラクタを呼び出します。したがって、this()
とsuper()
の両方を呼び出したコンストラクタは、最終的にsuper()
を2回呼び出します。私たちは、私たちが直接の親クラスのコンストラクタにアクセスしたいときに我々がスーパー()キーワードを使用同じクラスのコンストラクタ
そして、彼らはあなたが使用しているコンストラクタの最初の行に宣言する必要が両方の条件があります。そして、あなたがの最初の行に1つしか書くことができないので、それは単一のコンストラクタで両方を使用できない理由です。
以下の比較例を比較してください。クラスFirstChildは、インスタンス変数名を2つのコンストラクタに設定します。最初のインスタンスから2番目のコンストラクタを呼び出すと、super()を呼び出す必要がなくなります。
SecondChildクラスには、最初にsupper()に渡されたパラメータとnameを設定するために使用された2つのパラメータを取る3番目のプライベートコンストラクタが導入されています。最初の2つのコンストラクタが3番目のコンストラクタを呼び出しています。 Super()は正確に1回だけ呼び出され、インスタンス変数も1つのコンストラクタでのみ設定されます。コードは同じコンストラクタでsuper()とthis()を呼び出す必要なく同じ結果を生成します。
class FirstChild extends ConstructorTest{
private String name = null;
public FirstChild(){
super("super text 1");
//this("Unknown"); //UNCOMMENTED DOES NOT COMPILE
name = "Unknown";
}
public FirstChild(String name){
super("super text 2");
this.name = name;
}
public String getName(){
return name;
}
}
class SecondChild extends ConstructorTest{
private String name = null;
public SecondChild(){
this("super text 1", "Unknown");
}
public SecondChild(String name){
this("super text 2", name);
}
private SecondChild(String superStr, String name)
{
super(superStr);
this.name = name;
}
public String getName(){
return name;
}
}
public class ConstructorTest{
public ConstructorTest(String str){
System.out.println("ConstructorTest constructor called with parameter \"" + str + "\"");
}
public static void main(String... args)
{
System.out.println("Hello from main, FirstChild results:");
FirstChild fc1 = new FirstChild();
FirstChild fc2 = new FirstChild("John");
System.out.println(" child fc1 name: " + fc1.getName());
System.out.println(" child fc2 name: " + fc2.getName());
System.out.println("Hello from main, SecondChild results:");
SecondChild sc1 = new SecondChild();
SecondChild sc2 = new SecondChild("John");
System.out.println(" child sc1 name: " + sc1.getName());
System.out.println(" child sc2 name: " + sc2.getName());
}
}
あなたは、コンストラクタで一緒にthis()
とsuper()
を使用している場合、それは時間のコンパイルエラーなりますので。 this()
とsuper()
は最初の実行可能文である必要があるためです。 this()
を最初に書き込むと、super()
が2番目のステートメントになり、その逆もあります。そのため、this()
とsuper()
を一緒に使用することはできません。
this()とsuper()はどちらも最初のステートメントでなければならないコンストラクタです。しかし、我々は両方のプログラムで使用することができます。
this():これは、同じクラスのデフォルトコンストラクタまたはパラメータ化コンストラクタを呼び出すために使用されます。
super():これは、スーパー/親クラスの直接のデフォルトまたはパラメータ化されたコンストラクタを呼び出すために使用されます。
//Super Class
public class SuperConstructor {
SuperConstructor(){
this(10);
System.out.println("Super DC");
}
SuperConstructor(int a){
this(10,20);
System.out.println("Suer SPC with Iteger");
}
SuperConstructor(int i,int j){
System.out.println("Super with DPC with Iteger and Integer");
}
}
//subclass
public class ThisConstructor extends SuperConstructor{
ThisConstructor(){
this(10,20);
System.out.println("Subcalss DC ");//DC Default Constructor
}
ThisConstructor(int i){
super(i);
System.out.println("Subcalss SPC with Iteger");//SPC Single Parameterized Constructor
}
ThisConstructor(int i, String s){
this();
System.out.println("Subcalss DPC with Iteger and String");//DPC double Parameterized Constructor
}
ThisConstructor(int i,int age){
super(i,age);
System.out.println("Subcalss DPC with Iteger and Integer");
}
public static void main(String []k){
System.out.println("=================Frist time Calling ==========================\n");
ThisConstructor t = new ThisConstructor(1);
System.out.println("=================Second time Calling ==========================\n");
ThisConstructor t1 = new ThisConstructor(1,2);
}
}
Aどのバージョンへ:http://stackoverflow.com/questions/6965561/how-to-call-both-super-and-this-in-case-of-overloaded-constructors –