Visión general de los niveles de acceso
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 10 de 87.
Los modificadores de acceso controlan desde dónde se puede acceder a los campos y métodos. Java tiene cuatro niveles de control de acceso.
| Modificador | Misma clase | Mismo paquete | Subclase | En todos lados |
|---|---|---|---|---|
private | Sí | No | No | No |
| default (sin palabra clave) | Sí | Sí | No | No |
protected | Sí | Sí | Sí | No |
public | Sí | Sí | Sí | Sí |
public class BankAccount {
private double balance; // Solo esta clase
String accountType; // Predeterminado: solo el mismo paquete
protected String owner; // Mismo paquete + subclases
public String bankName; // Accesible desde cualquier lugar
}private es el más restrictivo - úsalo para datos internos que nunca deberían ser accedidos directamente. public es el más abierto - úsalo para métodos que otras clases necesiten llamar.
Cuando no especificas ningún modificador, Java utiliza el acceso default (también llamado package-private). Esto permite el acceso solo dentro del mismo paquete.
class Helper { // Clase con acceso predeterminado
void assist() { } // Método con acceso predeterminado
}Elige el nivel de acceso más restrictivo que aún permita que tu código funcione. Esto protege tus datos y hace que tu código sea más fácil de mantener.
Desafío
FácilVamos a construir un sistema de registro de Student que demuestre cómo los modificadores de acceso controlan la visibilidad a través de diferentes archivos.
Crearás dos archivos para organizar tu código:
Student.java: Define una clase Student con campos que utilicen diferentes niveles de acceso:- Campo
private:studentId(String) - solo accesible dentro de la clase Student - Campo por defecto (sin modificador):
grade(int) - accesible dentro del mismo paquete - Campo
protected:name(String) - accesible en el mismo paquete y subclases - Campo
public:school(String) - accesible en todas partes
publicllamadogetInfo()que devuelva una cadena con el formato:"[studentId] name - Grade grade at school"- Campo
Main.java: Crea un objeto Student y demuestra qué campos pueden ser accedidos directamente desde fuera de la clase. Imprime el camposchooldirectamente, luego imprime el resultado degetInfo()para mostrar toda la información del estudiante.
Recibirás cuatro entradas: studentId, name, grade, y school (en ese orden).
Tu salida debe constar de dos líneas: el nombre de la escuela accedido directamente, seguido de la información completa del estudiante obtenida del método getInfo().
Hoja de referencia
Los modificadores de acceso controlan desde dónde se puede acceder a los campos y métodos. Java tiene cuatro niveles de control de acceso:
| Modificador | Misma Clase | Mismo Paquete | Subclase | En todas partes |
|---|---|---|---|---|
private | Sí | No | No | No |
| default (sin palabra clave) | Sí | Sí | No | No |
protected | Sí | Sí | Sí | No |
public | Sí | Sí | Sí | Sí |
public class BankAccount {
private double balance; // Solo esta clase
String accountType; // Default: solo el mismo paquete
protected String owner; // Mismo paquete + subclases
public String bankName; // Accesible en todas partes
}private es el más restrictivo: úsalo para datos internos a los que nunca se debe acceder directamente. public es el más abierto: úsalo para métodos que otras clases necesiten llamar.
Cuando no especificas ningún modificador, Java utiliza el acceso default (también llamado package-private), que permite el acceso solo dentro del mismo paquete:
class Helper { // Clase con acceso default
void assist() { } // Método con acceso default
}Elige el nivel de acceso más restrictivo que permita que tu código funcione. Esto protege tus datos y hace que tu código sea más fácil de mantener.
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer entradas
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int grade = Integer.parseInt(scanner.nextLine());
String school = scanner.nextLine();
// TODO: Crear un objeto Student con los valores de entrada
// TODO: Imprimir el campo school directamente (accesible porque es público)
// TODO: Imprimir el resultado de getInfo() para mostrar toda la información del estudiante
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator