Programación Orientada a Objetos con Java Rafael Rivera López Elementos Básicos del Lenguaje Java II Ingeniería en Sistemas Computacionales Agosto-Diciembre de 2004 Veracruz, Ver. Relación entre clases Las clases se pueden relacionar de tres formas: 1. Uso directo como una variable 2. Como atributo de otras clases (composición - agregación) 3. Con herencia Para ejemplificar estas relaciones se utiliza una clase llamada Punto Ejemplo de Clase: Punto public class Punto { protected int x,y; public Punto(int x, int y) { this.x = x; this.y = y; public void (int x, int y) { this.x = x; this.y = y; public void desplazar(int dx, int dy) { x += dx; y += dy; public int () { return x; public int gety() { return y; Uso Directo!" #
Uso directo Cuando se utiliza un objeto como variable local de un método, se está aplicando la relación de uso directo UsoPuntos main(string args[ ]) { Puntos p = new Puntos(10,10); main Uso directo class UsoPuntos { public static void main(string[] args) { // Punto p; p = new Punto(14,27); System.out.println("("+p.()+","+p.getY()+")"); p.(100, 50); System.out.println("("+p.()+","+p.getY()+")"); p.desplazar(10, -5); System.out.println("("+p.()+","+p.getY()+")"); // La clase no tiene (14,27) atributos, pero usa (100,50) directamente un objeto de la clase Point (110,45) Se pueden utilizar objetos de una clase como atributos de otra clase. Esto se llama composición, ya que la nueva clase está compuesta de objetos de otras clases. La composición utiliza la funcionalidad del código, no su forma. Un triángulo tiene tres puntos Un auto tiene cuatro ruedas y un motor La relación entre dichas clases es tiene class Triangulo { private Punto vertice[] = new Punto[3]; public Triangulo (Punto p1, Punto p2, Punto p3) { vertice[0] = new Punto(p1.(), p1.gety()); vertice[1] = new Punto(p2.(), p2.gety()); vertice[2] = new Punto(p3.(), p3.gety()); public void desplazar(int dx, int dy) { for(int i=0;i<3;i++) vertice[i].desplazar(dx,dy); public void mostrar() { for(int i=0;i<3;i++) System.out.println("Vértice "+(i+1)+ "("+vertice[i].()+","+vertice[i].gety()+")");!" $
public class UsoTriangulos { public static void main(string [] args) { Triangulo triangulo = new Triangulo(new Punto(10,10), new Punto(20,40), new Punto(40,50)); System.out.println("Triangulo creado"); triangulo.mostrar(); triangulo.desplazar(30,25); System.out.println( "Triangulo desplazado"); triangulo.mostrar(); Triangulo creado Vértice 1(10,10) Vértice 2(20,40) Vértice 3(40,50) Triangulo desplazado Vértice 1(40,35) Vértice 2(50,65) Vértice 3(70,75)... desplazar x,y vertice[0] mostrar vertice[1] x,y x,y vertice[2] Triangulo El triangulo tiene tres vértices Se puede utilizar una clase como base para crear otra clase Esto se llama herencia ya que una nueva clase obtiene atributos y comportamiento de otra. La herencia utiliza la forma de una clase para adecuarla a otra La herencia implementa la relación es un Un pixel es un punto con color Un administrador es un empleado con más funciones Usando herencia, se puede construir una jerarquía de tipos que expresa el problema en sus partes. Punto x y Punto() () desplazar() () gety() Pixel Color Pixel() setcolor() getcolor() La clase derivada tiene la misma interfaz de la clase base y podría adicionar atributos y métodos setcolor getcolor Pixel x y color gety desplazar!" %
Al instanciar una clase derivada, este usa un constructor de la clase base La instancia de la clase base busca siempre un constructor sin parámetros en la clase base Se puede indicar que constructor de la clase base usar, utilizando la referencia super() public class 1 { public static void main(string [] args){ Hijo1 hijo=new Hijo1(); System.out.println("El cabello es: "+hijo.cabello); hijo.nadar(); hijo.chatear(); class Padre1 { int cabello; void nadar(){ System.out.println( Se nadar ); ; class Hijo1 extends Padre1 { void chatear(){ System.out.println( Se chatear ); Extends indica que Hijo1 hereda de Padre1 Se usa un constructor por omisión y la instancia busca un constructor de la clase Padre que también es por omisión public class 2{ public static void main(string [] args){ Hijo2 hijo=new Hijo2(); System.out.println("El cabello es:"+hijo.cabello); hijo.nadar(); hijo.chatear(); class Padre2 { int cabello; public Padre2() { cabello=1; void nadar(){ System.out.println("Se nadar"); ; class Hijo2 extends Padre2 { void chatear(){ System.out.println("Se chatear"); Se usa un constructor por omisión y la instancia busca un constructor de la clase Padre que es un constructor sin parámetros public class 3{ public static void main(string [] args){ Hijo3 hijo=new Hijo3(3); class Padre3 { int cabello; public Padre3(int tipo) { cabello=tipo; class Hijo3 extends Padre3 { public Hijo3(int tipo){ super(tipo); Como la clase base no tiene constructor sin parámetros, la clase derivada lo debe llamar con la referencia super() Ejemplo de import java.awt.*; public class Pixel extends Punto { private Color color; public Pixel (int x, int y, Color color) { super(x,y); this.color = color; public Color getcolor() { return color; super(x,y) llama al constructor de la clase padre (point) La clase Pixel hereda los atributos de Point Ejemplo de class UsoPixel { public static void main(string[] args) { Pixel p = new Pixel(10,10,java.awt.Color.cyan); System.out.println( "(" + p.()+","+p.gety()+")"+p.getcolor()); p.desplazar(40, 30); System.out.println( "(" + p.()+","+p.gety()+")"+p.getcolor()); SALIDA: (10,10)java.awt.Color[r=0,g=255,b=255] (50,40)java.awt.Color[r=0,g=255,b=255] El objeto p tiene los métodos de point!" &
La clase Object Java define la clase java.lang.object que se entiende como una super-clase de todas las clases. II.6 Si una clase no especifica de que clase se deriva, entonces se deriva de la clase Object. Modificador static El modificador static Asocia al miembro (variable o método) con la clase más que con el objeto Los métodos declarados como static no actúan sobre un objeto particular Se puede escribir una clase que sea un conjunto de miembros estáticos, esta clase no define un nuevo objeto, sino que es una librería de utilierías que tienen relación entre ellas. Métodos estáticos public class Math { // Calcula en seno public static double sin(double x) { // // Calcula el logaritmo public static double log(double x) { // sin y log son métodos estáticos, no se asocian a ningún objeto Métodos estáticos Variables estáticas Cuando se llama a un método estático, se debe indicar la clase a la que pertenece: Una variable que es declarada como estática es asociada con la clase, no con alguna instancia de ella. double x = Math.sin(alpha); int c = Math.max(a,b); double y = Math.random(); El método main es static; es invocado por el sistema sin crear un objeto. Si un método estático llama a otro método estático de la misma clase se puede omitir el nombre de la clase. Las variables estáticas se conocen como variables de clase. Se considerarían como variables globales.!" '
Variables estáticas public class Billetes { private int cantidad; private int numeroserie; private static int contadorbilletes; public Billetes(int cantidad) { this.cantidad = cantidad; contadorbilletes++; numeroserie = contadorbilletes; public int vernumeroserie() { return numeroserie; En el Constructor se actualiza la variable estática que sirve como un contador global La variable contadorbilletes es estática Variables estáticas public static void main(string[] args) { Billetes billetes[] = new Billetes[20]; for(int i=10;i<30;i++){ billetes[i-10] = new Billetes(10); System.out.println("El número de serie es :" + (billetes[i-10].vernumeroserie())); Cada billete tiene su número de serie único this y static Miembros de clase y static No existe this para un miembro static. Puede llamar a un método static de la misma clase, sin un objeto. Puede referenciar a un miembro estático sin existir un objeto. Todos los métodos no estáticos tienen acceso a todos los datos de una clase. Integer.parseInt( 123 ); Calendar.SUNDAY Los métodos estáticos de la clase tienen acceso solo a los datos estáticos.!" (