Výchozí konstruktérů a dědičnost v Javě

hlasů
50

Mám dotaz ohledně výchozích konstruktérů a dědičnost v Javě.

Obecně platí, že pokud píšete třídu a neobsahují žádný konstruktor Java automaticky poskytuje pro vás výchozí konstruktor (jeden bez parametrů), která inicializuje všechny proměnné instance dané třídy (pokud existují), s některými výchozími hodnotami (0, null , nebo falešné). Pokud napíšete konstruktor, nicméně, s některými parametry, a nemusíte psát žádný výchozí konstruktor, pak Java neposkytuje výchozí konstruktor. Moje otázka zní: co je tomu v případě tříd, které dědí z jiných tříd - když napíšu konstruktor s některými parametry v nich, ale nezahrnují výchozí konstruktor, že zdědí výchozí konstruktor super třídě?

Položena 08/02/2009 v 12:10
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
59
  1. Pokud nechcete, aby se konstruktor, je automaticky vytvořen výchozí prázdný konstruktor .

  2. Pokud některý konstruktor není explicitně volat super nebo tento konstruktor jako svého prvního tvrzení, je automaticky přidán volání super () .

Vždy.

Odpovězeno 09/02/2009 v 04:38
zdroj uživatelem

hlasů
51

Konstruktéři se nedědí.

Také inicializace polí se provádí pomocí virtuálního počítače, nikoli výchozí konstruktor. Výchozí konstruktor prostě vyvolá výchozí konstruktor nadtřídy a výchozí konstruktor Object je prázdný. Dobrou Smyslem tohoto návrhu je, že neexistuje žádný způsob, jak někdy přístup k neinicializované pole.

Odpovězeno 08/02/2009 v 12:17
zdroj uživatelem

hlasů
10

Pokud nepoužijete super (...) konstruktor volá prázdný konstruktor své mateřské společnosti. Poznámka: Dělá to na vás všechny třídy, a to i těch, které se rozprostírají objekt.

To není dědění, podtřídy nedostanou stejné konstruktérů se stejnými argumenty. Nicméně, můžete přidat konstruktérů, které vyžadují jeden z konstruktérů z super třídy.

Odpovězeno 08/02/2009 v 12:18
zdroj uživatelem

hlasů
6

Základním pravidlem je hovor (nebo vyvolání) do montážního závodu by měl být první prohlášení, že JVM musí vykonat,

Takže když máte super třídu pouze s nastavenými konstruktérem a žádný výchozí konstruktor, a základní třídy nemá explicitní volání parametrizované konstruktoru super třídy, JVM poskytuje super (); volání, které hází chybu, protože neexistuje žádný výchozí konstruktor pro super třídu, takže buď zajišťujeme výchozí konstruktor ve třídě Super ani explicitně volat parametrizované konstruktor super třídy v základním konstruktoru třídy. Když jsme dát explicitní volání, pak JVM neobtěžuje, aby řádek super (); jako konstruktoru vyvolání by měl být první údaj o metodě, která se nemůže stát (z důvodu našeho výslovného hovoru).

Odpovězeno 29/11/2012 v 19:49
zdroj uživatelem

hlasů
5

Sekce 8.8.9 na specifikaci jazyka Java popisuje podrobně, co se děje:

Je-li třída neobsahuje žádné deklarace konstruktoru, pak výchozí konstruktor je implicitně deklarován. Podoba výchozí konstruktor pro nejvyšší třídu úrovně, člen skupiny, nebo místní skupiny je následující:

  • Výchozí konstruktor má stejný přístup jako třída (§6.6).
  • Výchozí konstruktor nemá žádné formální parametry, s výjimkou třetího soukromého vnitřního členu třídy, kde je výchozí konstruktor implicitně deklaruje jeden formální parametr reprezentující bezprostředně obklopující instanci třídy (§8.8.1, §15.9.2, §15.9.3 ).
  • Výchozí konstruktor nemá žádný hází doložky.
  • V případě, že třída je deklarována skutečnost je prvořadým třídy Object, pak výchozí konstruktor má prázdné tělo. V opačném případě je výchozí konstruktor prostě vyvolá rodičovské konstruktor bez argumentů.

Můžete vidět, že neexistuje žádná dědičnost děje: všechno, co je to je „kompilátor magie“ se implicitně deklarované výchozí konstruktor. Specifikace také objasňuje, že výchozí konstruktor se přidává pouze tehdy, když třída nemá žádné konstruktory vůbec, což znamená, že odpověď na vaši otázku zní „ne“: jakmile dáte třídu konstruktor, přístup k výchozí konstruktor jejích nadtřídou je ztraceno.

Odpovězeno 13/02/2015 v 15:37
zdroj uživatelem

hlasů
3

