> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud3-introducion-a-programacion-orientada-a-obxectos/encapsulamento-modificadores-de-acceso.md).

# Encapsulamento: Modificadores de acceso

**Encapsulamento** na programación orientada a obxectos é un principio fundamental que consiste en **agrupar os datos (atributos) e os métodos (comportamentos) que operan sobre eses datos nunha única unidade chamada clase**, e **restrinxir o acceso directo a algúns dos compoñentes internos do obxecto**.

Unha clase é visible por outra dependendo de se están no mesmo paquete e os modificadores de acceso que utilice. Estes alteran a visibilidade, permitindo que se mostre ou oculte.

De igual xeito que podemos modificar visibilidade entre clases, é posible modificar a visibilidade a nivel de atributos e métodos que son visibles para outras clases.

## Modificadores de acceso para clases <a href="#id-291-modificadores-de-acceso-para-clases" id="id-291-modificadores-de-acceso-para-clases"></a>

Dúas clases calquera poden definirse como:

* **Clases veciñas**: cando ambas están no mesmo paquete.
* **Clases externas**: no caso que se encontren definidas en paquetes distintas.

Ver unha clase significa poder crear obxectos dela ou poder acceder os seus atributos e métodos estáticos. Temos varios xeitos de definir as visibilidades de clases:

* **Visibilidade por defecto**: Cando definimos unha clase sen ningún modificador de acceso:

  ```java
  package paquete1;

  class A { // sen modificador de acceso
      //...
  }
  ```

  Só é visible polas súas clases veciñas:

<figure><img src="/files/x0i5pXOZfOR7riaeTAL7" alt=""><figcaption></figcaption></figure>

* **Visibilidade total**: No caso anterior, a clase `A` é invisible para todas as clases externas. Para facela visible podemos utilizar o modificador de acceso `public`<i class="fa-copy">:copy:</i>. Calquera clase pública será visible dende calquera clase externa mediante importación.

  Modificamos a clase `A` para que sexa visible polas clases externas:

  ```java
  package paquete1;

  public class A { // clase marcada como pública
      //...
  }
  ```

  O único que necesita agora unha clase externa para poder utilizar a clase `A` é importala:

  ```java
  import paquete1.A; // importamos a clase A

  class C {
      //....
  }
  ```

  Podemos importar todas as clases dun paquete mediante un asterisco `*`:

  ```java
  import paquete1.*; // podemos utilizar calquera clase publica do paquete1

  class C {
      //....
  }
  ```

## Modificadores de acceso para atributos e métodos <a href="#id-592-modificadores-de-acceso-para-atributos-e-metodos" id="id-592-modificadores-de-acceso-para-atributos-e-metodos"></a>

Podemos regular a visibilidade dos atributos e métodos dunha clase. Que un atributo sexa visible significa que podemos acceder a el, tanto para lelo como para modificalo. Que un método sexa visible significa que se pode invocar.

Tódolos atributos e métodos **sempre son visibles dentro da propia clase** independentemente do modificador de acceso utilizado. Temos 3 tipos de visibilidade:

* **Visibilidade por defecto**: A visibilidade por defecto é aquela que aplica a atributos e métodos declarados sen ningún modificador de acceso. Esta visibilidade implica que un atributo e método é visible dende as clases veciñas, pero invisible dende as clases externas:

  ```java
  public class A { //clase pública
      int a; //visibilidade por defecto
  }
  ```

  Por exemplo, o atributo `a` é visible polas clases veciñas. En cambio é invisible para clases externas. É dicir, unha clase externa pode acceder a clase `A`, pero non ao atributo `a`.
* **Modificador de acceso `private`**<i class="fa-copy">:copy:</i>

  Co modificador `private`<i class="fa-copy">:copy:</i> obtemos unha visibilidade máis restritiva que por defecto, xa que impide o acceso incluso para clases veciñas. Un atributo ou método privado é invisible dende fora da clase.

  ```java
  public class A { //clase pública
      private int a; //visibilidade privada
  }
  ```

  O uso de `private`<i class="fa-copy">:copy:</i> está xustificado cando queremos controlar os cambios dun atributo ou cando desexamos que non se coñeza o seu valor, ou ben cando queremos que un método só sexa invocado por métodos da propia clase, pero non por fora dela.
* **Modificador de acceso `public`**<i class="fa-copy">:copy:</i>: `public`<i class="fa-copy">:copy:</i> fai que un atributo ou método sexa visible incluso dende clases externas. Outorga visibilidade total.

  ```java
  public class A { //clase pública
      public int a; //visibilidade publica
  }
  ```

<figure><img src="/files/y2CQdD7NhDhcueTWPnbr" alt=""><figcaption></figcaption></figure>

## Recomendación de modificadores de acceso para atributos e métodos

A elección dos modificadores de acceso para atributos e métodos en Java é crucial para garantir un bo deseño do software, promovendo a encapsulamento e a seguridade. Aquí tes unhas recomendacións sobre como utilizar os diferentes modificadores de acceso:

**Os atributos deben ser declarados como `private`**<i class="fa-copy">:copy:</i> sempre que sexa posible. Isto oculta os atributos da clase e evita que se modifiquen directamente desde fora da clase.

```java
public class Persoa {
    private String nome; // Atributo privado
}
```

Os **métodos que deben ser accesibles desde outras clases deben ser declarados como `public`**<i class="fa-copy">:copy:</i>. Estes métodos forman a interface pública da clase e deben estar ben definidos para que outros poidan utilizalos correctamente.

```java
public class Persoa {
    public void presentar() { // Método público
        System.out.println("Nome: " + nome);
    }
}
```

**Os métodos que só deben ser utilizados internamente dentro da clase deben ser declarados como `private`**<i class="fa-copy">:copy:</i>. Isto permite encapsular a lóxica que non debería ser accesible desde fora.

```java
private void calcularIdade() { // Método privado
    // Lóxica interna
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud3-introducion-a-programacion-orientada-a-obxectos/encapsulamento-modificadores-de-acceso.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
