Skip to content

2 Acceso y sobrecarga

Modificadores de acceso

Los modificadores de acceso son palabras reservadas del lenguaje Java que determinan ámbitos de visibilidad de los atributos y métodos de una clase.

Los modificadores de acceso son los siguientes:

  • Private: el modificador private en Java es el más restrictivo de todos, cualquier elemento de una clase que sea privado puede ser accedido únicamente por la propia clase. Ninguna otra clase, sin importar la relación que tengan, podrá tener acceso a elementos privados.
  • El modificador por defecto: 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 friendly, que permite que tanto la propia clase como las clases del mismo paquete accedan a dichos elementos.
  • Protected: lo veremos en el tema donde se explica el funcionamiento de la herencia en Java.
  • Public: el modificador de acceso public es el más permisivo de todos, nos permite acceso a los elementos desde cualquier clase incluso de otros paquetes.

Veamos una tabla que resume el funcionamiento de los modificadores de acceso en Java:

Private Friendly Public
Misma clase x x x
Mismo paquete x x
Otro paquete x

El modificador se indica:

  • Delante de class en la clase.
  • Delante del tipo de datos en los atributos y métodos.

Veamos la clase Vehicle con los modificadores de acceso:

public class Vehicle {
    private int wheelCount; // Nº ruedas
    private double speed; // Velocidad
    private String color; // Color del vehículo
    public void accelerate(double amount){ // acelerar
        speed += amount;
    }
    public void brake(double amount){ // frenar
        speed -= amount;
    }
}

Sobrecarga de métodos

Java admite sobrecargar los métodos, es decir, crear distintas variantes del mismo método con el mismo nombre pero que se diferencien en el orden, tipo o número de los parámetros.

Por ejemplo, tenemos el método para sumar add(int x,int y):

  • No podríamos definir otro método add(int a,int b) porque no varía el tipo ni el número de parámetros.
  • Sí podríamos definir add(int a) y add(int a,int b,int c) porque el número de parámetros varía.
  • También podríamos definir add(int x,double y) porque aunque no varíe el número de parámetros, sí varía uno de los tipos.

Otro ejemplo donde tenemos el método add(int x,double y):

  • Sí podríamos definir el método add(double x,int y) porque varía el orden de los parámetros.

El tipo resultado de los métodos sobrecargados puede ser igual o diferente.

Atributos, métodos y bloques estáticos

El concepto de estático es que pertenece a la clase, por lo tanto, puede ser accedido o invocado sin la necesidad de tener que instanciar un objeto de la clase. Se indica con la palabra clave static.

Los atributos y métodos asociados a los objetos se les conoce como dinámicos.

Los atributos estáticos son variables que pertenecen a la clase y son compartidos por todos los objetos de la clase. Son inicializados en el momento en que se carga la clase en memoria, respetando el orden de declaración. Para acceder a un atributo estático, hay que indicar el nombre de la clase: Clase.AtributoEstático

Los métodos estáticos son métodos que pertenecen a la clase y no al objeto por lo que pueden llamarse sin tener que crear un objeto de dicha clase. Para llamar a un método estático, hay que indicar el nombre de la clase: Clase.MétodoEstático(Argumentos) . Un método estático solo puede acceder a datos estáticos y llamar a métodos estáticos. No pueden utilizar el operador this ni super ya que son conceptos dinámicos. Los métodos estáticos es lo más parecido a lo que son las funciones en los lenguajes estructurados con la diferencia que se encuentran encapsulados en una clase.

Cada vez que creamos un programa en Java debemos especificar el método main:

public static void main(String[] args)

El método main es estático para que la máquina virtual de Java pueda llamarlo directamente sin tener que crear un objeto de la clase que lo contiene.

Ejemplos de llamadas a métodos dinámicos y estáticos:

  • Llamada a método dinámico: car.accelerate(30);
  • Llamada a método estático: Math.pow(2,3);

El bloque estático es un bloque de instrucciones dentro de una clase Java que se ejecutará cuando una clase se cargue por primera vez en la JVM.

class MyClass{
    static{
        //instrucciones
    }
}
public class MyClass {
    static int a;
    static int b;

    static {
        a = 10;
        b = 20;
    }
}
public class Main {
    private void showStatic() {
        System.out.printf("Valor de a: %d\n", MyClass.a);
        System.out.printf("Valor de b: %d:\n", MyClass.b);
    }

    public static void main(String[] args) {
        new Main().showStatic();
    }
}
Valor de a: 10
Valor de b: 20