Sunteți pe pagina 1din 7

Variables locales y modificadoras de acceso

Antes de todo debemos aclarar que se llaman variables locales a las variables declaradas dentro de un mtodo. Estas variables locales NUNCA deben ser declaradas con algn modificador de acceso, por ejemplo, algo como esto es incorrecto: package ejemplo; public class Auto { public void metodo() { private int numero; } }

El

cdigo

anterior

nos

dara

el

siguiente

error

Uncompilable

source

code

illegal

start

of

expression

at

ejemplo.Auto.metodo

Para resumir lo visto hasta el momento vamos a mostrar una tabla donde se explica los niveles de acceso:

Visibilidad Desde la misma clase Desde cualquier clase dentro del mismo paquete Desde una subclase en el mismo paquete Desde una subclase desde otro paquete Desde una clase distinta fuera del paquete

Public Si Si Si Si

Protectec

Default Si Si

Private Si No

Si

Si Si (slo herencia) No por

Si

No

Si

No

No

Si

No

No

Miembros de clase con modificadores de no acceso:


Primero veremos este tipo de modificadores en los mtodos despus veremos estos mismos pero aplicados a variables de instancia.

Mtodos marcados con el modificador final:


Los mtodos marcados con este modificador no pueden ser sobre escritos por una subclase, muchos mtodos de la API de Java no puedes ser sobre escritos ya que estn marcados con el modificador "final", como ejemplo veamos esta clase: public class SuperClase { public final void metodo() { System.out.println("Esto es un metodo"); } } No hay ningn problema en extender una clase, ya que no est marcada con el modificador final, pero un mtodo marcado con este modificador no puede ser sobre escrito. public class SubClase extends SuperClase { public void metodo()// Tratamos de sobre escribir el metodo final de la super clase { System.out.println("Esto es un metodo"); } } Al intentar ejecutar este cdigo obtendremos un error como este:

The method void metodo () declared in class SubClass cannot override the final method of the same signature declared in class SuperClass. Final methods cannot be overridden. public void metodo () { } 1 error

Como dijimos anteriormente: los mtodos marcados con el modificador "final" no pueden ser sobre escritos.

Argumentos marcados con el modificador final


Los argumentos de los mtodos son los que aparecen entre los dos parntesis de un mtodo, por ejemplo: public void metodo(String argumento){} Y un mtodo con declarado con mltiples argumentos se ve de la siguiente manera: public void metodo(String argumentoUno, int argumentoDos){} Los argumentos de un mtodo son esencialmente lo mismo que las variables locales, nosotros podemos marcar a los argumentos de un mtodo con el modificador " final", por ejemplo: public void metodo(String argumentoUno, final int argumentoDos){}

En el ejemplo anterior el argumento de nombre "argumentoDos" est marcado con el modificador "final", lo que quiere decir que este valor no puede ser cambiado dentro del mtodo, en otras palabras, el valor no puede ser otro que el valor que se le paso al mtodo al momento de ser llamado.

Mtodos abstractos
Un mtodo abstracto, como aclaramos anteriormente, es un mtodo que debe ser declarado pero no implementado y si recordamos lo dicho anteriormente un mtodo abstracto no tiene llaves (que es donde se coloca la lgica del mtodo), simplemente termina en punto y coma. Declarando un mtodo como abstracto obligamos a las subclases que heredan de la clase abstracta a la cual pertenece a implementar estos mtodos. Por ejemplo si tenemos un mtodo llamado "muevete" en la sper clase "Auto", las sub clases que extiendan a esta clase estn obligadas a implementar el mtodo "muevete" en ellas. Tambin debemos recordar que si un mtodo es definido como abstracto la clase a la cual pertenece tambin tiene que ser abstracta, es decir, el cdigo siguiente es incorrecto public class SuperClase // La clase tambin debera ser marcada como abstracta { public abstract void metodo(); // metodo abstracto } El cdigo anterior nos arroja el siguiente error:

SuperClase is not abstract and does not override abstract method metodo.

Tambin debemos recordar que una clase abstracta puede contar con mtodos no abstractos (de los normalitos, llamados concretos) y abstractos, por ejemplo el siguiente cdigo es correcto: public abstract class SuperClase { public abstract void metodo(); // metodo abstracto public void otroMetodo(){ } // metodo no abstracto } No olvidemos que los mtodos no abstractos deben llevar llaves.

Ahora prestemos atencin a una cosa, si tenemos una clase abstracta que a su vez hereda de otra clase abstracta, esta clase abstracta hija no tiene la necesidad de implementar los mtodos abstractos de la clase abstracta padre, pero en algn momento tendremos que declarar una clase concreta y esta clase concreta tendr que implementar TODOS los mtodos abstractos en el rbol de herencia que no han sido implementados entre las clases abstractas, mejor veamos esto en un ejemplo: public abstract class Auto { private String tipo; public abstract void acelera(); // Metodo abstracto public String getTipo() // Metodo no abstracto { return tipo; } } public abstract class Carro extends Auto { public abstract void acelera(); // Sigue abstracto public void hazAlgo() { // logica del metodo } }

public class Toyota {

extends Carro

public void acelera () { // logica del metodo } } La clase "Toyota" hereda los mtodos no abstractos "hazAlgo" y "getTipo" del rbol de herencia y tiene la necesidad de implementar el mtodo "acelera" de la sper clase "Auto" ya que este nunca fue implementado en la clase "Carro" por lo que sigue declarada abstracta en esta clase. Si tenemos mtodos abstractos que han sido implementados en las subclases abstractas no tenemos la necesidad de implementar estos mtodos, por ejemplo: public abstract class Auto { private String tipo; public abstract void acelera(); // Metodo abstracto public String getTipo() // Metodo no abstracto { return tipo; } public abstract void frena();// Metodo abstracto } public abstract class Carro extends Auto { public abstract void acelera(); // Sigue abstracto public void hazAlgo() // Metodo no abstracto { // logica del metodo } public void frena()//implementando mtodo abstracto { // logica del metodo

} public abstract void atropella();//mtodo abstracto } public class Toyota extends Carro { public void acelera() //implementacin obligatoria { // logica del metodo } public void atropella()//implementacin obligatoria { // logica del metodo } public void frena()// implementacin opcional { // logica del metodo } } Como podemos observar, la clase abstracta "Auto" cuenta con dos mtodos abstractos ("acelera" y "frena"). La clase abstracta "Carro", que extiende de "Auto", cuenta con un mtodo abstracto propio ("atropella"), adems podemos observar que implementa un mtodo abstracto de la sper clase abstracta (el mtodo "frena"), por lo cual la clase concreta "Toyota" tiene la obligacin de implementar los mtodos abstractos que no han sido implementados en el rbol de herencia (el mtodo abstracto "acelera" en la clase "Auto" y el mtodo abstracto "atropella" en la clase "Carro"). Para aclarar otro punto, el mtodo que implementa un mtodo abstracto heredado tiene que ser exactamente el mismo, veamos esto en otro ejemplo: public abstract class Carro { public abstract void acelera(); // metodo abstracto }

public class Toyota extends Carro { public void acelera(String mensaje) { // logica del metodo } } Aunque parezca que el mtodo "acelera" en la clase "Toyota" est implementando el mtodo abstracto de la sper clase "Carro", esto no es as, lo que est haciendo el mtodo de la clase "Toyota" es sobrecargar el mtodo, lo cual no cumple con las reglas necesarias para que se considere que el mtodo "acelera" en la clase "Toyota" est implementando el mtodo abstracto de la sper clase "Carro". Para terminar debemos aclarar que un mtodo abstracto no puede ser marcado como "final" o "private" ya que obviamente, como dijimos anteriormente, un mtodo abstracto est destinado a ser implementado por la sub clase que lo herede, y marcarlo como " final" significa que no puede ser sobre escrito y "private" que no puede ser visto por otra clase, lo cual tambin impide una posible implementacin Tambin debemos aclarar que un mtodo abstracto no puede ser marcado como " static", a continuacin presentamos declaraciones no legales de mtodos abstractos: private abstract void acelera(); final abstract void acelera(); abstract static void acelera(); Al ejecutar el cdigo anteriormente escrito nos dar el siguiente error de compilacin: Illegal combination of modifiers: abstract and static

S-ar putea să vă placă și