Ho le seguenti domande sulla parola chiave super in java:
Ho un codice qui sotto con le classi:
- A Estendi nessuna classe contiene la variabile intera i
- B Estende la classe A contiene la variabile intera i
-
C Estende la classe B contiene la variabile intera i
class A { int i = 20; A() { System.out.println("I am in constructor of the parent class"); } }
class B extends A { int i = 30; B() { System.out.println("I am in constructor of the subclass"); } }
class C extends B { int i = 40; C() { System.out.println("I am in constructor of the main class"); } void display() { System.out.println(i); System.out.println(super.i); /* * My first thoughts to access the third variable 'i' * inherited indirectly to this class by 'class A'. * I thought that it would print 20 :(. System.out.println(super.super.i); */ } public static void main(String[] argue) { C obj2 = new C(); obj2.display(); } }
- Ora come classe
B
eredita la classeA
quindi deve avere due variabili integeri
. La classeC
eredita la classeB
quindi avrà due variabili integer daB
e una definita in sé.
- Ora come classe
Ora posso stampare la variabile di classe super ereditata i
nella classe C
tramite il metodo di visualizzazione e, naturalmente, la variabile che ho definito nella classe C
stessa. La domanda è come stampare il terzo i
che ha il valore "20".
So che posso definire un metodo nella classe B che restituisce super.i; e chiamiamolo attraverso il suo oggetto in classe A che stamperà la terza variabile io e ho anche saputo che posso creare un oggetto di classe A, ma c'è un altro modo usando super o qualsiasi altra cosa per accedere direttamente alla terza variabile in la classe C.
Anche l'output è:
I am in constructor of the parent class
I am in constructor of the subclass
I am in constructor of the main class
40
30
-
perché, come questa parola chiave, la parola chiave super non può essere utilizzata all'interno dei metodi statici?
-
perché il costruttore di super classi ha chiamato per inizializzare le variabili ereditate di una sottoclasse? Questo non ha senso perché se una classe estende un'altra classe, le variabili e i metodi saranno come se fossero stati dichiarati localmente nella classe in altre parole i suoi membri. Quindi, perché il costruttore della sottoclasse non può inizializzare quei membri ereditati e deve chiamare il costruttore super-classe per inizializzarli.