0% encontró este documento útil (0 votos)
36 vistas

POO Java

Este documento describe los conceptos básicos de la programación orientada a objetos en Java. Explica que los objetos tienen estado y comportamiento, y que las clases definen el estado y comportamiento común a todos los objetos de un tipo. También cubre temas como herencia, interfaces, paquetes, uso de this y super, y cómo crear e invocar métodos de objetos.

Cargado por

Heraldo Ubilla
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
36 vistas

POO Java

Este documento describe los conceptos básicos de la programación orientada a objetos en Java. Explica que los objetos tienen estado y comportamiento, y que las clases definen el estado y comportamiento común a todos los objetos de un tipo. También cubre temas como herencia, interfaces, paquetes, uso de this y super, y cómo crear e invocar métodos de objetos.

Cargado por

Heraldo Ubilla
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 81

PROGRAMACIÓN ORIENTADA

A OBJETO CON JAVA


OBJETOS CON JAVA
• Estado y comportamiento
• Clases, atributos y métodos
• Herencia, this y super
• Interfaces
• Paquetes
• Sobrecarga
OBJETOS CON JAVA
• Constructores y destructores
• Seguridad
• Casting y comparación
• Arrays y vectores
• Strings y cadenas de texto
Introducción
• Modelar los programas como interacción entre
objetos
• Los objetos se describen mediante clases
• Las clases se instancian para crear un nuevo
objeto
Objetos
• Ejemplos a nuestro alrededor
– Hojas, bolígrafos, el profesor, etc...
• Dos características
– Tienen un estado
– Tienen un comportamiento
• Un objeto es un conjunto software de variables y
los métodos asociados
Estado
• El estado se guarda en una o más variables
• Una variable es un espacio de almacenamiento
con un tipo de datos asociado que se identifica
mediante un nombre
Comportamiento
• El comportamiento se implementa mediante
métodos
• Los métodos son trozos de código (subrutinas)
asociados con el objeto
Encapsulación
• Podemos ver los objetos java como unas variables
que guardan el estado y unos métodos que lo
cambian
• El acceso a las variables y métodos está regulado
por los calificadores de acceso
Encapsulación
• Modularidad: el uso de la encapsulación permite
el desarrollo modular de nuestra aplicación
• Ocultación: el acceso al estado del objeto está
regulado por los métodos, que aseguran que el
estado del objeto es consistente
Mensajes
• Los objetos autónomos no son muy útiles: deben
cooperar
• Se dice que pasan mensajes (invocación de
métodos)
• Participantes
– Emisor
– Receptor
– Contenido (parámetros)
Clase
• Cada objeto es independiente de otros objetos
similares
• Pero todos comparten ciertas características
– Pasan por estados similares
– Tienen el mismo comportamiento
Clase
• Una clase es una plantilla, o prototipo, que define
las variables y los métodos comunes a todos los
objetos de cierto tipo
Instanciación
• Cuando una clase se instancia, se crea un nuevo
objeto en el sistema
• Se crea una copia de todas las variables de
instancia para almacenar el estado de este objeto
Estado
• El estado se guarda en variables
• Variables de instancia
– Cada objeto tiene su valor propio e independiente del
resto de los objetos
• Variables de clase o estáticas (static)
– El valor es compartido por todos los objetos de la clase
Métodos
• Cambian el estado del objeto
• Métodos de instancia
– Pueden acceder a variables de instancia o de clase
• Métodos de clase o estáticas (static)
– Sólo pueden acceder a variables de clase
Herencia
• Se pueden definir clases en función de otras clases
Herencia
• Superclase: clase padre
– Bicicleta es superclase de mountain-bike, tándem y
carreras.
• Subclase: clase hija
– Mountain-bike, tándem y carreras son subclases de
bicicleta
Herencia
• Las subclases heredan de la superclase el estado y
los comportamientos
– Mountain-bike, tándem y carreras tienen las variables
de marcha, velocidad y frenos y los métodos frenar, ....
• Pero pueden ser diferentes en algún aspecto
Herencia
• Las subclases pueden añadir nuevas variables y
comportamientos
– Para guardar un estado específico de la subclase
• Las subclases incluso pueden redefinir el
comportamiento de un método para adaptarlo al
nuevo estado
Herencia
• La relación superclase – clase – subclase forma
una jerarquía
• Cuanto más abajo en la jerarquía, más
especializada estará la clase
• En la cima de la jerarquía está Object
Herencia
• Se define con extends
• Java tiene herencia simple
– Una clase sólo puede tener una única superclase
Herencia
Herencia
• La subclase puede redefinir lo métodos de la
superclase
– Para adaptarlos a su definición
• Para redefinir un método, sólo hay que crear un
método en la subclase con la misma firma
(nombre + argumentos) el de la superclase
Herencia

