Sin embargo, desde dicho método main() sí que se podría acceder a la variable contador2 ya que esta sí que es estática (static), es decir, de clase.
Lo que obtendríamos de compilar dicha clase es:
>Lampara.java: non-static variable contador1 cannot be referenced from a static context contador1++; ^ 1 error
Sin embargo, todos los demás sí que tienen sentido, incluso el que se conoce como inicializador estático de la Clase que precisamente, sirve para ejecutar código de inicialización a nivel de Clase antes de cargar dicha clase en memoria y antes de que se instancien los objetos de dicha Clase. Estos inicializadores estáticos tienen el siguiente aspecto:
public class Clase { // inicializador estático static { // código de la inicialización estática... } // Atributo estático de la clase static int variableEstática; // Método estático de la clase public static void metodoEstatico() { // código del método estático..... } }
NOTA: Esta forma de programar el código del método main(), aunque parezca rápida y efectiva, suele dar problemas a la hora de depurar programas, por lo que se recomienda no abusar de ella. El ahorro de número de líneas de código suele tener como consecuencia un código menos "legible" y "depurable".
NOTA:También pueden compactarse los directorios que contienen los ficheros .class de las clases para conseguir una mejor "encapsulación" del código y "optimización" de los recursos del sistema. Para ello, se pueden usar un fichero JAR (en este caso podría ser el fichero tsirda.jar) que comprimiría dicho subdirectorio de las clases edu/uc3m/it/tsirda. Lo que hay que tener presente en el caso de usar un fichero JAR como librería de clases es NO OLVIDARSE DE ACTUALIZAR LA VARIABLE CLASSPATH DEL SISTEMA CON DICHO FICHERO .JAR (en este caso, habría que actualizar la variable CLASSPATH con la ruta que apunta al fichero tsirda.jar) .
- Clase a clase, como en el siguiente ejemplo:
import java.util.Vector; ... Vector notas= new Vector();
- Todas las clases del paquete, como en el ejemplo siguiente:
import java.util.*; ... Vector notas= new Vector();
NOTA: Se suele recomendar la primera forma de realizar la importación de clases, es decir, clase a clase, ya que suele ser más eficiente a la hora de gestionar los recursos en tiempo de ejecución del programa.
Para solucionar esta cuestión, habría que crear dos ficheros, Punto.java y Linea.java que implementarían las respectivas clases de la libreria de gráficos. La anterior afirmación no implica que en un fichero .java puedan existir varias clases, sin embargo, las que no se declaren como públicas no serán visibles o accesibles desde el código de los programas.
Soy un atributo privado de la clase ClaseDelPaqueteAcceso: 1 Soy un atributo de paquete de la clase ClaseDelPaqueteAcceso: 2 Soy un atributo protegido de la clase ClaseDelPaqueteAcceso: 3 Soy un atributo público de la clase ClaseDelPaqueteAcceso: 4 Soy un método privado de la clase ClaseDelPaqueteAcceso. Soy un método de paquete de la clase ClaseDelPaqueteAcceso. Soy un método protegido de la clase ClaseDelPaqueteAcceso. Soy un método público de la clase ClaseDelPaqueteAcceso.
RECUERDA: Los derechos de acceso a los miembros de una clase determinan QUÉ CLASES TIENEN ACCESO A DICHOS MIEMBROS Y NO QUé INSTANCIAS DE LAS MISMAS.
Así, por ejemplo, un objeto de la clase ClaseDelPaqueteAcceso tendría acceso a los miembros privados de otro objeto de la misma clase. Por ejemplo, podríamos haber implementado un método de comparación de objetos de la clase ClaseDelPaqueteAcceso tal y como sigue:
public boolean esIgualA( ClaseDelPaqueteAcceso otroObjeto ) { if (this.privado == otroObjeto.privado) { return true; } else { return false; }
OtraClaseDePaqueteAcceso.java: metodoPrivado() has private access in acceso.ClaseDePaqueteAcceso a.metodoPrivado(); ^ OtraClaseDePaqueteAcceso.java: privado has private access in acceso.ClaseDePaqueteAcceso System.out.println("Soy el atributo privado de la ClaseDePaqueteAcceso: " + a.privado); ^ 2 errors
Para ejecutar el código anterior hay que comentar las siguientes líneas de código:
public class OtraClaseDelPaqueteAcceso { public static void main(String[] args) { ClaseDelPaqueteAcceso a = new ClaseDelPaqueteAcceso(); // RECUERDA QUE LOS MODIFICADORES DE ACCESO SON A NIVEL DE CLASE, NO DE OBJETO //System.out.println("Soy el atributo privado de la ClaseDePaqueteAcceso: " + a.privado); System.out.println("Soy el atributo de paquete de la ClaseDePaqueteAcceso: " + a.paquete); System.out.println("Soy el atributo protegido de la ClaseDePaqueteAcceso: " + a.protegido); System.out.println("Soy el atributo público de la ClaseDePaqueteAcceso: " + a.publico); // RECUERDA QUE LOS MODIFICADORES DE ACCESO SON A NIVEL DE CLASE, NO DE OBJETO //a.metodoPrivado(); a.metodoDePaquete(); a.metodoProtegido(); a.metodoPublico(); } }
Y el resultado por pantalla sería:
Soy el atributo de paquete de la ClaseDePaqueteAcceso: 2 Soy el atributo protegido de la ClaseDePaqueteAcceso: 3 Soy el atributo público de la ClaseDePaqueteAcceso: 4 Soy un método de paquete de la clase ClaseDelPaqueteAcceso. Soy un método protegido de la clase ClaseDelPaqueteAcceso. Soy un método público de la clase ClaseDelPaqueteAcceso.