2013-03-10 12 views
6

Fondamentalmente vorrei sapere perché un metodo statico non può essere ombreggiato da un metodo di istanza, (lo so perché, in determinate circostanze porterà ad un'ambiguità), mentre una variabile statica può essere ombreggiata da una variabile di istanza (si applica solo alle sottoclassi).Variabile e metodo shadowing in Java

Esempio:

public class Apartment{ 

    static int area = 10; 

    public static int getArea(){ 
     return area; 
    } 
} 

class BedroomFlat extends Apartment { 

    int area = 10;// no problem at all 

    public int getArea(){ // illegal line it cannot hide the super static method 
     return area; 
    } 
} 

Quindi, se ho cercato di dichiarare int area (variabile di istanza) insieme alla static int area nella classe Super darebbe un errore, ma non avviene quando dichiarato nella sottoclasse anche se il static int area è ancora visibile dalla sottoclasse.

Qual è esattamente la differenza in termini di comportamento tra il tentativo di ombreggiamento di un metodo statico con un metodo di istanza e il tentativo di ombreggiare una variabile statica con una variabile di istanza.

Grazie in anticipo.

+1

possibile duplicato di [Perché Java non consente l'override dei metodi statici?] (Http://stackoverflow.com/questions/ 2223386/why-doesnt-java-allow-overriding-of-static-methods) – Makoto

+0

Capisco perfettamente perché i metodi statici non vengano sovrascritti. Volevo sapere solo perché l'area delle ombre delle istanze (in termini new Bedroom(). A restituirà la variabile di istanza non super statica) mentre per i metodi non può accadere – Rollerball

risposta

1

Nella sottoclasse (BedroomFlat), il compilatore non consente di dichiarare un metodo di istanza con lo stesso nome di quello del metodo statico nella classe base poiché l'override del metodo è applicabile solo ai metodi di istanza. L'estensione di una classe rende solo i metodi di istanza disponibili per la classe secondaria per l'override (e non i metodi di classe, ad esempio statici). Inoltre, quando si tenta di dichiarare un metodo con la stessa firma di un metodo statico, il compilatore genera un errore in cui si afferma che non è possibile sovrascrivere un metodo statico, poiché la sostituzione ha luogo per il metodo di istanza.

Ma il compilatore non ti impedirà di dichiarare una variabile di istanza con lo stesso nome di quella statica di super classe, poiché le variabili non sono i candidati per l'override.

2

Nessuno può ereditare metodi e campi statici perché appartengono alla classe.

Nel tuo caso si è non override getArea(); dai genitori, si sta tentando di creare il metodo con la stessa firma - e porta a errori di compilazione.

+0

Capisco perfettamente perché i metodi statici non vengano sovrascritti. Volevo sapere solo perché l'area delle variabili dell'istanza ombreggia (in termini new Bedroom(). A restituirà la variabile di istanza non il super statico) mentre per i metodi non può accadere – Rollerball

0

La cosa è: Lei non è shadowing nulla qui a tutti ...

tuo variabile di istanza è accessibile direttamente il mio nominarlo e Normalmente si dovrebbe scrivere qualcosa come ClassName.staticVar per accedere a una variabile statica. Java consente solo di omettere il nome della classe quando si fa riferimento a una variabile statica.

Questo lo rende chiaro, vero?

+0

So perché non si compila. diciamo che ho un nuovo BedreoomFlat(). getArea() il compilatore non sa quale getArea scegliere. statico o istanza? entrambi sono accessibili in questo modo. ma per l'area delle variabili di istanza non ci sono problemi anche se l'area delle variabili statiche è visibile, quindi viene visualizzata in grigio. – Rollerball

0

In Java i metodi e i campi statici appartengono solo alla classe, quindi non possono essere ereditati dagli oggetti o comportano errori di compilazione.

0

sappiamo che il bambino eredita il genitore, ma sappiamo anche che i metodi statici non possono essere sovrascritti. Quindi in questo caso avresti due metodi nel bambino con la stessa firma del metodo. Ciò creerà il problema in quanto java non supporta due metodi della stessa firma, sebbene qui un metodo sia statico e un altro non statico. ma per variabili statiche questo non è il caso.

+0

Questo è il punto, se un metodo punta alla Classe e un altro metodo punta all'istanza. perché dovrebbe creare un conflitto? Non è la stessa logica con static int area = 10 e int area = 10? Qual è la differenza perché non è il caso? – Rollerball

0

La mia ipotesi è che questo dia qualche problema al polimorfismo (o almeno a come è implementato). Diciamo che fai qualcosa di simile a questo Apartment x = new BedroomFlat();.Chiamando il metodo getArea(), non sa se si tratta di un metodo nascosto o sovrascritto, perché se è nascosto (statico) dovrebbe chiamare quello della classe Apartment, ma se è sovrascritto dovrebbe chiamare quello di istanza.

Naturalmente, di solito questi casi devono essere evitati (danno mal di testa inutili).

MODIFICA: ho trovato questo collegamento, in cui nella parte inferiore della pagina è possibile vedere la tabella del metodo che nasconde/sovrascrive tra i metodi statici e di istanza. Idk perché è così com'è, ma almeno sappiamo che è scritto da qualche parte (https://docs.oracle.com/javase/tutorial/java/IandI/override.html)

Problemi correlati