Fundamentos de Java
7-3:
Modificador estático y clases anidadas
Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados.
Objetivos
Esta lección abarca los siguientes temas:
• Creación de variables estáticas.
• Uso de variables estáticas.
• Creación de métodos estáticos.
• Uso de métodos estáticos.
• Creación de clases estáticas.
• Uso de clases estáticas.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 3
Modificador estático y clases anidadas
Modificador estático
• Mediante el uso de variables de instancia, cada instancia de
una clase creada con la palabra clave nueva crea una copia
de todas las variables de instancia en esa clase.
• Por ejemplo, en la clase Empleado que figura más adelante,
se crea una copia exclusiva del apellido y primer nombre
para cada nuevo objeto Empleado que se cree en una clase
de controlador.
public class Employee{
private String lastname;
private String firstname;
...more code
}
//create two Employees in a main method:
Employee e1 = new Employee("Smith", "Mary");
Employee e2 = new Employee("Jones", "Sally");
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 4
Modificador estático y clases anidadas
Palabra clave estático
• Estático es una palabra clave en Java que modifica la
asociación de un elemento con una clase.
• El contenido de una clase que se identifica como
estático se comparte en todas las instancias de la clase.
• Esto significa que todas las instancias de esa clase
comparten una copia de los elementos estáticos y cada
una posee su propias copias exclusivas de elementos de
instancia o elementos no estáticos.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 5
Modificador estático y clases anidadas
Ejemplo de estáticos
• Considere la inicialización de un String estático con el
valor “Oracle” denominado myCompany, que
representa a la empresa del empleador.
• Cada instancia de Empleado tendrá todavía sus
variables de instancia exclusivas, pero compartirá la
variable estática.
e1 e2
Variable de instancia Variables estáticas Variable de instancia
Mary Smith Oracle Sally Jones
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 6
Modificador estático y clases anidadas
Variables estáticas
• Variables estáticas
• Conocidas también como variables de clases.
• Se declaran con la palabra clave estática.
• Tienen solamente una copia en la memoria, a diferencia
de las variables de instancia, que conservan una copia
por instancia.
• Se comparten mediante instancias de objetos.
• Conservan el mismo valor para todas las instancias de
clase.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 7
Modificador estático y clases anidadas
Variables estáticas
• Acceso público para variables estáticas:
– Si el acceso es público, pueden ser modificadas directamente
por otras clases.
– Considere convertir a la variable en constante mediante el uso
de la palabra clave final, a fin de evitar modificaciones.
– Ejemplo:
public static final int MODEL_NUM = 883;
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 8
Modificador estático y clases anidadas
Programación de prácticas y variables
estáticas
• En programación se recomienda inicializar a las
variables estáticas con valores, en lugar de confiar en
los valores predeterminados nulo y 0.
• Los valores inicialmente asignados se pueden cambiar
en la medida en que la clase se encuentre activa en la
memoria de JVM.
• La recolección de elementos no utilizados los elimina de
la memoria y los valores iniciales asignados aparecen
nuevamente la próxima vez que la utilice.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 9
Modificador estático y clases anidadas
Declaración de una variable estática
• Para declarar una variable estática, incluya la palabra clave
estática, como se indica a continuación.
• Puede ser pública, protegida, predeterminada o privada.
• Deberá tener valores asignados, pero automáticamente se le
asignan valores nulos para las instancias de clase: un String vacío
o 0 para números primitivos.
• Deberán actuar como constantes con la palabra clave final
cuando usan un acceso público, protegido o predeterminado.
public class Nesting {
// Declare public static variable.
public static final int MODEL_NUM = 883;
...
}
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 10
Modificador estático y clases anidadas
Cambios a una variable estática
• Las variables estáticas que no sean finales se pueden
leer o se les pueden asignar nuevos valores mediante el
uso de la palabra clave this en los métodos de instancia.
• Los cambios realizados por métodos de instancia se
cambian para todas las instancias.
• Un cambio a una variable estática puede indicar que la
clase deberá estar limitada a un solo objeto.
• Se conoce como el ...
private static String myCompany = "Oracle";
patrón Singleton. public void setMyCompany(String s) {
this.mycompany = s;
}
...
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 11
Modificador estático y clases anidadas
Ejemplo de variables estáticas
• Crear una clase denominada Tortuga que contenga una
variable denominada alimento.
• Esta variable es estática dado que todas nuestras
tortugas comen el mismo alimento.
public class Turtle {
public static String food = "Turtle Food";
private int age;
public Turtle(int age){
this.age = age;
}
}
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 12
Modificador estático y clases anidadas
Ejemplo de variables estáticas
• La clase Tortuga incluirá otra variable más, denominada
edad.
• Dado que cada tortuga tiene una edad diferente, se
recomienda convertir a esta variable en una variable de
instancia privada en lugar de una variable estática.
public class Turtle {
public static String food = "Turtle Food";
private int age;
public Turtle(int age){
this.age = age;
}
}
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 13
Modificador estático y clases anidadas
Acceso a las variables estáticas
• Las variables de instancia requieren que exista una instancia
para una clase antes de permitir el acceso.
public class Turtle {
public static String food = "Turtle Feed";
private int age;
...
}
• Usted puede acceder a las variables estáticas sin crear una
instancia para una clase.
• En un método main, esta sentencia imprimiría la variable
alimento sin ninguna referencia a la instancia.
System.out.println("I feed " + Turtle.food + " to all of my turtles!");
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 14
Modificador estático y clases anidadas
Notación para acceder a variables estáticas
• En general, se accede a las variables estáticas mediante
la notación:
ClassName.variableName;
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 15
Modificador estático y clases anidadas
Modificador y métodos estáticos
• Los métodos estáticos o de clase existen una sola vez y
se comparten entre todas las instancias de clase.
• Pueden ser utilizados por otros métodos de clase o
métodos de instancia según su modificador de acceso.
• No pueden acceder a las variables no estáticas o de
instancia. Los métodos estáticos pueden acceder
únicamente a las variables estáticas.
• No pueden acceder a los métodos no estáticos o de
instancia. Los métodos estáticos pueden acceder
únicamente a otros métodos estáticos.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 16
Modificador estático y clases anidadas
Modificador y métodos estáticos
• Se pueden redefinir en subclases.
• Pueden ser públicos, protegidos, predeterminados o
privados.
• La invocación de un método de instancia es diferente
con relación al método de clase (estático).
• Por ejemplo, primero debe crear una instancia y luego
usar una notación de puntos para invocar a un método
de instancia; mientras que, el nombre de la clase, la
notación de puntos y el nombre del método estático
invocan a un método estático.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 17
Modificador estático y clases anidadas
Modificador y métodos estáticos
• El método estático incluye un contenedor para construir
una instancia de una clase.
• Cuando la clase tiene un constructor de acceso privado,
el método estático es uno de los dos enfoques
utilizados para crear una instancia de esa clase.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 18
Modificador estático y clases anidadas
Ejemplo de la clase Tortuga
• La clase Tortuga tiene una variable estática que identifica a la
cantidad de tanques que tenemos disponibles (numTanks) y una
variable de instancia (tankNum) que nos indica en qué tanque se
encuentra la tortuga.
public class Turtle {
public static String food = "Turtle Feed"; Variable tankNum
public int age;
public int tankNum;
public static int numTanks = 3;
public Turtle(int age){ Variable numTanks
this.age = age;
tankNum = (int)((Math.random()*numTanks)+1);
}
public void swim(){//implementation}
public int getAge(){return age;}
public int getTankOfResidence(){return tankNum;}
public static String fishTank() {return "I have " + numTanks + " fish tanks.";
}
}
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 19
Modificador estático y clases anidadas
Métodos estáticos en el ejemplo de la clase
Tortuga
• Revisar los métodos en la clase Tortuga.
public class Turtle {
public static String food = "Turtle Feed";
public int age;
public int tankNum; swim() es un método de
public static int numTanks = 3;
public Turtle(int age){ instancia. Aunque cada tortuga
this.age = age; puede nadar, pueden hacerlo
tankNum = (int)((Math.random()*numTanks)+1); de diferente manera según su
}
public void swim(){//implementation} edad.
public int getAge(){return age;}
public int getTankOfResidence(){return tankNum;}
public static String fishTank() {return "I have " + numTanks + " fish tanks.";
}
} getAge() y getTankOfResidence() son métodos de
fishTank() es un método instancia no estáticos porque acceden a variables
estáticoestática y accede a una no estáticas. Los métodos estáticos no pueden
variable (numTanks). acceder a los elementos no estáticos.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 20
Modificador estático y clases anidadas
Creación de instancias de clases utilizando
métodos estáticos
• Los métodos estáticos también se utilizan para crear
instancias de clases cuando el acceso del constructor de
la clase es privado y el método es parte de la misma
clase.
• Esto es posible porque se accede públicamente al
método estático con acceso privado a la clase.
...
private Nesting() {…implementation…}
...
public static Nesting getInstance() {
Nesting nesting = new Nesting();
return nesting; }
...
// Instantiate a private class with a method.
Nesting n1 = Nesting.getInstance();
...
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 21
Modificador estático y clases anidadas
Modificador y clases estáticos
• Las clases estáticas o anidadas:
– Pueden existir como clases anidadas.
– No pueden existir como clases independientes.
Una clase anidada es una clase creada
dentro de otra clase.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 22
Modificador estático y clases anidadas
Clases anidadas estáticas
• Las clases estáticas se implementan dentro de otras
clases y las otras clases se denominan clases
contenedoras.
• Pueden extender el comportamiento de la clase
contenedora.
• Se pueden sobrecargar como los constructores
comunes.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 23
Modificador estático y clases anidadas
Clases anidadas estáticas
• La clase anidada estática también proporciona los
medios para crear una instancia en una clase
contenedora cuando su constructor está configurado
con acceso privado.
• Esta es la segunda manera en que se puede crear una
instancia de una clase que posee un calificador de
acceso restringido o privado para sus constructores de
clase.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 24
Modificador estático y clases anidadas
Ejemplo de clases anidadas estáticas
public class Space {
//Space class variables
public static class Planet{
//planet class variables and constructors
public Planet() {...implementation...}
public Planet(String name, int size)
{...implementation...}
}
//more space class implementation
}
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 25
Modificador estático y clases anidadas
Terminología
Los términos clave usados en esta lección son los siguientes:
• Método de clases
• Variable de clases
• Clase interior
• Nested class
• Modificador estático
• Método estático
• Clase anidada estática
• Variable estática
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 26
Modificador estático y clases anidadas
Resumen
En esta lección, habrá aprendido a:
• Crear variables estáticas.
• Usar variables estáticas.
• Crear métodos estáticos.
• Usar métodos estáticos.
• Crear clases estáticas.
• Usar clases estáticas.
JF 7-3 Copyright © 2019, Oracle y/o sus filiales. Todos los derechos reservados. 27
Modificador estático y clases anidadas