Appena iniziato a utilizzare Java. Trovo molte somiglianze con .NET, ma vedo che tutti i metodi in Java sono virtuali di default. Quindi la domanda è: cosa posso fare per renderli non virtuali? La parola chiave final
è la soluzione giusta e giusta?Metodi non virtuali in Java
risposta
Sì, o privato
Ma 'private' - proprio come in .net - rende il metodo non disponibile per le altre classi da chiamare, oltre a impedire l'override. –
Ma cosa posso fare quando ho bisogno di avere un metodo in classe figlio con lo stesso nome che è nella classe genitore. In C# c'è una parola chiave nuova per questi casi ... c'è qualcosa di simile in Java. – NixDev
no, niente del tutto –
Invece di definire tutti i metodi come finale, è anche possibile definire l'intera classe come definitiva. Non sto dicendo se questo stile buono o cattivo.
Se si mira a rendere il metodo non virtuale per le prestazioni, lasciare che la JIT gestisca tale problema finché non si ha la prova che non lo sta facendo.
Se il motivo per rendere il metodo non-virtuale è poterlo definire in una sottoclasse ma non coinvolge il polimorfismo, probabilmente stai creando sottoclassi senza un vero motivo (inserisci più codice se vuoi contestare questo).
Se è per il design, suggerirei di fare la finale di classe invece dei singoli metodi se possibile. IDEA ha buone ispezioni per il design della classe. Cerca di non ascoltare troppo da vicino chi vuole che tu lasci tutto aperto in modo che possano sottoclasse per incappare in bug o limitazioni; ti urlano ancora più forte quando rompi accidentalmente la loro sottoclasse.
Fornire un modo per i clienti di aggiungere i propri tipi anziché la propria sottoclasse e probabilmente non si accorgeranno nemmeno che le classi sono definitive.
Rendilo statico.
Se si chiama un metodo non virtuale, si desidera sapere dal proprio codice quale metodo di classe si sta chiamando. Il difetto di .net è che non puoi saperlo dal tuo codice.
Esempio
In Java se si definisce come ClassB
public class ClassB extends ClassA {
@Override
public void run() {
}
}
ed oggetto
ClassA obj=new ClassB();
Se si chiama obj.run() come si può sapere se il codice è seguendo le regole del principio polimorfico di apertura/chiusura o codificherà il metodo relativo a ClassA? In Java saprai che c'è sempre il polimorfismo. È più facile creare mock ed è più facile estendere le classi e seguire il principio di sostituzione di Liskov.
Sui metodi statici invece sono delimitate a una classe così se si desidera chiamare un metodo che è legato al ClasseA è possibile definire che metodo come questo:
public static run(ClassA obj)
e si può chiamare con
ClassB obj=new ClassB();
ClassA.run(obj);
e dal codice si saprà che il metodo che si sta chiamando è definito in ClasseA e non in ClasseB.
No. Non rendere statico un metodo quando appartiene all'oggetto. Questo è davvero pessimo design. – Cephalopod
- 1. metodi non-virtuali imperative
- 2. Come simulare metodi non virtuali?
- 3. Mocking metodi non virtuali in C#
- 4. Tabelle dei metodi virtuali
- 5. I metodi astratti sono virtuali?
- 6. virtuali Metodi di estensione nel prossimo Java 8 rilascio
- 7. metodi virtuali e classi template
- 8. Come funzionano i metodi virtuali in C#?
- 9. Perché dobbiamo dichiarare metodi virtuali come tali
- 10. questo. vs base. per metodi non virtuali protetti ereditati?
- 11. No RTTI ma metodi ancora virtuali
- 12. Metodi statici C# virtuali (o astratti)
- 13. Interfaccia, astratto o solo metodi virtuali?
- 14. Differenza tra metodi virtuali e astratte
- 15. Design C#: perché è necessario/override obbligatorio sui metodi astratti ma non sui metodi virtuali?
- 16. Perché l'istruzione callvirt IL causa invocazione ricorsiva in metodi virtuali?
- 17. Classi astratte (con metodi virtuali puri) in Cython
- 18. WHY i metodi virtuali devono essere esplicitamente ignorati in C#?
- 19. I metodi che implementano metodi virtuali puri di una classe di interfaccia devono essere dichiarati anche virtuali?
- 20. Confronto: metodi di interfaccia vs metodi virtuali rispetto a metodi astratti
- 21. Perché le funzioni virtuali in C++ sono chiamate "virtuali"?
- 22. non possono essere 'virtuali'
- 23. metodi virtuali Quando si esegue il un'istanza di una classe
- 24. Mocking di metodi non virtuali in C++ senza modificare il codice di produzione?
- 25. Il riordino dei metodi pubblici non virtuali in un ABI di interruzione di classe autonomo?
- 26. Reticolo C++ 11 con basi miste virtuali e non virtuali?
- 27. Qual è la differenza tra metodi dinamici e virtuali?
- 28. Calling più metodi in Java
- 29. Chiamare magicamente metodi in Java
- 30. Metodi multipli main() in java
http://download.oracle.com/javase/tutorial/java/IandI/final.html –
Indovina cosa, ho trovato in 'C# .NET' un sacco di somiglianze con' JAVA' ... come ho alcune somiglianze con mio padre ... –
@Garis Non riesci a ottenere il tuo punto ... Come è collegato alla domanda? – NixDev