public class Padre {


public int metodo(int a) {...}
}

public class Hija extends Padre{


public int metodo(int a) {...}
}
Herencia
• La superclase puede evitar la redefinición
mediante el modificador final

public class Padre {


public final int metodo(int a) {...}
}
this
• Dentro de un método, hace referencia al objeto al
que se aplica el método
• Sólo aparece en métodos de instancia
– Si no hay instancia, no hay this
• Se puede usar para acceder a variables aunque
estén ocultas
La variable This
• La referencia a un objeto this opuede ser usada en algún
método no-estático para referirse al objeto actual

• El uso común de la referencia this:


– Para pasar una referencia al objeto actual como parámetro a
otros métodos

someMethod(this);

– Para resolver un conflicto de nombre

• Usando this permite usar variables de instancias en métodos


que tienen variables locales con el mismo nombre
this

public class Prueba {


private int a;
public void metodo() {
int a = 0; // oculta la variable de instancia
a = 3; // accede a la variable local
this.a = 2; // accede a la variable de instancia
}
}
super
• Hace referencia a la superclase del objeto
• Muy útil al redefinir métodos
• En los constructores, para seleccionar el
constructor de la superclase
super
public class Prueba {
public void metodo() {
System.out.println(“Hola”);
}
}

public class Subprueba extends Prueba {


public void metodo() {
super.metodo(); // Accede a la superclase
System.out.println(“Adios”);
}
}
Interfaces
• Contrato que una clase (la que implementa la
interfaz) se compromete a cumplir
• Seguro para los clientes, que saben qué
comportamiento se encontrarán en las clases que
implementan la interfaz
Interfaces
• Las interfaces definen constantes y métodos que
usarán e implementarán las clases
• Las interfaces NO DEFINEN el cuerpo del
método, sólo su firma (nombre y argumentos)
Interfaces

ejemplo
Interfaces
• Las interfaces también tienen jerarquía
• Una interfaz puede extender de otra interfaz
– Hereda la definición de los métodos y las constantes
• La subinterfaz puede añadir nuevos métodos y
constantes
Interfaces
• Una clase implementa una interfaz
– public class Clase implements Interfaz
• La clase DEBE dar cuerpo a todos los métodos
definidos en la interfaz
– Si no, error de compilación
Interfaces
• Puede haber variables con tipo de la interfaz
– Interfaz a;
• Pero no se puede instancia
– a = new Interfaz() // ERROR
• Se deben asignar objetos de clases que
implementan la interfaz
Paquetes
• Subclases: organización funcional
• Paquetes: organización administrativa
• Agrupación de clases a juicio del desarrollador
• Jerarquía: javax.swing.table
Paquetes
• Para definir a qué paquete pertenece una clase,
usar la sentencia package
• Separamos subpaquetes con puntos

package cursillo.2004.ejemplos
public class Ejemplo extends Padre {
....
}
Paquetes
• Para usar clases de otros paquetes
• Referencia explícita
– cursillo.2004.ejemplos.Ejemplo1 a;
• Importación
– import cursillo.2004.ejemplos.Ejemplo1
Ejemplo1 a;
Paquetes
• Se pueden importar clases específicas
– import cursillo.2004.ejemplos.Ejemplo1
• O todas las clases de un paquete
– import cursillo.2004.ejemplos.*
• El asterisco no importa subpaquetes
• Por defecto, se importa java.lang.*
Usando objetos
• Declarar el objeto
– <clase> <identificador>
– Bicicleta miBicicleta;
• Pueden usarse clases o interfaces
– Las interfaces no se pueden instanciar
– Se instancia una clase que la implemente
Usando objetos
• La variable aún no apunta a ningún objeto
• Instanciar la clase
– <identificador> = new <clase>(<args>)
– miBicicleta = new Bicicleta();
• Se indica el constructor a emplear
– Inicializa la clase
Usando objetos

¿Qué hay mal en este programa?

public class SomethingIsWrong {


public static void main(String[] args) {
Rectangle myRect;
myRect.width = 40;
myRect.height = 50;
System.out.println("myRect's area is " + myRect.area());
}
}

NUNCA SE CREA UN OBJETO. myRect no apunta a nada.


Variables de instancia
• Acceso a variables de instancia:
<nombre>.<atributo>
– int cambio = miCoche.marcha
• Modificar variables de instancia
– miCoche.marcha = 2;
Variables de clase
• Acceso a variables de instancia:
<nombre>.<atributo>
– int cambio = miCoche.numRuedas
• Mediante la clase
<clase>.<atributo>
– int ruedas = Coche.numRuedas
Métodos de instancia
• Acceso a métodos de instancia:
<nombre>.<método>(argumentos)
– miCoche.subirMarcha();
– miCoche.setMarcha(2);
– miCoche.getMatrícula();
Métodos de clase
• Invocación de métodos de clase
<nombre>.<método>(argurmentos)
– miCoche.getNumRuedas();
• Mediante la clase
<clase>.<método>(argumentos)
– Coche.getNumRuedas()
Sobrecarga
• Pueden existir varios métodos con el mismo
nombre, pero diferentes argumentos
• En tiempo de compilación se elige el método a
invocar por los parámetros reales proporcionados

