2010-03-03 13 views
23

To było pytanie zadane w wywiadzie. Czy możemy wywołać jeden konstruktor od drugiego, jeśli klasa ma wiele konstruktorów w java i kiedy? Jak mam nazwać składnię?zadzwoń do jednego konstruktora z innego w java

+0

można wyjaśnić kwestię? Istnieje wiele konstruktorów, aby tworzyć obiekty w różny sposób i można je wywoływać z innych klas.Są robione tylko w tym celu. –

+4

oznacza wywołanie konstruktora z innego. – Woot4Moo

+0

pyta, czy dozwolone jest wywoływanie konstruktora od innego konstruktora, czy też nie, gdy klasa ma więcej niż jeden konstruktor. – Francis

Odpowiedz

36

Można, a składnia wiem jest

this(< argument list >); 

Można również zadzwonić super klasa konstruktor przez

super(< argument list >); 

Zarówno takie połączenia mogą być wykonywane tylko jako pierwsze zdanie w konstruktor (możesz więc wywoływać tylko jeden konstruktor i zanim cokolwiek innego zostanie zrobione).

+6

Nie możesz zrobić niczego, co wymaga odwołania się do tego. –

+0

musi również znajdować się w pierwszym wierszu konstruktora – sixtyfootersdude

+0

tak, pierwszy wiersz, więc będzie pierwszym, który zostanie zaimplementowany – Francis

6
this(other, args); 
+3

To jest mylące lub po prostu błędne! Czym jest inny? Po prostu wywołaj inny konstruktor, używając 'this (args-required-by-constructor)' lub 'super (args-required-by-constructor);' –

5

przykład:

public class FileDb { 

    /** 
    * 
    */ 
    public FileDb() { 
    this(null); 
    } 

    public FileDb(String filename) { 
    // ... 
    } 

} 
9

Tak, możesz to zrobić.

Wystarczy popatrzeć na realizację ArrayList na przykład:

public ArrayList(int initialCapacity) { 
    super(); 
    if (initialCapacity < 0) 
     throw new IllegalArgumentException("Illegal Capacity: "+ 
              initialCapacity); 
    this.elementData = new Object[initialCapacity]; 
} 

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
    this(10); 
} 

Drugi konstruktor nazywa pierwszy z default capacity dziesięciu.

7

FYI, to się nazywa telescoping/telescopic constructor pattern.

To omówione JLS 8.8.7.1 Explicit Constructor Invokations

  • Alternatywne wywołania konstruktora zaczynające się od słowa kluczowego this (ewentualnie poprzedzony jednoznacznych argumentów typu). Służą do wywoływania alternatywnego konstruktora tej samej klasy.
  • Wywołania konstruktora superklasy zaczynają się od słowa kluczowego super (prawdopodobnie poprzedzone jawnymi argumentami typu) lub wyrażenia podstawowego. Służą do wywoływania konstruktora bezpośredniej nadklasy.
9

Żadna z odpowiedzi nie jest kompletna, więc dodaję tę do wypełnienia pustych miejsc.

można wywołać konstruktora jeden od drugiego w tej samej klasie, lub zadzwonić do super klasy, z następującymi ograniczeniami:

  1. To ma być pierwszy wiersz kodu w konstruktorze dzwonisz.
  2. Nie może zawierać żadnych wyraźnych lub domyślnych odniesień do this. Zatem nie można przekazać klasy wewnętrznej (nawet anonimowej, jeśli odwołuje się do jakichkolwiek metod instancji) lub wyniku niestatycznego wywołania metody, jako parametru.

Składnia (jak wspomniano przez innych) to:

MyClass() { 
    someInitialization(); 
} 

MyClass(String s) { 
    this(); 
    doSomethingWithS(s); 
} 
Powiązane problemy