> 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/atributos-e-metodos-estaticos.md).

# Atributos e métodos estáticos

Os elementos (atributos e métodos) definidos como **static** son independentes dos obxectos (instancias) da clase.

* **Atributos estáticos – variables de clase:**
  * Un atributo *static* é unha variable global da clase.
  * Un obxecto da clase non copia os atributos *static* → todas as instancias comparten a mesma variable
  * Uso de atributos estáticos: **nomeClase.nomeAtributoEstático**.
* **Métodos estáticos:**
  * Un método *static* é un método global da clase.
  * Un obxecto non fai copia dos métodos *static*.
  * Adoitan utilizarse para acceder a atributos estáticos.
  * Non poden facer uso da referencia **this**.

## Atributos estáticos <a href="#id-561-atributos-estaticos" id="id-561-atributos-estaticos"></a>

Supoñamos que necesitamos engadir na clase `Persoa`<i class="fa-copy">:copy:</i> un atributo que nos indique que día de semana é hoxe. Evidentemente se hoxe é luns, será luns para todos os demais. Polo tanto este valor será compartido por todos os obxectos.

Un atributo estático declarase mediante a palabra reservada `static`<i class="fa-copy">:copy:</i>:

```java
class Persoa{
    static String hoxe;
}
```

Para acceder a un atributo estático é posible utilizar o nome da clase ou a referencia a calquera obxecto dese clase:

```java
Persona p = new Persona();
Persona.hoxe = "domingo";
System.out.println(p.hoxe); // imprimirá "domingo"
```

Para asignar un valor inicial a un atributo estático podemos realizar o seguinte:

```java
class Persoa{
    static String hoxe = "luns";
}
```

Os atributos estáticos son comunmente usados para:

* Contadores de instancias.
* Constantes que son compartidas entre todas as instancias.
* Configuración ou parámetros globais para a clase.

## Métodos estáticos <a href="#id-562-metodos-estaticos" id="id-562-metodos-estaticos"></a>

Coa mesma filosofía, podemos declarar **métodos estáticos**. Estes non requiren de ningún obxecto para executarse. Polo tanto **non poden utilizar ningún atributo que non sexa estático.**

Este método devolve o día da semana a partir do día da semana no que estamos:

```java
class ExemploEstatico{
	static String diaSemana(int dia){
        switch(dia){
            case 1: return "luns";
            case 2: return "martes";
            case 3: return "mercores";
            case 4: return "xoves";
            case 5: return "venres";
            case 6: return "sabado";
            case 7: return "domingo";
        }
        return "error";
    }
}
```

Os métodos estáticos en cambio poden acceder e modificar atributos estáticos.

```java
public class Calculadora {
    static int resultado = 0;

    public static void sumar(int valor) {
        resultado += valor; // Acceso a atributo estático
    }
}
```

```
Calculadoraint resultadosumar(int valor)
```

A forma de invocar un método estático é igual que os atributos estáticos, mediante o nome da clase ou dunha referencia a un obxecto dese clase:

```java
// mediante a clase
String dia = ExemploEstatico.diaSemana(1);

// mediante o obxecto
ExemploEstatico e = new ExemploEstatico();
String dia2 = e.diaSemana(2);
```

<i class="fa-fw">:fw:</i> this en métodos estáticos

Non se pode usar `this` dentro de métodos estáticos, xa que os métodos estáticos non están ligados a unha instancia específica da clase. O operador `this` só ten sentido no contexto de métodos de instancia.

```java
public class Utilidades {
    public static void mostrarNome() {
        System.out.println(this.nome); // Isto causará un erro de compilación
    }
}
```

## Ejemplo de uso

```java
public class UtilidadesUsuario {
    
    public static float iva = 0.21;
    
    public static float calculaPrecioVenta(float precio){
        return precio + (iva*precio);
    }
}

public class App{
    
    public static void main(String args) {
        Producto p = new Producto(10.0);
         System.out.println("El precio de venta es:" + 
             UtilidadesUsuario.calculaPrecioVenta(p.getPrecio()));
          System.out.println("El IVA es:" + UtilidadesUsuario.iva);    
    }
    
}
```


---

# 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/atributos-e-metodos-estaticos.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.