Poskytnete-li konstruktor pak Java nevygeneruje vám výchozí prázdný konstruktor. Takže vaše odvozené třídy bude moci volat svou konstruktor pouze.

Výchozí konstruktor není inicializovat své soukromé proměnné na výchozí hodnoty. Důkazem je, že je možné napsat třídu, která nemá výchozí konstruktor a má vlastní členové inicializován na výchozí hodnoty. Zde je příklad:

public class Test {

    public String s;
    public int i;

    public Test(String s, int i) {
        this.s = s;
        this.i = i;
    }

    public Test(boolean b) {
        // Empty on purpose!
    }

    public String toString() {
        return "Test (s = " + this.s + ", i = " +  this.i + ")";
    }

    public static void main (String [] args) {
        Test test_empty = new Test(true);
        Test test_full = new Test("string", 42);
        System.out.println("Test empty:" + test_empty);
        System.out.println("Test full:"  + test_full);
    }
}
Odpovězeno 08/02/2009 v 12:25
zdroj uživatelem

hlasů
2

Odpověď na vaši otázku je velmi jednoduchá. Implicitně (Neviditelný), první příkaz v každém konstruktoru je ‚super ();‘ tj volání žádný parametr konstruktoru třídy Super je, dokud jej nezměníte explicitně něco jako 'toto ();', 'to (int)', 'to (String)', 'super (int)', "super (String )‘atd. 'to ();' Je konstruktor aktuální třída je.

Odpovězeno 23/03/2017 v 09:31
zdroj uživatelem

hlasů
2

Palec pravidlem je, že Sub Class měli zavolat jakýkoli konstruktoru ze základní třídy. takže pokud nemáte na výchozí const volání existující jeden z sub třídy. jinak, realizovat prázdnou const v základní třídě, aby se zabránilo problému kompilace

Odpovězeno 23/06/2011 v 12:22
zdroj uživatelem

hlasů
1

Když jsme se nevytvářejí konstruktor Java vytvoří výchozí konstruktor automaticky. Ale když jsme se vytvořit jeden nebo více vlastních konstruktérů s argumenty, Java nevytváří žádné výchozí konstruktory. Budeme-li vytvořit jeden nebo více konstruktérů a chceme vytvořit objekt bez argumentů konstruktoru, musíme deklarovat prázdný konstruktor.

Odpovězeno 26/01/2011 v 10:46
zdroj uživatelem

hlasů
0

Jakékoli konstruktér v podtřídy zavolá žádný argument konstruktor (nebo výchozí konstruktor) z nadřazené třídy. pokud definujete parametrizované konstruktor nadřazené třídy pak budete muset explicitně volat mateřské třídy konstruktor super-heslo jinde to bude dávat chybu kompilace.

class Alpha 
{ 
    Alpha(int s, int p) 
    { 
        System.out.println("base");
    }

} 

public class SubAlpha extends Alpha 
{ 
    SubAlpha() 
    { 
        System.out.println("derived"); 
    } 
    public static void main(String[] args) 
    { 
        new SubAlpha(); 
    } 
}

Výše uvedený kód bude dávat chybu kompilace:

prog.java:13: error: constructor Alpha in class Alpha cannot be applied to given types;
    { 
    ^
  required: int,int
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

Došlo k chybě dochází, protože výše ani nemáme žádný žádný argument konstruktoru / výchozí konstruktor nadřazené třídy, ani jsme volání parametrizované konstruktor z dílčí třídu.

Nyní to vyřešit buď volání parametrizované konstruktor takto:

class Alpha 
{ 
    Alpha(int s, int p) 
    { 
        System.out.println("base");
    }

} 

public class SubAlpha extends Alpha 
{ 
    SubAlpha() 
    { 
        super(4, 5); // calling the parameterized constructor of parent class
        System.out.println("derived"); 
    } 
    public static void main(String[] args) 
    { 
        new SubAlpha(); 
    } 
}

Výstup

base
derived

nebo

vymezují žádný argument konstruktor nadřazené třídy, jako je tento:

class Alpha 
{ 
    Alpha(){

    }
    Alpha(int s, int p) 
    { 
        System.out.println("base");
    }

} 

public class SubAlpha extends Alpha 
{ 
    SubAlpha() 
    { 
        System.out.println("derived"); 
    } 
    public static void main(String[] args) 
    { 
        new SubAlpha(); 
    } 
}

výstup

derived 
Odpovězeno 19/05/2019 v 10:47
zdroj uživatelem

hlasů
0

Tam bude sestavovat chyba čas ... protože kompilátor hledá výchozí konstruktor he super třídy, a pokud to není tam ... jeho chyba ... a program nebude kompilace ...

Odpovězeno 30/08/2017 v 18:37
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more