Accesibilidad en Java

Acceso privado, palabra clave “private”

Al definir un atributo, método o clase como privado, se le está dando acceso solo desde la clase donde fue definido. Por ejemplo, en el caso de velocidad de un Auto:

         public class Auto {

               private int velocidad;

               public void acelerar () {
               this.velocidad += 10;
               }
  
         }

Por lo tanto el único modo de acceder a modificar la velocidad es a través del método acelerar. Esta propiedad no está accesible desde ningún otro alcance sino el de la clase.
Para poder acceder al atributo velocidad, solo podrán hacerlo los métodos de la misma clase.

Acceso por defecto, “default” o “package”

En el caso del acceso por defecto, que es el acceso cuadno no se declara la accesibilidad a un atributo, método o clase, el acceso es dentro del mismo paquete o directorio. Por ejemplo si tengo dos clases Auto y Camion, y auto tiene un conductor sin definir su accesibilidad, es decir:

         package vehículos;
     
               public class Auto extends Vehiculo{
     
                               Conductor getConductor(){
                               //Acá se retorna el conductor
                               }
         }
 
Luego en la clase Camion que está en el mismo package:

      package vehículos;

      public class Camion extends Vehiculo{
  
         public void comunicar(Vehiculo v){
         v.getConductor().conversar(); //Se tiene acceso a getConductor por estar ambas clases en el mismo package.
         }

      }

Para poder acceder al método getConductor() podrán hacerlo únicamente las clases ubicadas en el mismo package o directorio.

Acceso protegido, palabra clave “protected”

Al definir un atributo o método como protegido estamos dejándolo disponible para las clases que heredan de esta clase, ejemplo:

         public class Vehiculo{
               protected int cantidadDeRuedas = 4;
         }
      Luego en la clase Auto, tendremos acceso a cantidadDeRuedas:

         public class Auto extends Vehiculo{
         
                public int getCantidadDeRuedas(){
                return this.cantidadDeRuedas;
                }
         }

Para poder acceder al atributo cantidadDeRuedas, solo podrán hacerlo las clases que heredan de Vehiculo, es decir la familia de clases.

Acceso público, palabra clave public
 Definiendo un atributo o método o clase como público permite que se tenga acceso a estos  desde cualquier alcance, desde todos lados.
  Acceder a los atributos públicos, todos podrán hacerlo.

Resumen de accesibilidad

Accesibilidad
Acceso en la misma clase
Acceso en el mismo package
Acceso en el árbol de herencia
Acceso desde todas las clases
private
Si
No
No
No
default o package
Si
Si
No
No
protected
Si
Si
Si
No
public
Si
Si
Si
Si

Los tipos de datos en java

ModifVisibilidad indica desde que parte del código se puede acceder al atributo:

public: indica que es un atributo accesible a través de una instancia del objeto.
private: indica que a través de una instancia no es accesible el atributo. Al heredar el atributo se convierte en inaccesible.
protected: indica que a través de una instancia no es accesible el atributo. Al heredar si se puede usar desde la clase derivada.
Sin especificar: indica visibilidad de paquete, se puede acceder a través de una instancia, pero sólo desde clases que se encuentren en el mismo paquete.

Métodos de una clase
Una vez hemos creado una instancia de la clase Persona, ¿Cómo podemos recuperar a partir de ella su nombre?, ¿Cómo podemos recuperar el nombre que almacenamos en un contacto de nuestra agenda? Una posibilidad es simplemente leer el valor del atributo, el acceso directo a los atributos de una clase esta desaconsejado. La respuesta es: a través de una llamada a un método que devuelva el nombre del contacto. En el caso de la recuperación del nombre, el tipo de dato de retorno es una cadena class String. Un método que cumple este objetivo es el siguiente:

1 String getPersona(){
2 return nombre;
3 }


Sintaxis

La sintaxis de declaración de un método es:

(modificadores) tipoRetorno nombre(tipo argumento1, tipo argumento 2,…)
{Bloqueo de definición del método;
}

En estas pocas líneas de código hay varias novedades, veámoslas:

1. Un método tiene un nombre que lo identifica, en este caso getNombre.

2. Delante del nombre del método escribimos el tipo del valor de retorno, en nuestro caso, como lo que el método devuelve es el nombre cuyo tipo es un String, este ser al tipo del valor retorno.

 3. Detrás del nombre del método aparecen unos paréntesis sin nada en su interior. Dentro de los paréntesis se define la lista de argumentos del método. Si estas familiarizado con las matemáticas, los argumentos de los métodos tienen el mismo significado que los argumentos de las funciones matemáticas, por ejemplo seno (45º) significa que queremos utilizar el cálculo del seno sobre el argumento 45 grados. En nuestro caso la lista está vacía, lo que indica que no necesito especificar ningún argumento para poder hacer uso del método.

Comprensión del ciclo de vida de las variables
El tiempo durante el que una variable conserva su valor se denomina duración. El valor de una variable puede cambiar durante su duración, pero conservará algún valor. Cuando una variable pierde ámbito, ya no tiene un valor.
Cuando un procedimiento comienza a ejecutarse, se inicializan todas las variables. Una variable numérica se inicializa en cero, una cadena de longitud variable se inicializa en una cadena de longitud cero ("") y una cadena de longitud fija se completa con el carácter representado por el código de carácter ASCII 0  Car (0). Las variables  se inicializan en Empty. Cada elemento de una variable de tipo definido por el usuario se inicializa como si fuese una variable independiente.
Cuando declara una variable de objeto, se reserva espacio en la memoria, pero el valor se establece en Nothing hasta que asigne una referencia de objeto a ella con la instrucción Set.

Si el valor de una variable no ha cambiado durante la ejecución del código, conserva el valor inicializado hasta que pierde ámbito.
Una variable de nivel de procedimiento declarada con la instrucción Dim conserva un valor hasta que el procedimiento termina de ejecutarse. Si el procedimiento llama a otros procedimientos, la variable conserva su valor mientras esos procedimientos se estén ejecutando.

Si se declara una variable de nivel de procedimiento con la palabra clave Static, la variable conserva su valor siempre que el código se esté ejecutando en cualquier módulo. Cuando todo el código ha terminado de ejecutarse, la variable pierde su ámbito y su valor. Su duración es la misma que la de la variable de nivel de módulo.
Las variables de nivel de módulo y las variables estáticas son diferentes. En un módulo estándar o en un módulo de clase, conserva su valor hasta que detenga la ejecución del código. En un módulo de clase, conserva su valor siempre que exista una instancia de la clase. Las variables de nivel de módulo consumen recursos de memoria hasta que restablezca los valores, así que úselas solo cuando sea necesario.
Si incluye la palabra clave Static antes de una instrucción Sub o Function, se conservarán los valores de todas las variables de nivel de procedimiento del procedimiento entre llamadas.