Así que insistes en aprender JAVA..... ni modo, ahora hablaremos del
control de acceso en java que es el paso a seguir una vez entendida la
herencia (si no entiendes herencia al 100% da click aqui).
El control de acceso se realiza atravez de los modificadores de acceso que son una serie de palabras reservadas que le indican al compilador lo que es visible o se puede utilizar fuera de la clase y lo que no.
Los modificadores de acceso son estos 4
public
protected
dafault (no especificado, no se escribe o "tu no tocar teclado cometer error" para las mentes menos avanzadas )
private
Todas las variables de clase (variables definidas fuera de un método) , todos los constructores, todas las funciones, las declaraciones de clases, de interfaces y de enumeraciones tienen un modificador de acceso así no se les escriba uno. es decir;
public int unNumero; //tiene acceso publico
private int unNumero;//tiene acceso privado
protected int unNumero;//tiene acceso protegido
int unNumero; //tiene acceso por defecto es decir que si tiene un nivel de acceso así no se le haya especificado uno
Algo que recordar sobre los niveles de acceso es que se ordenan de menos a mas restrictivos en este orden.
public, protected, default y private
Ahora que significa cada una de estas palabrejas... lo veremos después del siguiente corte comercial...
ya estamos de regreso.
public: quiere decir para todo el mundo, una variable, un metodo, una clase, una interfas, una enumeracion marcadas como public se podran acceder con total libertad desde cualquier otra clase.
public class Personaje{
public int numero;
public void metodo(){}
}
Esta clase es visible para todas las demás clases en otros paquetes (aprendete de memoria esto de un el mismo paquete y en otros paquetes) y todas sus variables publicas y métodos públicos se pueden acceder utilizando una instancia de la clase en cualquier otra clase en otro paquete (te lo advertí otra vez el cuentico ese del otro paquete).
Lo que permite que las siguientes acciones sean legales en cualquier otra clase que se encuentre en otro paquete (otra vez, creo que aquí hay un patrón de comportamiento repetitivo y enfermizo)
Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();
Como puedes ver que viva la libertad con el modificador public, pero no todo puede ser libertinaje y majadería, a toda clase le llega el momento de crecer, alinearse y comportarse como una dama, el primer grado de recato y decencia le llega con el modificador por defecto default, el modificador default no existe como palabra reservada (si existe pero no se debe escribir ni como modificador ni como variable ni como método ni como nada. nació para no ser visto y esa esa una vida mucho muy triste).
Para declara cualquier cosa como default lo que hay que hacer es absolutamente nada...
package com.paquete1;
class Personaje{
int numero;
void metodo(){}
}
La restricción default permite que solo las clases en el mismo paquete puedan acceder a miembros o clases declaradas como default es decir que la clase Personaje declarada en el paquete com.paquete1
solo se puede instanciar en clases que se encuentren en el mismo paquete
package com.paquete1;
class Terreno{
public Terreno(){
Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();
}
}
Y ahora ¿que pasa si estoy en otro paquete o en un subpaquete del mismo?... simple te requete llenas de errores. LO SIGUIENTE NO FUNCIONA:
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz{
public TerrenoEnLaRaiz(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub{
public TerrenoEnSub(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente{
public TerrenoEnDiferente(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
Conociendo los dos primeros modificadores de acceso podemos lanzar la primera regla relacionada con ellos.
la primera regla relacionada con public y default es esta; la clase definida en un archivo ".java" con el mismo nombre del archivo debe ser declarada public o default es decir
en el archivo
Personaje.java
debe existir una de las siguientes declaraciones
public class personaje{}
o
class personaje{}
la clase declarada de esta forma sera la clase principal del archivo y la única que ejecutara el método main() cuando se lance con el comando
java Personaje.java
Al leer esto dirás ¿la única?, ¿es que hay mas clases en un mismo archivo ?, ¿pero que es esto?... ¡exijo que me regresen mi dinero! ante todo no se aceptan devoluciones porque esto es gratis como le gusta a mi pueblo y en el lugar del todo porque ya escribí el ante, pues si una clase en java se puede definir como subclase, inerclase, clase anónima y otras dos formas pero eso ya lo veras mas adelante y no es complejo cuando ya se ha trabajado con el lenguaje un tiempo.
El siguiente modificador es protected, este modificador es una versión de default que permite acceder a los miembros de una clase utilizando la herencia (si de herencia no tienes ni idea has click aqui). este modificador si debe ser especificado y por ahora diremos que solo se aplica a constructores, variables y métodos.
package com.paquete1;
public class Personaje{//en este ejemplo Personaje es public para poder heredar la clase por fuera del //paquete
protected int numero;
protected void metodo(){}
}
package com.paquete1; //mismo paquete
public class Terreno{
public Terreno(){
Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();
}
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz{
public TerrenoEnLaRaiz(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub{
public TerrenoEnSub(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente{
public TerrenoEnDiferente(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
hasta el momento igual que default mismos problemas mismas restricciones pero esto lo arreglamos con herencia
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz extends Personaje{
public TerrenoEnLaRaiz(){
numero=3456;
int numeroLocal=numero;
metodo();
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub extends Personaje{
public TerrenoEnSub(){
numero=3456;
int numeroLocal=numero;
metodo();
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente extends Personaje{
public TerrenoEnDiferente(){
numero=3456;
int numeroLocal=numero;
metodo();
}
}
si notas algo diferente es que decir
Personaje p= new Personaje();
p.numero=3456;
En una clase fuera del paquete sigue siendo ilegal (la parte de p.numero=3456; no el new Personaje(); porque personaje ahora es publico) . lo que cambia ahora es que al haber heredado nuestras clases tiene un personaje interior del cual pueden llamar los métodos protected, leer y reasignar las variables protected.
El ultimo por hoy sera private el modificador de los envidiosos, los egoístas y los que no sueltan el balón en un partido de futbol. Por el momento diremos que el mezquino modificador private aplica para variables, constructores y metodos. Y que hace muy simple no deja que nadie fuera de la clase pueda ver o tocar lo que se ha marcado como private así que nada de lo siguiente es legal
package com.paquete1;
public class Personaje{//en este ejemplo Personaje es public para poder heredar la clase por fuera del //paquete
private int numero;
private void metodo(){}
}
package com.paquete1; //mismo paquete
public class Terreno{
public Terreno(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz{
public TerrenoEnLaRaiz(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub{
public TerrenoEnSub(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente{
public TerrenoEnDiferente(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
ni siquiera el heredar
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz extends Personaje{
public TerrenoEnLaRaiz(){
numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub extends Personaje{
public TerrenoEnSub(){
numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente extends Personaje{
public TerrenoEnDiferente(){
numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
como puedes ver esto es lo mas básico de los modificadores. ¿ahora que sigue? simple
Aprender a mesclar modificadores (da click aquí).
y algo que todo el mundo debe entender y es que los modificadores son de clase no de instancia (da click aqui).
El control de acceso se realiza atravez de los modificadores de acceso que son una serie de palabras reservadas que le indican al compilador lo que es visible o se puede utilizar fuera de la clase y lo que no.
Los modificadores de acceso son estos 4
public
protected
dafault (no especificado, no se escribe o "tu no tocar teclado cometer error" para las mentes menos avanzadas )
private
Todas las variables de clase (variables definidas fuera de un método) , todos los constructores, todas las funciones, las declaraciones de clases, de interfaces y de enumeraciones tienen un modificador de acceso así no se les escriba uno. es decir;
public int unNumero; //tiene acceso publico
private int unNumero;//tiene acceso privado
protected int unNumero;//tiene acceso protegido
int unNumero; //tiene acceso por defecto es decir que si tiene un nivel de acceso así no se le haya especificado uno
Algo que recordar sobre los niveles de acceso es que se ordenan de menos a mas restrictivos en este orden.
public, protected, default y private
Ahora que significa cada una de estas palabrejas... lo veremos después del siguiente corte comercial...
ya estamos de regreso.
public: quiere decir para todo el mundo, una variable, un metodo, una clase, una interfas, una enumeracion marcadas como public se podran acceder con total libertad desde cualquier otra clase.
public class Personaje{
public int numero;
public void metodo(){}
}
Esta clase es visible para todas las demás clases en otros paquetes (aprendete de memoria esto de un el mismo paquete y en otros paquetes) y todas sus variables publicas y métodos públicos se pueden acceder utilizando una instancia de la clase en cualquier otra clase en otro paquete (te lo advertí otra vez el cuentico ese del otro paquete).
Lo que permite que las siguientes acciones sean legales en cualquier otra clase que se encuentre en otro paquete (otra vez, creo que aquí hay un patrón de comportamiento repetitivo y enfermizo)
Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();
Como puedes ver que viva la libertad con el modificador public, pero no todo puede ser libertinaje y majadería, a toda clase le llega el momento de crecer, alinearse y comportarse como una dama, el primer grado de recato y decencia le llega con el modificador por defecto default, el modificador default no existe como palabra reservada (si existe pero no se debe escribir ni como modificador ni como variable ni como método ni como nada. nació para no ser visto y esa esa una vida mucho muy triste).
Para declara cualquier cosa como default lo que hay que hacer es absolutamente nada...
package com.paquete1;
class Personaje{
int numero;
void metodo(){}
}
La restricción default permite que solo las clases en el mismo paquete puedan acceder a miembros o clases declaradas como default es decir que la clase Personaje declarada en el paquete com.paquete1
solo se puede instanciar en clases que se encuentren en el mismo paquete
package com.paquete1;
class Terreno{
public Terreno(){
Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();
}
}
Y ahora ¿que pasa si estoy en otro paquete o en un subpaquete del mismo?... simple te requete llenas de errores. LO SIGUIENTE NO FUNCIONA:
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz{
public TerrenoEnLaRaiz(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub{
public TerrenoEnSub(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente{
public TerrenoEnDiferente(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
Conociendo los dos primeros modificadores de acceso podemos lanzar la primera regla relacionada con ellos.
la primera regla relacionada con public y default es esta; la clase definida en un archivo ".java" con el mismo nombre del archivo debe ser declarada public o default es decir
en el archivo
Personaje.java
debe existir una de las siguientes declaraciones
public class personaje{}
o
class personaje{}
la clase declarada de esta forma sera la clase principal del archivo y la única que ejecutara el método main() cuando se lance con el comando
java Personaje.java
Al leer esto dirás ¿la única?, ¿es que hay mas clases en un mismo archivo ?, ¿pero que es esto?... ¡exijo que me regresen mi dinero! ante todo no se aceptan devoluciones porque esto es gratis como le gusta a mi pueblo y en el lugar del todo porque ya escribí el ante, pues si una clase en java se puede definir como subclase, inerclase, clase anónima y otras dos formas pero eso ya lo veras mas adelante y no es complejo cuando ya se ha trabajado con el lenguaje un tiempo.
El siguiente modificador es protected, este modificador es una versión de default que permite acceder a los miembros de una clase utilizando la herencia (si de herencia no tienes ni idea has click aqui). este modificador si debe ser especificado y por ahora diremos que solo se aplica a constructores, variables y métodos.
package com.paquete1;
public class Personaje{//en este ejemplo Personaje es public para poder heredar la clase por fuera del //paquete
protected int numero;
protected void metodo(){}
}
package com.paquete1; //mismo paquete
public class Terreno{
public Terreno(){
Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();
}
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz{
public TerrenoEnLaRaiz(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub{
public TerrenoEnSub(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente{
public TerrenoEnDiferente(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
hasta el momento igual que default mismos problemas mismas restricciones pero esto lo arreglamos con herencia
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz extends Personaje{
public TerrenoEnLaRaiz(){
numero=3456;
int numeroLocal=numero;
metodo();
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub extends Personaje{
public TerrenoEnSub(){
numero=3456;
int numeroLocal=numero;
metodo();
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente extends Personaje{
public TerrenoEnDiferente(){
numero=3456;
int numeroLocal=numero;
metodo();
}
}
si notas algo diferente es que decir
Personaje p= new Personaje();
p.numero=3456;
En una clase fuera del paquete sigue siendo ilegal (la parte de p.numero=3456; no el new Personaje(); porque personaje ahora es publico) . lo que cambia ahora es que al haber heredado nuestras clases tiene un personaje interior del cual pueden llamar los métodos protected, leer y reasignar las variables protected.
El ultimo por hoy sera private el modificador de los envidiosos, los egoístas y los que no sueltan el balón en un partido de futbol. Por el momento diremos que el mezquino modificador private aplica para variables, constructores y metodos. Y que hace muy simple no deja que nadie fuera de la clase pueda ver o tocar lo que se ha marcado como private así que nada de lo siguiente es legal
package com.paquete1;
public class Personaje{//en este ejemplo Personaje es public para poder heredar la clase por fuera del //paquete
private int numero;
private void metodo(){}
}
package com.paquete1; //mismo paquete
public class Terreno{
public Terreno(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz{
public TerrenoEnLaRaiz(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub{
public TerrenoEnSub(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente{
public TerrenoEnDiferente(){
Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
ni siquiera el heredar
package com; //en la raiz del paquete
public class TerrenoEnLaRaiz extends Personaje{
public TerrenoEnLaRaiz(){
numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package com.paquete1.subPaquete; //en un subPaquete
public class TerrenoEnSub extends Personaje{
public TerrenoEnSub(){
numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
package org.otroDiferente; //en un paquete completamente diferente
public class TerrenoEnDiferente extends Personaje{
public TerrenoEnDiferente(){
numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
}
}
como puedes ver esto es lo mas básico de los modificadores. ¿ahora que sigue? simple
Aprender a mesclar modificadores (da click aquí).
y algo que todo el mundo debe entender y es que los modificadores son de clase no de instancia (da click aqui).
Comentarios
Publicar un comentario