Modificadores de acceso
Modificadores de acceso: PUBLIC, PRIVATE, PROTECTED, DEFAULT
Los modificadores de acceso indican el nivel de accesibilidad que tendrá un miembro o un tipo desde otros miembros que lo referencien. Existen cuatro modificadores de acceso en Java.
-public: indica que se puede acceder a él desde cualquier punto.
-protected: permite acceder a los miembros protected de una clase base a través de los miembros de esa clase base y de los miembros de sus clases derivadas. Se puede combinar con internal.
-private: indica que sólo pueden acceder a él integrantes de la misma clase. Es el modificador por defecto si no se especifica uno.
-default: Java nos da la opción de no usar un modificador de acceso y al no hacerlo, el elemento tendrá un acceso conocido como default o acceso por defecto que permite que tanto la propia clase como las clases del mismo paquete accedan a dichos componentes (de aquí la importancia de declararle siempre un paquete a nuestras clases).
Modificadores de clases y métodos: STATIC, FINAL, ABSTRACT
-final (constante): declara un campo al que sólo se le puede asignar un valor como parte de la declaración o en un constructor de la misma clase.
-final (método): no puede ser redefinido por una subclase.
-final (class): una clase final es una clase que no puede ser extendida, es decir ninguna otra clase puede ser hija de ésta, será entonces una clase única y que no tendrá herencia o herederos al no poder ser extendida.
-abstract: indica que la clase sólo se usará para ser la base de otras clases.
-static: declara un miembro (método o campo) que pertenece a la clase y no a una instancia de ésta.
-static (variable de instancia): Si se aplica a una variable de instancia esta conserva y comparte el mismo valor en todas las instancias de la clase.
-static (método): Si se aplica a un método este es accesible sin instanciar la clase.
Modificadores de acceso para clases
Cuando creamos una clase podemos usar los siguientes modificadores de acceso:
-public: cualquiera puede acceder a ella (instanciarse, heredarse, etc).
-default (ninguno): sólo pueden acceder a ella desde el mismo package.
Modificadores para herencia (se pueden combinar con los anteriores)
-final: la clase no puede ser heredada (no puede tener subclases). Se puede combinar con public.
-abstract: la clase no puede ser instanciada. Se puede combinar con public.
La clase no puede ser private ya que no podría accederse a ella.
Una clase no puede ser abstract y final al mismo tiempo.
Modificadores de acceso para variables de instancia
-public: se puede acceder desde cualquier otra parte del programa.
-protected: sólo puede accederse desde el mismo package u otras subclases.
-default (ninguno): sólo puede accederse desde el mismo package.
-private: sólo puede accederse desde la misma clase. En el caso de la herencia se puede acceder a una variable de instancia a través de sus métodos (setters, getters) públicos.
Modificadores para herencia (se pueden combinar con public, protected, default y private)
-final: convierte la variable en una constante. Se puede iniciar cuando se declara o desde el constructor.
-abstract: se utiliza para indicar que la clase no se puede instanciar y sólo será heredada.
Otros modificadores (se pueden combinar con public, protected, default y private)
-static: la variable pasa a tener ámbito de clase (y no de objeto o instancia). Una variable static es única para todas las instancias de ese objeto y su valor se comparte.
Una variable no puede ser abstract por que para tener esa variable habría que instanciar el objeto.
Modificadores de acceso para métodos
-public: se puede acceder desde cualquier otra parte del programa.
-protected: sólo puede accederse desde el mismo package u otras subclases.
-default (ninguno): sólo puede accederse desde el mismo package.
-private: sólo puede accederse desde la misma clase.
Modificadores para herencia (se pueden combinar con public, protected, default y private):
-final: hace que el método no pueda sobreescribirse en una subclase.
-abstract: se utiliza para indicar que el método no será implementado y será heredado en una subclase (donde deberá ser implementado o la subclase deberá ser, también, abstracta). Si una clase contiene un método abstracto debe ser abstracta.
Otros modificadores (se pueden combinar con public, protected, default y private):
-static: el método puede ser llamado sin instanciar la clase. Un método static sólo puede acceder a variables y métodos static.
Modificadores de acceso para variables locales
-final: convierte la variable en una constante. Si creamos una constante que referencie a un objeto lo que es final es la constante, es decir, que no podemos asignarle otra referencia. El objeto en sí puede cambiar.
No pueden aplicarse los modificadores de acceso a las variables locales. No encontraremos ningún caso en el que un modificador de acceso sea aplicado a una variable local. Cualquier variable local declarada con un modificador de acceso no compilará. Solo hay un modificador que puede ser aplicado a las variables locales, y es final.
Modificadores de acceso para interfaces
Una interfaz es un tipo de dato abstracto, similar a una clase, que define una lista de métodos public abstract que cualquier clase que implemente a la interfaz debe implementar. Una interfaz también puede incluir constantes public static final, métodos default y métodos static.
El compilador automáticamente añade public a todos los métodos de la interfaz y abstract a todos los métodos no-static y no-default.
Si una interfaz sólo tiene un método public abstract es una interfaz funcional (puede tener uno o más métodos default).
Una interfaz puede implementar métodos siempre y cuando incluya el modificador default.
Mecanismos de sincronización: VOLATILE y SYNCRHONIZED.
-volatile: indica que un campo puede ser modificado en el programa por el S.O., el hardware o un hilo concurrente en ejecución.
-synchronized: En caso de que necesitemos atomicidad podemos recurrir a synchronized o a cosas más avanzadas, como las clases del API java.util.concurrent de Java 5. synchronized se diferencia de volatile entre otras cosas en que este modificador se utiliza sobre bloques de código y métodos, y no sobre variables. Al utilizar synchronized sobre un bloque se añade entre paréntesis una referencia a un objeto que utilizaremos a modo de lock.
Ejemplos con métodos:
public static void main(string[] args){}
private int sumar(int, int){}
internal double dividir(double, double){}
protected internal void NombreMetodo(){}
Ejemplos con campos:
final tipo variable = valor;
private final tipo variable = valor; // Variable de sólo lectura. Constructor.