Dlaczego oba obiekty nie mogą być używane razem w konstruktorze?dlaczego te() i super() nie mogą być używane razem w konstruktorze?
Jaki jest powód takiego włączenia?
Dlaczego oba obiekty nie mogą być używane razem w konstruktorze?dlaczego te() i super() nie mogą być używane razem w konstruktorze?
Jaki jest powód takiego włączenia?
this(...)
wywoła innego konstruktora w tej samej klasie, natomiast super()
wywoła super konstruktora. Jeśli w konstruktorze nie ma wartości super()
, kompilator doda ją niejawnie.
Tak więc, jeśli oba były dozwolone, mógłbyś dwukrotnie wywołać konstruktora super
.
Przykład (nie patrzeć na znaczeniu w parametrach):
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(); //
}
}
Teraz, jeśli zadzwonisz new B(5)
następujące konstruktory są wywoływane:
this(false);
A() ---------------> A(false)
^
|
| super();
|
| this();
B() <--------------- B(5) <--- you start here
Aktualizuj:
Jeśli możesz użyć this()
i super()
możesz skończyć z som ething tak:
(Uwaga: ten ma na celu pokazać, co może pójść źle, jeśli pozwolono zrobić - które na szczęście nie są)
this(false);
A() ---------------> A(false)
^ ^
| |
| super(); | super(true); <--- Problem: should the parameter be true or false?
| |
| this(); |
B() <--------------- B(5) <--- you start here
jak można widzisz, napotkasz problem, w którym konstruktor A(boolean)
może być wywołany z różnymi parametrami i musisz teraz w jakiś sposób zdecydować, które z nich powinny być użyte. Dodatkowo, inni konstruktorzy (A()
i B()
) mogą zawierać kod, który teraz może nie być poprawnie wywoływany (to jest nieczynna kolejność itp.), Ponieważ wywołanie super(true)
omijałoby je, podczas gdy this()
nie byłoby.
Zarówno this()
, jak i super()
są wywołaniami konstruktora, a wywołanie konstruktora musi być pierwszym (i jedynym) wywołaniem w konstruktorze. W przeciwnym razie konstruktor Object
będzie wywoływany więcej niż raz podczas tworzenia instancji pojedynczego obiektu.
Istnieje różnica między super()
i this()
.
super()
- wywołuje konstruktor klasy podstawowej, natomiast
- wywołuje bieżący konstruktor klasy.
Zarówno this()
, jak i super()
są wywołaniami konstruktora.
Wywołanie konstruktora musi zawsze być pierwszym stwierdzeniem. Tak więc nie możemy mieć dwóch zdań jako pierwszego stwierdzenia, dlatego możemy albo zadzwonić pod numer super()
, albo możemy zadzwonić pod numer this()
od konstruktora, ale nie oba.
zasadzie przy A używa się tylko jednej instrukcji, co rozumiecie przez "nie możemy mieć dwóch zdań jako pierwszego zdania", to nie ma znaczenia –
to jest to, co powiedziałem .. –
Bo to nie ma sensu. Konstruktor musi zadzwonić pod numer this()
lub super()
(niejawnie lub jawnie).this()
dzwoni do innego konstruktora, który musi zadzwonić pod numer this()
lub super()
itp., Jak wcześniej. Konstruktor, który nazywał oba: this()
i super()
, ostatecznie wywoływałby ostatecznie dwa razy: super()
.
I nie jest to warunek zarówno to, że muszą być zadeklarowane w pierwszej linii konstruktora używasz. I dlatego nie możemy używać obu w jednym konstruktorze, ponieważ możesz napisać tylko jedną rzecz w pierwszej linii .
Porównaj przykład poniżej. Klasa FirstChild ustawia nazwę zmiennej instancji w 2 konstruktorach, ponieważ wywołanie drugiego konstruktora od pierwszego jest wykluczone przez konieczność wywołania super().
W klasie SecondChild wprowadzono trzeci prywatny konstruktor, który przyjmuje 2 parametry - pierwszy przekazany do kolacji() i drugi do ustawienia nazwy. Pierwsze 2 konstruktory wywołują trzeci. Super() jest wywoływany dokładnie raz, także zmienna instancji jest ustawiana tylko w jednym konstruktorze. Kod daje ten sam wynik bez potrzeby wywoływania super() i this() w tym samym konstruktorze.
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());
}
}
Bo jeśli używasz this()
i super()
razem w konstruktorze to daje błąd kompilacji czas. Ponieważ this()
i super()
musi być pierwszą instrukcją wykonywalną. Jeśli napiszesz this()
najpierw niż super()
stanie się drugim stwierdzeniem i na odwrót. Dlatego nie możemy razem używać this()
i super()
.
to() i super(), oba są konstruktorami, dlatego musi to być pierwsze zdanie. Ale możemy użyć obu w programie.
to(): Jest używane do wywoływania, tej samej klasy Domyślny lub Parametrized Constructor.
super(): Służy do wywołania, natychmiastowa klasa super/rodzica Domyślna lub Parametrizowana konstrukcja.
//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);
}
}
how do wersji: http://stackoverflow.com/questions/6965561/how-to-call-both-super-and-this-in-case-of-overloaded-constructors –