Вопрос по constructor, java, inheritance – Почему this () и super () не могут использоваться вместе в конструкторе?

29

Почему не можетthis() а такжеsuper() оба будут использоваться вместе в конструкторе?

В чем причина включения такой вещи?

А как версия:stackoverflow.com/questions/6965561/… Ciro Santilli 新疆改造中心 六四事件 法轮功

Ваш Ответ

8   ответов
7

Есть разница междуsuper() а такжеthis().

super()- вызывает конструктор базового класса, тогда как
this()- вызывает конструктор текущего класса.

И то и другоеthis() а такжеsuper() вызовы конструктора.
 Вызов конструктора всегда должен быть первым оператором. Таким образом, мы не можем иметь два утверждения в качестве первого утверждения, поэтому либо мы можем вызватьsuper() или мы можем позвонитьthis() от конструктора, но не оба.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Потому что это не имеет смысла. Конструктор должен либо вызватьthis() или жеsuper() (неявно или явно).this() вызывает другой конструктор, который должен вызвать либоthis() или жеsuper() и т. д. как и прежде. Конструктор, который вызвал обаthis() а такжеsuper() поэтому в конечном итоге вызоветsuper() дважды.

4

И то и другоеthis() а такжеsuper() являются вызовами конструктора, и вызов конструктора должен быть первым (и только первым) вызовом в конструкторе. В противном случаеObject конструктор будет вызываться более одного раза при создании экземпляра одного объекта.

0

this () и super (), оба являются конструкторами, поэтому должны быть первым утверждением. Но мы можем использовать оба в программе.

this(): Используется для вызова того же класса Default или Parametrized Constructor.

super(): Используется для вызова непосредственного супер / родительского класса Default или Parametrized Constructor.

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

Потому что, если вы используетеthis() а такжеsuper() вместе в конструкторе это даст ошибку времени компиляции. Так какthis() а такжеsuper() должен быть первым исполняемым оператором. Если ты пишешьthis() сначала чемsuper() станет вторым утверждением и наоборот. Вот почему мы не можем использоватьthis() а такжеsuper() все вместе.

2
  • we use this() keyword in constructor chaining to access the constructor of the same class
  • we use super() keyword when we want to access the constructor of immediate parent class in inheritance.

И есть условие в том, что они должны быть объявлены вfirst line конструктора, который вы используете. И это причина, почему мы не можем использовать оба в одном конструкторе, потому что вы можете написать только одну вещь в вашемfirst line.

32

this(...) вызовет другой конструктор в том же классе, тогда какsuper() вызову супер конструктор. Если нетsuper() в конструкторе компилятор добавит его неявно.

Таким образом, если бы оба позволили, вы могли бы в конечном итоге вызватьsuper конструктор дважды.

Пример (не ищите смысла в параметрах):

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

Теперь, если вы позвонитеnew B(5) следующие конструкторы вызываются:

     this( false);
A() ---------------> A(false)
^
|
| super(); 
|
|     this();
B() <--------------- B(5)  <--- you start here

Update:

Если бы вы могли использоватьthis() а такжеsuper() вы можете получить что-то вроде этого:

(Attention: это должно показать, что может пойти не так,if you were allowed to do that - который, к счастью, вам не подходит)

     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() Wouldn & APOS; т.

0

Сравните пример ниже. Класс FirstChild устанавливает имя переменной экземпляра в 2 конструкторах, так как вызов второго конструктора из первого исключается при необходимости вызова super ().

В классе SecondChild введен третий приватный конструктор, который принимает 2 параметра & # x2013; первый передается в supper (), а второй используется для задания имени. Первые 2 конструктора вызывают третий. Super () вызывается ровно один раз, также переменная экземпляра устанавливается только в одном конструкторе. Код дает тот же результат без необходимости вызывать 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("Constructor,Test 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());
    }
}

Похожие вопросы