Bicicleta
Constructores
• Método especial que se invoca cuando alguien
crea un objeto de la clase
– <acceso><nombre_clase>(<args>)
• Mismo nombre que la clase
• No tiene tipo de retorno
• Sirve para inicializar el objeto
Constructores
• Si no se especifica ningún constructor, Java crea
el constructor vacío
– public Clase() {;}
• Se pueden sobrecargar los constructores para
aceptar diferentes tipos de argumentos

Bicicleta
Constructores
• Se puede invocar desde el constructor a otro
constructor de la clase
– this(argumentos)
• Se puede invocar al constructor de la superclase
para configurar las variables heredades
– super(argumentos)
• Deben ser la primera instrucción
Limpieza de objetos
• Con Java no hay que liberar la memoria
explícitamente
• El recolector de basura se encarga
• Subsistema que mira qué objetos no están
referenciados para eliminarlos
– Ninguna variable apunta al objeto
Limpieza de objetos
• Para hacer que una variable no apunte a un objeto
– Asignar otro objeto (a = b)
– Asignar el valor nulo (a = null)
• Antes de eliminar el objeto, se invoca el destructor
Destructores
• Método public void finalize()
– Declarado en Object y heredado por todas las clases
• Cuerpo: liberar recursos
• No se garantiza
– Ni en el momento en que se ejecuta
– Ni que se ejecute

Bicicleta
Seguridad en acceso
• Tanto los atributos como los métodos tienen un
calificador de acceso
• Public
– Pueden acceder todos los objetos
• Private
– Sólo puede acceder el código de la misma clase
Seguridad en acceso
• Protected
– Sólo puede acceder el código de la misma clase, de
subclases o de clases en el mismo paquete
• Package protected
– Sólo puede acceder el código de la misma clase o de
clases en el mismo paquete

accesores
Casting
• Cambiar el tipo de un objeto
• No es necesario cuando es “hacia arriba”
• Obligatorio cuando es “hacia abajo”
– Se comprueba en tiempo de ejecución
Casting

Bicicleta a = new Bicicleta();


Tandem b = new Tandem();

a = b; // No es necesario, porque un tándem es una bicicleta

b = (Tandem) a; // Es necesario porque a es una bicicleta, pero


// el compilador no sabe que hay un tandem.
// Sólo se sabe en tiempo de ejecución. Así
// que le damos la pista al compilador. Si en
// tiempo de ejecución no hay un Tándem en a,
// habrá un error de tipos en tiempo de ejecución
instanceof
• instanceof: nos informa si una variable es
instancia de determinada clase
– a instanceof Clase
– Tiene en cuenta la transitividad
• Interesante para evitar errores de conversión
(casting)
Operadores de comparación
• Comparar objetos
• Mismo objeto (=)
• Mismo contenido (equals)
• Código hash (hashCode)
• Métodos definidos en Object y redefinibles en
subclases
– = > equals > hashCode
Operadores de comparación
public boolean equals(Object anObject) {
public int hashCode() { if (this == anObject) return true;
int h = hash; if (anObject instanceof String) {
String anotherString = (String)anObject;
if (h == 0) {
int n = count;
int off = offset; if (n == anotherString.count) {
char val[] = value; char v1[] = value;
int len = count; char v2[] = anotherString.value;
for (int i = 0; i < len; i++) { int i = offset;
h = 31*h + val[off++]; int j = anotherString.offset;
while (n-- != 0) {
} if (v1[i++] != v2[j++]) return false;
hash = h; }
} return true;
return h; }
} }
return false;
}
Clases Abstracta
• Idea

Una clase que no se puede instanciar (es decir, sobre la cual no se puede usar
“new”). Pero se puede obtener clases derivada y esas ser instanciarlas.

• Sintaxis

public abstract class SomeClass {


public abstract SomeType method1(…); // sin cuerpo
public SomeType method2(…) { … } // No abstracto
}

• Motivación

.
– Garantiza que todas las subclases tendran ciertos métodos
– Permite hacer collección de tipos mezclados.
Clase Abstracta: Problema
• Usted tiene

– Clase Círculo y Rectángulos cada uno con el método getArea

• Objetivo

Obtener la suma de áreas de un arreglo de Círculos y Rectángulos

• ¿Por qué esto falla?

Object[] shapes = { new Circle(…), new Rectangle(…) … };

double sum = 0;

for(Object shape: shapes) {


sum = sum + shape.getArea();
}
33
Clase Abstract: Solución
• Shape

