clase final
La clase final no puede ser heredada. Al mismo tiempo, una vez que la clase se modifica con final, significa que todos los métodos en la clase final se especifican implícitamente como métodos finales.
Método final
Durante el proceso de herencia de clase, la subclase no puede modificarse o sobrescribirse para el método final en la clase principal.
Todos los métodos privados se especifican implícitamente como métodos finales.
Hay dos razones para usar el método final:
variable final
La palabra clave final es el método más utilizado para modificar las variables. Si se modifican las variables de los miembros, se debe inicializar en el momento de la definición o en el constructor, y no se puede hacer una asignación después de la inicialización.
Hay diferentes significados para tipos básicos y objetos de clase:
El campo final estático se llama constante de período de compilación y generalmente se capitaliza.
Ejemplo
class glyph {void draw () {system.out.println ("glyph.draw ()"); } Glyph () {system.out.println ("glyph () antes de dibujo ()"); dibujar(); System.out.println ("glyph () después de dibujar ()"); }} clase RoundGlyph extiende Glyph {private int redius = 1; RoundGlyph (int r) {radio = r; System.out.println ("RoundGlyph.RoundGlyph (), radio =" + radio); } void dibujo () {system.out.println ("roundglyph.draw (), radio =" + radio); }} clase pública rolyConstructors {public static void main (string [] args) {new RoundGlyph (5); }} Resultado de salida:
Glyph () antes de dibujar () roundglyph.draw (), radio = 0glyph () después de dibujar () roundglyph.roundglyph (), radio = 5
El código anterior muestra el proceso de inicialización de clase y los problemas catastróficos ocultos.
La función principal llama al constructor RoundGlyph con el parámetro 5 para crear un objeto RoundGlyph, y se llama al constructor RoundGlyph de su glifo de clase principal antes de ejecutar el constructor degglyph.
Sin embargo, el método de dibujo se llama en el constructor del glifo de la clase principal. Debido al polimorfismo, se llama en realidad el método de dibujo de la subclase. Sin embargo, el Redius de la subclase no se ha inicializado a través del constructor en este momento, por lo que la salida es:
RoundGlyph.Draw (), radio = 0
Obviamente, este no es el resultado que queremos, por lo que es importante tener en cuenta:
La segunda razón es que final no aplicará el polimorfismo, por lo que se puede garantizar que se llama el método correspondiente del objeto actual, en lugar del método de anulación de la subclase que no se ha realizado en el trabajo de inicialización.
Resume el método de asignación de memoria de final:
1. Modificar variables:
En términos generales, hay tres lugares donde se pueden asignar variables finales: asignación directa, en el constructor o en el bloque de inicialización.
(1) Inicialización:
Dado que la declaración y la inicialización están asociadas con la sintaxis de Java,
Es decir: si no muestra una variable de inicialización, el sistema lo inicializará automáticamente con un valor predeterminado. (Si int es 0)
Para las variables finales, si no asigna valores cuando se declara, el sistema predetermina a este un campo en blanco, que se inicializa en el constructor.
Si es estático, puede inicializar el bloque.
(2) Memoria:
Los métodos de procesamiento de constantes (variables finales) y variables no final son diferentes.
Cuando cada tipo usa una constante, copiará una copia en su propio grupo constante.
Las constantes también se almacenan en el área del método como variables de clase (estáticas), pero se almacenan en la piscina constante.
(Probablemente, las variables de clase son compartidas por todas las instancias, mientras que los grupos constantes son exclusivos de cada instancia).
2. Método de modificación:
Se guarda en el área del método y puede ser reemplazado directamente por el código de función sin esperar hasta que la ejecución decida qué función es específica.
3. Categoría de modificación:
Ahorre en el área del método.