2012-07-13 13 views

risposta

5

È possibile non sovraccarico campi (solo i metodi possono essere sovraccaricati), potrebbe essere confuso con sovrascrivendo campi - che in ogni caso non è possibile, si finisce per nascondere i campi da superclassi. Dai un'occhiata a questo post.

+1

Ho pensato che fosse così e all'inizio sono rimasto un po 'confuso quando sono venuti da me a riguardo. Ho solo programmato Java da tre anni e non mi sono imbattuto in questo. Volevo solo assicurarmi che non mi mancasse nulla. –

+1

@BrandonWilson non è possibile – Pooya

0

credo che Java supporta le interfacce, e le interfacce dovrebbe essere in grado di aiutarvi a raggiungere ciò che si sta cercando di raggiungere

here's an example i found quick

here's a tutorial

solo assicurarsi che non si è sovraccarico membri pubblici in quel modo.

0

un'occhiata a questo codice

class A<T> { 
    protected T field1; 
} 

class B extends A<String> { 
    public char field1; 

    public static void main(String[] args) { 
     A a = new B(); 
     a.field1 = 12442; 
    } 
} 

viene eseguito senza alcuna eccezione, se campo1 overrided, dovrebbe sollevare un'eccezione, ma non è così

e anche questo viene eseguito senza alcuna eccezione

class A<T> { 
    protected T field1; 
} 

class B extends A<Character> { 
    public char field1; 

    public static void main(String[] args) { 
     A a = new B(); 
     a.field1 = 12442; 
    } 
} 

E 'impossibile

0

linguaggio Java (JLS) non lo consente, ma il bytecode Java (JVM) fa

Oracle JDK 1.8.0_45 si basa anche su di esso per implementare assert. Ad esempio:

public class Assert { 
    static final int[] $assertionsDisabled = new int[0]; 
    public static void main(String[] args) { 
     System.out.println(int.length); 
     assert System.currentTimeMillis() == 0L; 
    } 
} 

genera due Oracle JDK 1.8.0_45, uno esplicito (int[]) e quello sintetico (bool), ed è felicemente grado di distinguere tra loro. Ma se avessimo dichiarato:

static final boolean $assertionsDisabled = false; 

sarebbe riuscire a compilare con:

the symbol $assertionsDisabled conflicts with a compile synthesized symbo 

Vedere https://stackoverflow.com/a/31355548/895245 per maggiori dettagli.

Possibile ragione perché non è possibile

Il problema è che non sarebbe stato possibile determinare il tipo di campo. Considerare:

void f(int i) { System.out.println("int"); } 
void f(float i) { System.out.println("float"); } 
int i; 
float i; 
// Which overridden method is called? 
void m() { f(i); } 
Problemi correlati