Java Language
Visibilidad (control de acceso a los miembros de una clase)
Buscar..
Sintaxis
- nombre de tipo público [= valor];
- nombre de tipo privado [= valor];
- nombre de tipo protegido [= valor];
- escriba nombre [= valor];
- nombre de la clase pública {
- nombre de la clase{
Observaciones
Desde el tutorial de Java :
Los modificadores de nivel de acceso determinan si otras clases pueden usar un campo en particular o invocar un método en particular. Hay dos niveles de control de acceso:
- En el nivel superior:
public
o paquete privado (sin modificador explícito). - A nivel de miembro:
public
,private
,protected
o paquete privado (sin modificador explícito).
Una clase puede ser declarada con el modificador public
, en cuyo caso esa clase es visible para todas las clases en cualquier lugar. Si una clase no tiene modificador (el valor predeterminado, también conocido como paquete-privado ), es visible solo dentro de su propio paquete.
En el nivel de miembro, también puede usar el modificador public
o ningún modificador ( paquete-privado ) al igual que con las clases de nivel superior, y con el mismo significado. Para los miembros, hay dos modificadores de acceso adicionales: private
y protected
. El modificador private
especifica que solo se puede acceder al miembro en su propia clase. El modificador protected
especifica que solo se puede acceder al miembro dentro de su propio paquete (como con el paquete privado ) y, además, mediante una subclase de su clase en otro paquete.
La siguiente tabla muestra el acceso a los miembros permitido por cada modificador.
Niveles de acceso:
Modificador | Clase | Paquete | Subclase | Mundo |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | norte |
sin modificador | Y | Y | norte | norte |
private | Y | norte | norte | norte |
Miembros de la interfaz
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
Los miembros de la interfaz siempre tienen visibilidad pública, incluso si se omite public
palabra clave public
. Entonces, tanto foo()
, bar()
, TEXT
, ANSWER
, X
e Y
tienen visibilidad pública. Sin embargo, el acceso aún puede estar limitado por la interfaz que contiene, ya que MyInterface
tiene visibilidad pública, se puede acceder a sus miembros desde cualquier lugar, pero si MyInterface
hubiera tenido visibilidad del paquete, sus miembros solo serían accesibles desde el mismo paquete.
Visibilidad pública
Visible para la clase, paquete y subclase.
Veamos un ejemplo con la prueba de clase.
public class Test{
public int number = 2;
public Test(){
}
}
Ahora intentemos crear una instancia de la clase. En este ejemplo, podemos acceder al number
porque es public
.
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
Visibilidad privada
private
visibilidad private
permite que una variable solo sea accesible por su clase. A menudo se utilizan en conjunto con captadores y setters public
.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
Visibilidad del paquete
Sin modificador , el valor predeterminado es la visibilidad del paquete. De la documentación de Java, "[visibilidad del paquete] indica si las clases en el mismo paquete que la clase (independientemente de su origen) tienen acceso al miembro". En este ejemplo de javax.swing
,
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
está en el mismo paquete, por lo que DEBUG_GRAPHICS_LOADED
es accesible.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
Este artículo da algunos antecedentes sobre el tema.
Visibilidad Protegida
Causas de visibilidad protegida significa que este miembro es visible para su paquete, junto con cualquiera de sus subclases.
Como ejemplo:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
Ahora extenderemos esta clase e intentaremos acceder a uno de sus miembros protected
.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
También podría acceder a un miembro protected
sin extenderlo si accede desde el mismo paquete.
Tenga en cuenta que este modificador solo funciona en miembros de una clase, no en la clase en sí.
Resumen de los Modificadores de Acceso de los Miembros de la Clase
Modificador de acceso | Visibilidad | Herencia |
---|---|---|
Privado | Solo clase | No puede ser heredado |
Sin modificador / paquete | En paquete | Disponible si subclase en paquete |
Protegido | En paquete | Disponible en subclase |
Público | En todos lados | Disponible en subclase |
Hubo una vez un modificador private protected
(ambas palabras clave a la vez) que podría aplicarse a métodos o variables para hacerlos accesibles desde una subclase fuera del paquete, pero hacerlos privados a las clases en ese paquete. Sin embargo, esto fue eliminado en la versión de Java 1.0 .