Acaba de empezar a usar Java. Encuentro muchas similitudes con .NET, pero veo que todos los métodos en Java son virtuales por defecto. Entonces, la pregunta es: ¿qué puedo hacer para que no sean virtuales? ¿Es la palabra clave final
la solución correcta?Métodos no virtuales en Java
Respuesta
Sí, o privada
Pero 'privado' - al igual que en .net - hace que el método no esté disponible para otras clases para llamar, así como para evitar la anulación. –
Pero, ¿qué puedo hacer cuando necesito tener un método en la clase infantil con el mismo nombre que en la clase principal? En C# hay una palabra clave nueva para tales casos ... ¿hay algo similar en Java? – NixDev
no, nada en absoluto –
En lugar de definir todos los métodos como finales, también se puede definir como toda la clase final. No estoy diciendo si este estilo es bueno o malo.
Si intenta hacer que el método no sea virtual para el rendimiento, permita que el JIT lo solucione hasta que tenga evidencia de que no está funcionando.
Si la razón para hacer que el método no sea virtual es poder definirlo en una subclase pero no involucrar polimorfismo, probablemente estés creando una subclase sin motivo real (publica más código si quieres impugnar este)
Si es por diseño, sugeriría hacer la clase final en lugar de métodos individuales si es posible. IDEA tiene buenas inspecciones para el diseño de clase. Trata de no escuchar demasiado de cerca a aquellos que quieren que dejes todo abierto para que puedan subclase para hackear errores o limitaciones; te gritarán aún más fuerte cuando accidentalmente rompas su subclase.
Proporcione a los clientes la posibilidad de agregar sus propios tipos en lugar de la subclase suya y probablemente ni siquiera noten que sus clases son definitivas.
Hazlo estático.
Si llama a un método no virtual, quiere saber desde su código a qué método de clase está llamando. El defecto de .net es que no puedes saberlo desde tu código.
Ejemplo
En Java si se define como ClassB
public class ClassB extends ClassA {
@Override
public void run() {
}
}
y el objeto
ClassA obj=new ClassB();
Si llama obj.run() ¿cómo saber si ese código es siguiendo las reglas del principio polimórfico de apertura/cierre o codificará el método relacionado con la Clase A? En Java sabrás que siempre hay polimorfismo. Es más fácil hacer burlas y es más fácil extender las clases y seguir el principio de sustitución de Liskov.
En los métodos estáticos otro lado están limitadas a una clase así que si quieres llamar a un método que se relaciona con claseA se puede definir que método como este:
public static run(ClassA obj)
y se le puede llamar con
ClassB obj=new ClassB();
ClassA.run(obj);
y desde el código sabrá que el método que está llamando se define en ClassA y no en ClassB.
No. No hagas un método estático cuando pertenece al objeto. Eso es realmente un mal diseño. – Cephalopod
- 1. Java - Métodos virtuales
- 2. métodos no virtuales Sustitución
- 3. Mocking métodos no virtuales en C#
- 4. falso/simulacro de métodos no virtuales C++
- 5. Tablas de métodos virtuales
- 6. ¿Cómo burlarse de métodos no virtuales?
- 7. métodos virtuales puros C++
- 8. ¿Métodos virtuales puros en C#?
- 9. ¿Todos los métodos en Java son implícitamente virtuales?
- 10. ¿Cómo implementar métodos virtuales en Python?
- 11. ¿Los métodos abstractos son virtuales?
- 12. Anulación de métodos virtuales calificados
- 13. ¿Qué son los métodos virtuales?
- 14. Métodos o eventos virtuales en C#
- 15. Comparación: métodos de interfaz vs métodos virtuales vs métodos abstractos
- 16. ¿Cómo funcionan los métodos virtuales en C#?
- 17. ¿Los métodos que implementan métodos virtuales puros de una clase de interfaz deben declararse también virtuales?
- 18. Rhino: clases de imitación y métodos virtuales no predeterminados
- 19. convención de nombres para los métodos no virtuales y abstractas
- 20. C++ - ¿Uso excesivo de métodos virtuales?
- 21. Alternativa a C++ estática métodos virtuales
- 22. Impacto del rendimiento de los métodos virtuales
- 23. ¿Cuándo es apropiado usar métodos virtuales?
- 24. C# métodos estáticos virtuales (o abstractos)
- 25. métodos virtuales y clases de plantilla
- 26. Clonación clase C++ con métodos virtuales puros
- 27. Interfaz, Resumen o solo métodos virtuales?
- 28. resolución de sobrecarga de métodos virtuales
- 29. ¿Simula objetos en C++ siempre requiere métodos o plantillas virtuales?
- 30. ¿Está bien lanzar una excepción NotImplemented en métodos virtuales?
http://download.oracle.com/javase/tutorial/java/IandI/final.html –
Adivina qué, encontré en 'C# .NET' muchas similitudes con' JAVA' ... como tengo algunas similitudes con mi padre ... –
@Garis No entiendo tu punto ... ¿Cómo está conectado a la pregunta? – NixDev