4. Clases y objetos en Java.
1. Clases y objetos en Java.
Atributos y métodos.
En la clase se declararán los atributos y métodos de la clase:
- Los atributos o propiedades representan el estado de los objetos de la clase.
- Los métodos constituyen la forma de representar el comportamiento de los objetos de la clase.
Modificador de la clase:
- public Puede ser utilizada por cualquier otra clase, incluyendo las que no pertenecen a su propio paquete.
- abstract Indica que la clase contiene métodos abstract, es decir, métodos no implementados. No será posible crear instancias de una clase abstract. Es posible heredar de esta clase y reescribir los métodos no implementados de la clase heredada.
- final La clase no admite variaciones. No puede ser heredada.
Modificador de atributo:
De acceso.
- public Es visible desde cualquier clase que pueda tener acceso a un objeto al que pertenece el atributo.
- private Sólo es visible para los métodos de la clase. No es visible para los métodos de las clases derivadas.
- protected Es visible para los métodos de la clase, para los métodos de las clases derivadas y para los métodos de las clases del mismo paquete.
- static Indica que es un atributo común para todos los objetos de una clase. Una sola variable compartida por todos los ejemplares de la clase.
- final Ese atributo es una constante con nombre. Estos atributos reciben un valor en el momento de su declaración y no pueden modificarse posteriormente. Sus identificadores se escriben con mayúsculas.
Otros.
Modificador de método:
- abstract Este método carece de cuerpo (sólo un punto y coma) y debe ser implementado por la clase derivada o subclase. Una clase con un método abstract debe ser declarada abstract.
- final No se puede reescribir en una subclase o clase derivada.
- static Este método sólo puede acceder a variables static o de clase. Los métodos static son automáticamente final.
- native
- synchronized
Formato de los mensajes: Llamada a los métodos
objeto.método(lista de argumentos);
En caso de sobrecarga, usaremos el nombre del método y la lista de argumentos, para distinguir cuál es el que queremos ejecutar.
2 Paso de parámetros a un método.
- En Java se utiliza el paso de parámetros a un método por valor y por referencia. Cuando lo que se pasa es un argumento correspondiente a un tipo simple de datos, se pasa por valor; lo que ocurra con el parámetro que se recibe no tiene ningún efecto fuera del método.
Ejemplo:
public class PorValor{
public void metodo(int i, int j)
{
i=i+2;
j=j+2;
}
}
public class PruebaPorValor{
public static void main (String args[]){
PorValor obj = new PorValor();
int a = 15, b = 20;
System.out.println (“\n antes de la llamada: “ + a + “ “ + b);
obj.metodo(a,b);
System.out.println (“\n después de la llamada: “ + a + “ “ + b);
}
}
La salida:
antes de la llamada: 15 20
después de la llamada: 15 20
- Cuando se pasa un objeto a un método, se pasa por referencia; los cambios realizados en el objeto, dentro del método, pueden verse fuera de él en el objeto pasado por referencia.
Ejemplo:
public class PorReferencia{
private int a, b;
public PorReferencia (){
this.a=0;
this.b=0;
}
public PorReferencia (int a, int b){
this.a=a;
this.b=b;
}
public String toString(){
String s=»»;
s = s + «valor de a= «+ this.a + » valor de b= » + this.b;
return s;
}
public void metodo (PorReferencia o){
// aquí tenemos dos referencias this y o, lo que modifique desde this se verá desde el main()
//lo que modifique desde o se verá desde main()
o.a =5;
this.b=4;
}
}
public class PruebaPorReferencia{
public static void main (Strings args[]){
PorReferencia unObjeto = new PorReferencia ();
PorReferencia otroObjeto = new PorReferencia ();
System.out.println (“unObjeto antes de la llamada: “ + unObjeto);//llama al método toString()
System.out.println (“otroObjeto antes de la llamada: “ + otroObjeto);//llama al método toString()
unObjeto.metodo(otroObjetob);
System.out.println (“unObjeto después de la llamada: “ + unObjeto);
System.out.println (“otroObjeto después de la llamada: “ + otroObjeto);
}
}
Nota:
- Un método puede devolver cualquier tipo de datos, incluso un objeto (referencia al objeto). Cuando finaliza un método, un objeto creado dinamicamente dentro del método existirá, mientras perdure una referencia al mismo. Cuando no haya referencia al mismo será eliminado definitivamente por el recolector de basura
3. Construcción de objetos.
Constructores.
Son un tipo especial de métodos que tienen el mismo nombre de la clase, pueden tener cero o más parámetros y no declaran devolver ningún tipo de resultado, ni siquiera void. La misión de un constructor es inicializar los atributos y crear los abjetos asociados a estos atributos cuando no son de tipos simples.
La sintaxis del operador new es:
variable = new NombreClase(lista de argumentos..)
La creación de un objeto mediante new implica la invocación de un método constructor, encargado de realizar las funciones necesarias para que el objeto se inicialice a un estado coherente.
Java incorpora por defecto un constructor sin parámetros que no realiza ninguna operación especial:
public NombreClase ( ) { };
Cuando se crea una clase, se está creando un nuevo tipo de datos que se utilizará para declarar referencias y crear objetos de ese tipo.
La creación de un objeto de una clase consta de dos etapas:
- Declaración de una variable del tipo de la clase. Esta variable es una referencia a un objeto de la clase (un puntero).
- Obtención de una copia física del objeto que será asignada a la referencia anterior: Para esto se utilizará el operador new y los constructores.
new.
Ejemplo para un objeto de la clase PorReferencia en la que el constructor sin argumentos asignaba para a y b el valor 0
PorReferencia objetoCreado = new PorReferencia()
Asigna dinamicamente (durante el tiempo de ejecución), memoria a un objeto, devolviendo una referencia al mismo. El sistema reserva espacio para almacenar el objeto y devuelve una referencia que apunta al espacio de memoria reservado.
En Java todos los objetos son creados dinamicamente. .
EJEMPLO
public class Punto{
private int x;
private int y;
public Punto (int x, int y){
//dentro de cada método tengo una referencia this al objeto
this.x = x;
this. y =y;
}
public Punto (){
x = 0;
y = 0;
}
public void mover (int incX, int incY){
x = x + incX;
y = y + incY;
}
public void mover (Punto p){
this.x =this. x + p.x;
this.y = this.y + p.y;
}
public String toString(){
//devuelve una cadena
return “(“ + x + “,” + y + “)”;
}
}
public class Test{
public static void main(String arg[]){
Punto p1 = new Punto();
Punto p2 = new Punto(2,5);
System.out.println(«El punto p1 vale: » + p1);//llama a toString para p1
System.out.println(«El punto p2 vale: » + p2);//llama a toString para p2
p1.mover(3,7);
System.out.println(«El punto p1 vale: » + p1);
p2.mover(p1);
System.out.println(«El punto p2 vale: » + p2);
}
}
4. Sobrecarga de métodos.
Java permite la sobrecarga de métodos; es decir, permite crear varios métodos de la misma clase con el mismo nombre y diferentes listas de argumentos.
Dos métodos sobrecargados se diferencian en el número de argumentos y/o en su tipo. La elección de ejecutar un método u otro dependerá de la colección de argumentos que se emplea en la llamada al método, dentro de un mensaje.
El tipo devuelto en los métodos sobrecargados también puede ser distinto.
Inicialmente, se busca un método en la clase que tenga la misma distribución de argumentos de la llamada; si no existe ninguno, se intenta lo mismo buscando argumentos promoviéndolos al nivel superior (un char intentaría convertirse en un int, un int en un long y float en un double). Si se sigue sin encontrar ningún método, se debe introducir un “casting” para que los argumentos coincidan con los definidos en los métodos.
Los constructores de una clase se pueden sobrecargar.
(La sobrecarga de un método es distinta que la redefinición de un método en la herencia.)
5. Recolección de basura.
Java no permite al usuario destruir objetos mediante una orden, sino que lo hace automáticamente para aquellos objetos que no son referenciados desde ninguna parte.
El encargado de esta operación es el “Recolector de Basura” (Garbage Collector (GC)), que el sistema lanza periódicamente.
- Métodos finalizadores: Son métodos que necesitan ser llamados antes de la llegada del recolector de basura. Se suelen utilizar para cerrar archivos o conexiones abiertas, etc.(métodos finalice()).
6. Control de acceso.
Mediante el mecanismo de se puede controlar el acceso a los atributos y métodos de una clase, para impedir el mal uso de los mismos. Si sólo se permite el acceso a los datos a través de unos métodos bien definidos, impedimos que sean mal utilizados.
El modificador de acceso a un dato y a un método determina como se podrá acceder a ese dato o a ese método y debe aparecer en su declaración.
Modificador | Elementos | Mismo paquete | Otras clases | Heredado |
public | clase o interfacemétodo, atributo | Sí | Sí | Sí |
protected | método, atributo | Sí | No | Sí |
ninguno | clase o interfacemétodo, atributo | Sí | No | Subclases del mismo paquete |
private | método, atributo | No | No | No |
7. this y super.
this
Se utiliza cuando un método quiere hacer referencia al objeto que lo invocó. Se utiliza dentro de cualquier método para referirse al objeto actual.
Cada método de una clase tiene un argumento implícito, que no se muestra en la declaración del método. Este argumento se llama this y hace referencia al objeto mediante el cual se invoca al método de la clase.
Se le da el nombre de puntero this.
Cuando desde un método se hace referencia a los atributos de la clase utilizando su identificador, se está accediendo a los atributos del objeto referenciado por this, de forma implícita.
Cuando se invoca un método desde otro, dentro de la clase, se invoca de forma implícita mediante el objeto this.
super.
Es un término que, empleado dentro de un objeto de une clase, permite hacer referencia a los métodos y atributos de la superclase correspondiente (en la herencia).
Puede emplearse de dos formas:
- Para acceder a métodos o atributos de la superclase. Se emplea cualificando al método o atributo correspondiente, al que se quiera acceder.
super.atributo
super.metodo()
Para invocar el constructor de la superclase correspondiente.
- Se utiliza super() como si del constructor de la clase se tratara, indicado entre paréntesis la lista de argumentos. En este caso debe ser la primera línea en el constructor correspondiente.
super(lista de argumentos…)
No puede ser utilizado en métodos estáticos.
8. static.
Si se define un atributo o método static podrá ser utilizado independientemente de cualquier objeto de la clase.
Existirá una única copia de ese atributo para todos los objetos de la clase.
Un atributo o método static puede ser utilizado por sí mismo, sin instancia de la clase específica; sin referencia a ningún objeto.
NombreClase.metodoStatic()
NombreClase.atributoStatic
El ejemplo más habitual es el método main() que será llamado antes de que exista cualquier objeto.
Si un atributo es declarado static será compartido por todos los objetos de la clase.
Si un método es declarado static:
- Sólo pueden llamar a otros métodos declarados como static.
- Sólo deben acceder a datos declarados como static.
- No pueden referirse a this ó super.
Puede utilizarse un bloque de inicialización static, es un bloque que sólo se ejecuta una vez, cuando se carga la clase por primera vez.
alexander said,
19 abril, 2010 a 1:21 am
de verdad gracias aclare muchas dudas con este tutorial…