public abstract class Shape {

public abstract double getArea();

public void printInfo() {


System.out.println(getClass().getSimpleName() + " has area "
+ getArea());
}
}

• Circulo (y similar para Rectangulo)


public class Circle extends Shape {
public double getArea() { … }
}
34
Resumen de Visibilidad
Otros modificadores
• Final
– Para una variable: no puede ser modificada
– Para una clase: no puede ser derivada
– Para un método: no pude ser reescrito

• Synchronized
– Coloca una cerradura (lock) sobre una sección
del código o de un método.
• Solamente un hilo (thread) puede acceder el código a
la vez
Otros modificadores
volatile
─ Garantías a otros hilos a ver los cambios en la variable

transient
– Variables que no son almacenadas en objetos serialized

native

– Indica que el método es implementado usando C o C++


Comentarios y JavaDoc
• Java soporta tres tipos de comentarios

// Comentarios al final de la línea.

/* Bloque de comentarios conteniendo múltiples líneas.


Anidamiento de comentarios no esta permitido. */

/** Un JavaDoc comentario colocado antes de la defenición de la clase


y de los métodos no que no son privados.
Texto puede contener (varios) HTML tags,
Hyperlinks, y JavaDoc tags. */

• JavaDoc
Usado para generar documentación en línea
javadoc Foo.java Bar.java (o *.java)
JavaDoc Home Page

http://java.sun.com/javase/6/docs/technotes/tools/windows/javadoc.html
Arrays
• Colección de elementos del mismo tipo
• <tipo> <nombre>[]
– int precios[];
• Inicialización:
<var> = new <tipo>[<num>]
– precios = new int[80] //array de 80 precios
– bicicletas = new Bicicletas[10];
Arrays
• Si los elementos del array son tipos primitivos, se
crean y se inicializan a 0
• Si los elementos del array son tipos referencia
(Clases e Interfaces), sólo se reserva espacio para
los punteros
• Deberemos crear los objetos uno a uno para el
array (con el operador new)
Arrays
• Obtener el valor:
<nombre>[<posición>]
– int a = precios[8]
• Guardar valor:
<nombre>[<posición>] = valor
– precios[6] = 50;
Arrays multidimensionales
• <tipo> <nombre>[][]...
– int precios[][];
• Inicialización:
<var> = new <tipo>[<num>][<num>]...
– precios = new int[80][40] //array de 80x40
Arrays
• Obtener el valor:
<nombre>[<posición>][<posición>]
– int a = precios[8][10]
• Guardar valor:
<nombre>[<pos>][<pos>] = valor
– precios[6][12] = 50;
Arrays
• Los arrays no son dinámicos
– Tienen tantos elementos como se indique al crearlo y
no pueden cambiar
• Los arrays van desde 0 hasta tam – 1
• Para saber el tamaño: array.length
• Si te pasas de índice, excepción
– ArrayIndexOutOfBoundsException

arrays
Arrays

String[] ciudades = {
"Madrid", "Barcelona", "Bilbo", "Donosti",
"Gasteiz", "Iruña"
};

¿Cúal es el índice de Bilbo? 2


¿Cómo es la expresión para acceder a Bilbo? ciudades[2]
¿Cuál es el resultado de ciudades.length? 6
¿Cuál es el índice del último elemento? 5
¿Cuál es el valor de la expresión ciudades[3]? Donosti
Arrays

public class WhatHappens {


public static void main(String[] args) {
StringBuffer[] stringBuffers = new StringBuffer[10];

for (int i = 0; i < stringBuffers.length; i ++) {


stringBuffers[i].append("StringBuffer at index " + i);
}
}
}
Se crea espacio para el array, pero no se crean los objetos
StringBuffer del array, por lo que todos son nulos.
Vectores
• Clase Vector
– En paquete java.util
• Implementa un contenedor de objetos
• Es dinámico
• Puedes obtener los objetos por posición

Vectores
Iteradores
• Clase Iterator
– En paquete java.util
• Permite recorrer secuencialmente el contenido de
un vector
• hasNext()
• next()

Vectores
Cadenas de caracteres
• Java proporciona una clase
– String
• Los literales cadena: “Hola a todos”
• Se pueden asignar cadenas a variables
directamente
– String hola = “Hola mundo”;
Cadenas de caracteres
• El operador '+' concatena cadenas
– “hol” + “a Mundo”: “hola Mundo”
– String a = “Hola”;
String b = “Mundo”;
String c = a + ' ' + b; // “Hola Mundo”
• Algunos métodos de la clase String
– length()
– equals()
Cadenas de caracteres
• El método toString()
• Definido en Object
– Da el nombre de la clase y la posición de memoria del
objeto
• Se puede redefinir para que devuelva lo que
queramos

ToString

También podría gustarte