- public class NombreClase{
- }
+forma
+peso
+textura
+perímetro
+rebotar()
+patear()
- public class PelotaFutbol{
- int peso = 450; // medido en gr
- int perímetro = 70; //medido en cm
- public void Rebotar(){
- }
- public void Patear(){
- }
- }
Variable Local Vs Global - Scope
Una variable puede declararse en cualquier lugar dentro del cuerpo de una clase. Sin embargo no es igual declararlo dentro cuerpo de la clase que dentro de un método o estructura de control/repetición.
Una variable local se considera toda aquella que sea declarada dentro de un método o estructura de control/repetición y por su lado una variable global es aquella que se declara en el cuerpo de una clase, generalmente al principio ya que nuestro el compilador no llega a entender si usamos una variable que todavía no hemos declarado, aún declarando al final.
- public class LocalvsGlobal {
- double e = 2.718;
- public void getE(){
- }
- float pi = 3.14f;
- LocalvsGlobal objeto = new LocalvsGlobal();
- objeto.getE();
- }
- }
En este ejemplo el número "e" es una variable local y el número "pi" es una variable local del método main. El resultado es obviamente:
- 3.14
- 2.718
Alcance (Scope)
La idea de indivdualiar a una variable por su lugar de declaración tiene que ver con su alcance (scope en inglés). Una variable que se declara "global" está disponible para toda la clase, en cambio, una variable local "nace,vive y muere" dentro del bloque donde fue declarada, modificando el ejemplo anterior veremos que se producirá un error si intentamos mostrar por pantalla a "pi" que la declaramos dentro de un bloque If, fuera de él no hay alcance de variable.
- public class LocalvsGlobal {
- static double e = 2.718;
- if (e == 2.718){
- float pi = 3.14f;
- }
- }
- }
NOTA: Siendo un buen observador se nota que se antepuso una palabra reserva "static" en el numero "e" que es un modificador que convierte a nuestra variable global en un atributo de clase.
Modificadores de Acceso: Encasuplamiento
Los modificadores son las palabras claves que le añadimos a las definiciones de clases, paquetes, variables y métodos.
- Modificadores de Acceso: (Determina que variables y métodos son visibles para otras clases)
- Public
- Protected
- Default
- Private
- Modificadores de Instancia/Clase: (Convierte a métodos y variables "de instancia" a "de Clase")
- Static
- Default: no-estático
- Modificador de Fijación: (Hace inmodificable variable, métodos y clases)
- Final
- Default: no-final
- Modificador Abstracto: (Impide la instanziación)
- Abtract
- Default: no-abstracto
- Modificadores de Hilos: (Usados en Threads-hilos de ejecución)
- Synchronized
- Volatile
De momento nos centraremos en los 3 primeros modificadores: De acceso, de Instancia/Clase y de Fijación.
Modificadores de Acceso: Encapsulamiento
El encapsulamiento es el proceso que hace que tanto variables como métodos de una clase sean visibles a otras, es decir si bien odemos hacer uso de sus atributos sólo es posible modificar los mismos mediante los propios métodos definidos y no podremos saber como se ejecutan esos métodos ya que se lo guardan para si aunque entregan el resultado. Esto detalles de la implementación de los métodos permanecen "ocultos" a quienes usan las clases, evitando así modificaciones o accesos indebidos a los datos que almacenan las clases. Además, el usuario de la clase no se tiene que preocupar de cómo están implementados los métodos y propiedades, concentrándose sólo en cómo debe usarlos. La encapsulación es una de las principales ventajas que proporciona la programación orientada a objetos.
Public: hace que estén totalmente disponibles para cualquier otra clase.
- Ejemplo: public static void main(String[] args){}
Protected: Limita el acceso a cualquier clase no sea sub-clase o esté fuera del paquete
Default: Cuando no ponemos nada solo podrán acceder una clase dentro del paquete o de la misma clase
Private: Evita que sus métodos o variables sean usandos por ninguna otra clase
Acceso | Clase | Package | Subclase | Todos |
---|---|---|---|---|
public | si | si | si | si |
protected | si | si | si | NO |
Default | si | si | NO | NO |
private | si | NO | NO | NO |
De esta manera por ejemplo, un método private no podrá ser llamado por un objeto que viva en un paquete diferente.
Instancia Vs Clase
Nuestro modificador de Movilidad: "static" convierte a nuestras variables y métodos de instancias a variables y métodos de clase.
Una variable o método de instancia es aquel que obviamente no lleva el modificador static, y pertenece a la "instancia" (objeto particular) por lo tanto al ser modificado/eliminado, etc solo afecta a dicho objeto y no a cualquier otro objeto creado a partir de la clase. También será necesario que el objeto invoque al método o atributo para ser usado.
En este primer ejemplo creamos variables globales de instancia que son tomadas por un método de instacia que un objeto "dario" llama para ser mostrada
- public class Persona {
- int anios = 25;
- public void datosPersonales(){
- }
- Persona dario = new Persona();
- dario.datosPersonales();
- }
- }
- Mi nombre es Darío
- Tengo 25años
- Y tengo los ojos color verdes
En este segundo ejemplo vemos como pese que se modifican las variables de instancias con un objeto "pedro", al crear otro objeto darío sigue teniendo los valores iniciales
- public class Persona2 {
- int anios = 25;
- public void datosPersonales(){
- }
- nombre = unNombre;
- anios = unosAnios;
- colorOjos = unColorOjos;
- }
- Persona2 dario = new Persona2();
- Persona2 pedro = new Persona2();
- pedro.setDatosPersonales("Pedro", 20, "Azules");
- pedro.datosPersonales();
- dario.datosPersonales();
- }
- }
- Mi nombre es Pedro
- Tengo 20años
- Y tengo los ojos color Azules
- Mi nombre es Darío
- Tengo 25años
- Y tengo los ojos color verdes
Por su parte un métodos y/o atributos de clase es llevan la palabra reservada "static" y esto hace pertenecer a la "clase" por ende tiene que ser la clase que llame a la variable o método, y esto afecta a todos los objetos que seancreados a partir de esta clase.
- public class Persona {
- static int anios = 25;
- public void datosPersonales(){
- }
- nombre = unNombre;
- anios = unosAnios;
- colorOjos = unColorOjos;
- }
- Persona dario = new Persona();
- Persona pedro = new Persona();
- dario.datosPersonales();
- Persona.setDatosPersonales("Pedro", 20, "Azules");
- pedro.datosPersonales();
- dario.datosPersonales();
- }
- }
El resultado será que se crea una "persona dario" con sus atributos, luego se crea otra "persona pedro" y la clase a través de Persona.setDatosPersonales("Pedro", 20, "Azules"); modifica a toda la clase entonces las 2 personas modifican sus valores de la siguiente manera:
- Mi nombre es Darío
- Tengo 25años
- Y tengo los ojos color verdes
- Mi nombre es Pedro
- Tengo 20años
- Y tengo los ojos color Azules
- Mi nombre es Pedro
- Tengo 20años
- Y tengo los ojos color Azules
NOTA: Al menos yo creia que al modificar los atributos en un tiempo "t2" a partir de ese momento todos los objetos cambiaban, quizás engañado por el System.out que en un tiempo t1 me muestra otros valores y en realidad es como una foto que se toma del objeto y no se actualiza magicamente en un tiempo t2, claramente se ve como la "persona dario" cambia de nombre por estar mirando a la misma clase que cambio.
No hay comentarios:
Publicar un comentario