Title: Clases
1Clases
2CLASES
- Una clase contiene miembros que son datos y
métodos. Existen modificadores de miembros, y
modificadores de clase - Datos análogos a estructuras en C. Los objetos en
Java son equivalentes a punteros a estructuras en
C. - Todos los datos se inicializan automáticamente a
valores por defecto (por ejemplo, datos numéricos
a 0 y datos de referencia a null). Se puede dar
otro valor al declarar la variable - Lo mismo ocurre con elementos de arrays (porque
son también objetos)
3Ejemplo
- class Ejemplo
- public static void main (String args)
- VectorPlano v new VectorPlano()
- // constructor por defecto
- System.out.println("Vector creado ("
- v.origenX ","
- v.origenY ","
- v.extremoX ","
- v.extremoY ")")
-
-
- class VectorPlano
- double extremoX, extremoY
- double origenX1, origenY2
4Modif. de miembros de una clase
- En el siguiente orden se suelen especificar los
modificadores - 1) quién puede acceder a este miembro?
- 2) es miembro de clase o de instancia (u
objeto)? - 3) es modificable?
5Miembros no modificables
- La palabra final indica que una variable no es
modificable (o un método no es redefinible en
subclases) - public class Prueba
- public static void main (String args)
- Alfa anew Alfa()
- // ilegal a.x4
- //También posible
- final int y 7
-
-
- class Alfa
- final int x4
-
6Datos miemb. de instancia (u objeto) o de clase
- static especifica que un dato es un miembro de
clase. Se utiliza sólo un hueco de memoria en la
clase (Ejemplo número de miembros de una clase) - ltnombre-clasegt.ltdatogt se utiliza para acceder un
dato de clase - Si no se utiliza static, se considera un dato es
miembro de instancia. Se crea un hueco de memoria
para cada objeto creado de la clase - ltnombre-objetogt.ltdatogt se utiliza para acceder un
dato de objeto
7Ejemplo
- class Ejemplo
- public static void main (String args)
- Punto p1 new Punto(),
- p2 new Punto()
- System.out.println("Precision "
- Punto.precision)
- // p1.precision tambien es valido (pero
- // no habitual)
- System.out.println(Valor de x en p2"
- p2.x)
-
-
- class Punto
- double x, y
- static double precision
-
8Métodos miembro de objeto o de clase
- static especifica que un método es un miembro
de la clase. - ltnombre-clasegt.ltmétodogt se utiliza para ejecutar
un método de clase - Si no se utiliza static, se considera que es un
método de objeto - ltnombre-objetogt.ltmétodogt se utiliza para ejecutar
un método de objeto - En un método de objetos se accede al código
definido en la clase (no se duplica para cada
objeto como en datos de objeto)
9Llamadas permitidas en métodos
- Variables
- Parámetros del método
- Variables locales del método
- Para métodos de objeto se puede utilizar la
variable this que representa al mismo objeto - Datos miembro (para métodos static, sólo es
posible el uso de datos static) - Métodos
- Métodos miembro (para métodos static, sólo es
posible el uso de métodos static)
10Ejemplo
- class Ejemplo
- public static void main (String args)
- Punto p1 new Punto(), p2new Punto()
- System.out.println("Valor de y para p1 "
p1.y) - double zPunto.cubo(2)
- // tambien valido p1.cubo(2), pero no habitual
- p1.transladar(2, z)
- System.out.println("Valor de y para p1 "
p1.y) -
-
- class Punto
- double x, y
- void transladar(double a, double b)
- xa // tambien valido this.x (incluso
Punto.this.x) - yb // tambien valido this.y
-
- static double cubo(double n)
- return nnn
-
11Modific. de acceso a miemb. de una clase
- public, private, ninguno, protected uso en
variables (estáticas o no), métodos (estáticos o
no) y constructores - public accesible por cualquier clase (una
estructura de C es una clase con todos sus
miembros datos públicos) - private accesible sólo dentro de la clase
- ninguno accesible para clases dentro del mismo
paquete - protected sería accesible dentro de una clase C
si - la clase C está en el mismo paquete
- la clase C está en otro paquete, pero es
descendiente - Observación (caso de variable no estática) sería
válido this.miembro, super.miembro o
objeto.miembro, donde objeto sería de tipo C
o descendiente (caso anómalo no valdría si el
tipo de objeto fuera la clase en donde se
definió la variable protected), - La variable super no es totalmente equivalente
a this. Por ejemplo super no se puede asignar
a un objeto. Sólo se puede utilizar
super.ltmétodo-o-variablegt. Es sólo una
referencia a la llamada a la superclase. - Observación (caso de variable estática) sería
válido clase.miembro para cualquier clase
descendiente de la clase donde se definió la
variable protected
12Ejemplo
- class Ejemplo
- public static void main (String args)
- Beta bnew Beta()
- b.metodoDeAcceso()
-
-
- class Alfa
- private int x
- public int y
- private void f()
- System.out.println("Metodo privado")
-
-
- class Beta
- void metodoDeAcceso ()
- Alfa a new Alfa()
- a.y20 // legal porque y es publico
- // a.x 10 ilegal porque x es
privado - // a.f() illegal porque f es
privado
13Modificador vacío de acceso a miembros
- Acceso para clases de un paquete (un conjunto de
clases relativas a un tema en común, y que están
contenidas en el mismo directorio) - class Ejemplo
- public static void main (String args)
- Beta bnew Beta()
- b.metodoDeAcceso()
-
-
- class Alfa
- int x
-
- class Beta
- void metodoDeAcceso ()
- Alfa a new Alfa()
- a.x 10 // legal porque x no tiene
modificador - System.out.println("Metodo de acceso en
beta") -
-
14Ejemplo
- out es una variable static (de clase) y public
de la clase System. System.out es un objeto
predefinido en Java que es el standard output - println es un método de objeto que se puede
aplicar al standard output - Son equivalentes
- La ejecución del intérprete
- c\gtjava Ejemplo alfa beta
- La ejecución de las instrucciones
- String argsalfa, beta
- Ejemplo.main(args)
15Constantes en Java
- Variables públicas, estáticas y finales
- public class Prueba
- public static void main (String args)
- System.out.println("Valor de pi "
- Alfa.CONSTANTE_PI)
-
-
- class Alfa
- public static final double CONSTANTE_PI
3.14 -
16Modificadores de clase
- En el siguiente orden se suelen especificar
- 1) quién puede acceder a esta clase?
- public (cualquier clase)
- Vacío (clases en el mismo paquete)
- 2) es una clase abstracta (no admite
instancias)? (abstract) - 3) se le pueden crear subclases? (final)
17Sobrecarga (overloading) de métodos
- class Ejemplo
- int a
- int suma (int b)
- return a b
- int suma (byte b)
- return a b 100
- double suma(double b)
- return this.a b
- int suma(int x, int y)
- return this.axy
- public static void main(String args)
- Ejemplo j new Ejemplo() byte u34
- System.out.println("sumando un byte "
j.suma(u)) - // en casos ambiguos se elige método más
especializado - System.out.println("sumando un double "
- j.suma(34.22))
- System.out.println("sumando dos enteros
" - j.suma(45, 6))
-
18Constructores
- Toda clase tiene un constructor por defecto sin
argumentos (si no hay definido ningún otro
constructor) - Se puede crear un nuevo constructor sin
argumentos - Se puede hacer sobrecarga de constructores
- La llamada a un constructor de una clase se puede
realizar dentro de esa clase mediante
this(...). Esta llamada sólo se puede realizar
desde otro constructor de la clase y debe ser la
primera instrucción. - Los únicos modificadores que admite un
constructor son los de privacidad public,
private, protected, o vacío.
19Ejemplo
- class Ejemplo
- public static void main(String args)
- Punto p1new Punto(), p2new Punto(2,3)
- , p3new Punto()
- System.out.println("Punto p1 " p1)
- class Punto
- double x, y
- Punto () this.x2
this.y3 - Punto (double x, double y)
- this('c', x, y)
- Punto (char sistemaCoordenadas, double a,
double b) - switch (sistemaCoordenadas)
- case 'p' // coordenadas polares
- this.xaMath.cos(b)
- this.yaMath.sin(b)
- break
- case 'c' // coordenadas
cartesianas - this.xa
- this.yb
20Código de inicialización static
- Código de inicialización que se ejecuta una sola
vez por cada clase - class Ejemplo
- public static void main(String args)
- String s"abc"3
- System.out.println("Valor de s " Alfa.s)
-
- class Alfa
- static int x
- static String s
- static
- x3
- s"Ejemplo"
-
-
21Invocación de métodos
- Los parámetros siempre se pasan por valor (clases
son tipos referencia, o punteros) - class PasoPorValorDeTiposPrimitivos
- public static void main(String args)
- double uno 1.0
- System.out.println(antes uno uno)
- // Se obtiene antes uno 1.0
- dividir(uno)
- System.out.println(despues uno uno)
- // Se obtiene despues uno 1.0
-
- public static void dividir(double arg)
- arg / 2.0
- System.out.println(dividido arg arg)
-
22Invocación de métodos (cont)
- class PasoPorValorDeTiposReferencia
- public static void main(String args)
- Astro sirius new Astro("Sirius")
- System.out.println("antes " sirius.nombre)
- // Se obtiene antes Sirius
- f(sirius)
- System.out.println("despues "
sirius.nombre) - // Se obtiene antes Uranus
-
- public static void f (Astro a)
- a.nombre "Uranus"
- a null
-
-
- class Astro
- String nombre
- Astro (String nombre)
- this.nombrenombre
-
23Otros modificadores para métodos
- public private ...
- static ...
- abstract (código vacío a definir en subclases)
- native (código nativo escrito en otro lenguaje,
como C, ...) - synchronized (mismo método actuando sobre los
mismos datos) - tipo de retorno
- nombre del método
- parametros del método
- Excepciones que puede lanzar
24Excepciones
- Objetos que se generan cuando surge algún tipo de
situación anómala (como por ejemplo un error) - Son descendientes de la clase Exception
- Excepciones en tiempo de ejecución descendientes
de clase RuntimeException (hija de Exception) - En la cabecera de un método se declara que un
método puede lanzar una serie de excepciones - f (argumentos) throws Excepcion1, Excepcion2, ...
Excepcionn
25Ejemplo
- Clase Integer
- public static int parseInt(String s) throws
NumberFormatException - Parses the string argument as a signed
decimal integer. The characters in the string
must all be - decimal digits, except that the first
character may be an ASCII minus sign '-' to
indicate a negative - value.
- Parameters
- s - a string.
- Returns
- the integer represented by the argument
in decimal. - Throws NumberFormatException
- if the string does not contain a
parsable integer. - Observación NumberFormatException es
descendiente - de RuntimeException
26Ejemplo
- class Ejemplo
- public static void main(String args)
- String numero "32A4"
- int n Integer.parseInt(numero)
- System.out.println("El numero es " n)
-
-
- Build Successful
- java.lang.NumberFormatException 32a4
- at java.lang.Integer.parseInt(Integer.java240)
- at java.lang.Integer.parseInt(Integer.java278)
- at Prueba.main(Ejemplo.java5)
- at MainThread.run(Agent.java57)
- Application terminated
27Excepc. que no son de tiempo de ejecución
- Si se tiene un método f con cabecera
- ... f (ltargumentosgt) throws Excepcion1
- en donde Excepcion1 no es de tiempo de ejecución
- entonces cualquier otro método g que llame a f
debe hacer alguna de las dos cosas siguientes - ... g (ltargumentosgt) throws Excepcion1
- O cualquier excepción ascendiente de Exception1
- Capturar la excepción
28Ejemplo
- Clase BufferedReader
- public String readLine() throws IOException
- import java.io.
- class Ejemplo
- public static void main(String args) throws
IOException - BufferedReader teclado new BufferedReader(
- new InputStreamReader(System.in))
- System.out.print("Nombre ")
- String steclado.readLine()
- System.out.println("Nombre introducido
" s) -
-
29Ejemplo de robot
- Clase Robot. Un objeto situado en el plano con
coordenadas enteras. Interfaz publica - Constructores
- public Robot (int)
- public Robot (int, int)
- Datos ninguno
- Métodos
- public static int robotsCreados ()
- public int posicionX()
- public int posicionY()
- public void avanzar (int, int)
- public void avanzar (int)
- public void situar ()
30Ejemplo de robot (cont)
- class Ejemplo
- public static void main(String args)
- Robot r1new Robot(1), r2new Robot(2,3)
- r1.avanzar(3) r2.avanzar(3,5)
- System.out.println("Numero de robot
creados " - Robot.robotsCreados())
- r1.situar()
- r2.situar()
-
-
- public class Robot
- private int x, y
- private static int numeroRobots0
- public static int robotsCreados ()
- return numeroRobots
-
31Ejemplo de robot (cont)
- public int posicionX ()
- return this.x
- public int posicionY ()
- return this.y
- public Robot (int z)
- numeroRobots1
- this.xz this.yz
- public Robot (int x, int y)
- numeroRobots1
- this.xx this.yy
- public void avanzar (int a, int b)
- this.xa this.yb
- public void avanzar (int a)
- this.xa this.ya
-
- public void situar ()
- System.out.print("Coord. horizontal "
this.x) - System.out.println("Coord. vertical "
this.y) -
32Paquetes
- Un paquete es un conjunto de clases contenidas en
un directorio - Un classpath es un conjunto de directorios y de
ficheros comprimidos de clases. Sirve para
acceder a clases en diferentes paquetes (en
compilación o en ejecución). - Ejemplo de un classpath puede ser el valor de
la variable de entorno CLASSPATH (al compilar y
ejecutar desde línea de comandos) - CLASSPATH
- . c\ejemplos\robots\
- c\java\classes\classes.zip
- classes.zip (o .jar) \java\io\BufferedReade
r.class - \java\lang\System.class
- ...
33Paquetes (cont)
- Instrucción import permite acceder a una clase
situada en otro paquete - Ejemplo import java.io., import
java.io.BufferedReader - Camino de búsqueda se especifica en el CLASSPATH
(busca en ficheros comprimidos y en directorios
concatenando el nombre del paquete como
directorio) - Se puede llamar también a la clase
java.io.BufferedReader sin utilizar
explícitamente import - Los únicos paquetes importados por defecto en
cualquier programa son java.lang. (clase
System, String, ...) y el paquete en uso
34Paquetes (cont)
- Instrucción package define la ubicación (el
paquete) de una clase - Ejemplo
- package ejemplos.robots
- public class Robot ...
- El fichero Robot.java (y el Robot.class)
pueden estar ubicados en un ltdgt\ejemplos\robots\
, en donde ltdgt es un directorio contenido en el
CLASSPATH - Al no especificar un paquete para una clase, se
introduce en un default package
35Algunos paquetes en J2SE, 5.0
- package java.applet
- package java.awt
- package java.awt.event
- package java.beans
- package java.io
- package java.lang
- package java.lang.reflect
- package java.math
- package java.net
- package java.rmi
- package java.security
- package java.sql
- package java.text
- package java.util
- package java.util.zip
- package javax.swing
- package org.xml.sax
36Clases de java.lang
- Tipos primitivos encapsulados en clases Boolean,
Byte, Character, Double, Float, Integer, Long,
Short, Void - Ejemplo Integer (interfaz pública)
- public final class Integer extends Number
- Variables
- MAX_VALUE (valor mayor de int)
- MIN_VALUE (valor mínimo de int)
- Constructores
- Integer(int)
- Integer(String)
- Métodos
- Conversión a otros tipos doubleValue(),
floatValue(), intValue(), parseInt(String),
toString(), valueOf(String) - Obtención de valor como un int intValue()
37Clases de java.lang (cont)
- Clases para cadenas de caracteres
- clase String conjunto de caracteres no
modificable - clase StringBuffer conjunto de caracteres
modificable - public final class String extends Object
implements Serializable, ComparableltStringgt,
CharSequence - Constructores
- String(byte)
- String(char)
- String(String)
- Ejemplos
- char chars a,b,c
- String s new String(chars)
- String s1 Hello
- String s2 new String(s1)
38Métodos de la clase String
- Métodos de manipulación de strings
- length() , concat(String), indexOf(String),
lastIndexOf(String) , toUpperCase(), ... - Métodos de conversión desde otros tipos
- valueOf(double), valueOf(int), ...
- Operador en strings está sobrecargado
(overloaded) - 3abc3.4
- Igualdad equals(Object)
- char arr 'a','b','c'
- String s1abc, s2abc,
- s3new String(arr)
- s1s2 (verdadero) (por eficiencia) s1.equals(s2)
(verdadero) - s1s3 (falso)
s1.equals(s3) (verdadero)
39Clase StringBuffer
- Cadena de caracteres modificable. Existe una
capacidad inicial (si se sobrepasa,
automáticamente aumenta) - public final class StringBuffer extends Object
implements Serializable - Constructores
- StringBuffer() -gt capacidad inicial de 16
caracteres - StringBuffer(int c) --gt c capacidad inicial
- StringBuffer(String s) --gt capacidad
inicials.length()16 caracteres - Métodos de manipulación
- append (String), charAt(int), length(),
insert(int, String), reverse(), toString(),
setLength(int) - Son equivalentes
- x "a" 4 "c
- x new StringBuffer().append("a").append(4).appen
d("c") .toString()
40Otras clases de java.lang
- Clase Math
- Constantes E, PI
- Métodos abs(double), acos(double), asin(double),
atan, cos, exp, log, max(double, double),
pow(double, double), round (float) - Clase System
- Variables (estáticas)
- in "standard input stream. Normalmente es el
teclado - out "standard output stream. Normalmente es
ventana de mensajes - err "standard" error output stream. Normalmente
es ventana de mensajes - Métodos getProperties(), gc() que fuerza a hacer
garbage collection
41Otros paquetes y clases
- Package java.util
- Clase Date, HashMap, StringTokenizer
- Package java.text
- Clases DateFormat, DecimalFormat, ... Sirven para
variantes de formato - Package java.math
- Clases BigDecimal, BigInteger. Arbitraria
precisión y capacidad
42Número variable argumentos (versión 1.5)
- En llamadas se permiten también tipos primitivos
(en cuyo caso se generan objetos de sus tipos
wrappers asociados) - class C
- public static void f (int x, Object ... args)
- System.out.println("Valor"
- args0.getClass())
- System.out.println("Valor"
- args1.getClass())
-
-
- public class Main
- public static void main(String args)
- C.f(3, 4, "hola")
-
-
- Valorclass java.lang.Integer
- Valorclass java.lang.String
- - Implícitamente se está haciendo
- argsnew Integer(4), hola
- - Es un proceso similar a la asignación de
argumentos de un programa al argumento del método
main
43System.out.printf (versión 1.5)
- printf(String format, Object... args)
- Número variable de argumentos (admite tipos
primitivos también) - Equivalentes
- System.out.format(String format, Object... args)
- public static String String.format (...)
- Un string de formato
- System.out.printf("La raiz cuadrada de d es
010.4fn", 2, Math.sqrt(2)) - La raiz cuadrada de 2 es 0001,4142
- n ? salto línea 0 (muestra el y rellena
con 0) - Formato
44Generics (versión 1.5)Ejemplos
- class A ltT1, T2gt // A es una clase genérica
con - // parámetros T1 y T2
- A () // error poner AltT1,T2gt
- T1 f () return null T2 g() return
null - // Error porque no se permite hacer new
- // T2 g() return new T2()
- // Error porque en llamadas estáticas no es
accesible T1 - // (la alternativa sería usar un método
générico) - // static T1 h() return null
- static void h()
-
- class B // f y g son métodos genéricos con
parámetros T1y T2 - static ltT1, T2gt T1 f () return null
- static ltT1, T2gt T2 g () return null
-
- public class Main
- public static void main(String args)
- // Invocación de una clase genérica
- AltString,StringBuffergt x new
AltString,StringBuffergt()
45Generics (versión 1.5) (II)
- Dos tipos
- Clases genéricas
- Las parámetros son accesibles en variables y
métodos de objeto. Se invocan dando valores a los
parámetros (no pueden ser tipos primitivos)
mediante NombreClaseltparámetros-con-valores
gt - Métodos (de clase o de objeto) genéricos
- Invocación sin dar valores directos a los
parámetros - Otros posibles usos en parámetros
- En la definición del parámetro también se puede
utilizar (en lugar del parámetro C, a secas) por
ejemplo - ltC extends Agt
- En una invocación a una clase genérica, se puede
utilizar el comodín ? y también super
(ascendiente, incluyendo la clase) y extends
(descendiente, incluyendo la clase). Ejemplo - Listlt? super Numbergt
- Listlt? extends Numbergt
46Clase java.util.ArrayListltEgt
- Representa un conjunto variable de objetos
(análogo a StringBuffer) - Existe una capacidad (variable con el tiempo,
creciente o decreciente) - Es una alternativa al uso de arrays
- Constructores
- ArrayList() ? vacío con capacidad inicial de 10
- ArrayList(int initialCapacity)
47Clase java.util.ArrayListltEgt (cont)
- Métodos
- public void add(int index,
E element) - boolean contains(Object)
- Utilizando equals
- E get(int index)
- public E remove(int index)
- void set(int index, E element)
- int size()
- IteratorltEgt iterator()
48Ejemplo
- Import java.util.
- class Ejemplo
- public static void main(String args)
- String s1 "elemento1", s2 "elemento2",
- s3 "elemento3"
- String array s1, s2, s3
- ArrayListltStringgt lista new
ArrayListltStringgt() - lista.add(s1)
- lista.add(s2)
- lista.add(s3)
- System.out.println("Las componentes del
array son ") - for(int i0 ilt3 i)
- System.out.println(arrayi)
-
- System.out.println("Las componentes de
la lista son ") - for (int i0 iltlista.size() i)
- System.out.println(lista.get(i))
-
- // También es posible lo siguiente
49Combinación versiones 1.4 y 1.5 con generics (I)
- ALGUNOS/AS EJEMPLOS/REGLAS DE COMPILACIÓN
- Son una combinación de reglas clásicas de
compilación incorporando reglas para casos de
clases genéricas - ArrayListltStringgt l1new ArrayListltStringgt()
- ArrayListltStringgt l2new ArrayList()
- ArrayList l3new ArrayListltStringgt()
- l1.add("hola") l2.add("hola") l3.add("hola")
- String s1 l1.get(0) String s2 l2.get(0)
- // String s3 l3.get(0) Error de
compilación - System.out.println("Clase1" l1.getClass())
- System.out.println("Clase2" l2.getClass())
- System.out.println("Clase3" l3.getClass())
- Clase1class java.util.ArrayList
- Clase2class java.util.ArrayList
- Clase3class java.util.ArrayList
-
- Observación1 la clase utilizada es la misma.
Sólo hay diferencias en tiempo de compilación
50Análisis de problema (diseño de clases)
- Clase Punto2D (concepto un punto en dos
dimensiones) - Interfaz pública
- Constructores
- public Punto2D (double x, double y)
- Métodos
- public double datoX()
- public double datoY()
- public String comoString ()
- public boolean pertenece (Recta2D recta)
- Clase Recta2D (concepto una recta en dos
dimensiones) - Interfaz pública
- Constructores
- public Recta2D (Punto2D p1, Punto2D p2)
- public Recta2D (double a, double b, double
c) - Métodos
- public Punto2D primerPunto()
- public Punto2D segundoPunto()
- public String comoString ()
- public boolean pertenece (Punto2D p)
51Ejemplo (cont)
- public class Ejemplo
- public static void main(String args)
- Punto2D p1 new Punto2D(1, 1),
- p2 new Punto2D(2, 2)
- Recta2D r1 new Recta2D(p1, p2),
- // r2 es la recta xy-10
- r2 new Recta2D(1, 1, -1)
- Punto2D inters r1.interseccion(r2)
- System.out.println("La interseccion de la
recta " - r1.comoString()
- " y de la recta "
- r2.comoString()
- " es el punto "
- inters.comoString())
- // La interseccion de
- // la recta RectaPunto (1.0, 1.0), Punto (2.0,
2.0) y - // de la recta RectaPunto (0.0, 1.0), Punto
(1.0, 0.0) es - // el punto Punto (0.5, 0.5)
-
52Ejemplo (cont)
- public class Punto2D
- private double x, y
- public Punto2D (double x, double y)
- this.xx
- this.yy
-
- public double datoX()
- return this.x
-
- public double datoY()
- return this.y
-
- public String comoString ()
- return "Punto (" this.x ", " this.y
")" -
- public boolean pertenece (Recta2D recta)
- return recta.pertenece(this)
-
53Ejemplo (cont)
- public class Recta2D
- private Punto2D p1, p2
- // Recta a partir de dos puntos
- public Recta2D (Punto2D p1, Punto2D p2)
- this.p1p1
- this.p2p2
-
- // Recta axbyc0
- public Recta2D (double a, double b, double c)
- this(new Punto2D(0, -c/b), new
Punto2D(-c/a, 0)) -
- public Punto2D primerPunto()
- return this.p1
-
- public Punto2D segundoPunto()
- return this.p2
-
- public String comoString ()
- return "Recta"
54Ejemplo (cont)
- public boolean pertenece (Punto2D p)
- return (p.datoX()-this.p1.datoX())
- /(this.p2.datoX()- this.p1.datoX())
- (p.datoY()-this.p1.datoY())
- /(this.p2.datoY()-this.p1.datoY())
-
- public Punto2D interseccion (Recta2D recta)
- double x1this.primerPunto().datoX(),
- y1this.primerPunto().datoY(),
- x2this.segundoPunto().datoX()
, - y2this.segundoPunto().datoY()
, - x1_recta.primerPunto().datoX(
), - y1_recta.primerPunto().datoY(
), - x2_recta.segundoPunto().datoX
(), - y2_recta.segundoPunto().datoY
(), - ay2-y1, bx1-x2,
cx1(y2-y1)y1(x1-x2), - dy2_-y1_, ex1_-x2_,
- fx1_(y2_-y1_)y1_(x1_-x2_),
- detae-bd
55Un nuevo diseño de clases
- clase ClaseAlumnos (contiene un conjunto de
alumnos) - Interfaz pública
- Constructor
- public ClaseAlumnos (String nombre)
- Métodos
- public String nombreClase ()
- public void matricular (Alumno a)
- public String descripcion ()
- Método de clase
- public static int numeroDeClasesCreadas ()
- clase Alumno (representa un alumno asignado a una
sola clase de alumnos) - Interfaz pública
- Constructor
- public Alumno (String nombre, int edad)
- Métodos
- public ClaseAlumnos obtenerClase ()
- public void asignarClase (ClaseAlumnos c)
56Ejemplo (cont)
- public class Ejemplo
- public static void main(String args)
- ClaseAlumnos c1new ClaseAlumnos("Tercero"),
- c2new ClaseAlumnos("Segundo
") - Alumno a1new Alumno("Juan", 21),
- a2new Alumno("Ana", 22),
- a3new Alumno("Luis", 23),
- a4new Alumno("Sonia", 23)
- c1.matricular(a1) c1.matricular(a2)
- c2.matricular(a3) c2.matricular(a4)
- System.out.println("Numero de clases de
alumnos " - ClaseAlumnos.numeroDeClasesC
readas()) - System.out.println(c1.descripcion())
- System.out.println(c2.descripcion())
-
-
57Ejemplo (cont)
- Numero de clases de alumnos 2
- Clase Tercero (alumnos 2)
- Alumno Juan (21 años, clase Tercero)
- Alumno Ana (22 años, clase Tercero)
- Clase Segundo (alumnos 2)
- Alumno Luis (23 años, clase Segundo)
- Alumno Sonia (23 años, clase Segundo)
58Ejemplo (cont)
- public class ClaseAlumnos
- private int numAlumnos
- private static int numClases0
- private String nombre
- private ArrayListltAlumnogt alumnos
- new ArrayListltAlumnogt()
- public ClaseAlumnos (String nombre)
- this.nombrenombre
- numClases
-
- public String nombreClase ()
- return this.nombre
-
- public static int numeroDeClasesCreadas ()
- return numClases
-
- public void matricular (Alumno a)
- a.asignarClase(this)
- numAlumnos
59Ejemplo (cont)
- public String descripcion ()
- StringBuffer snew StringBuffer("Clase "
-
this.nombre " (alumnos " -
this.numAlumnos ")") - for (int i0 iltthis.alumnos.size() i)
- Alumno alumnothis.alumnos.get(i)
- s.append("\n "
alumno.descripcion()) -
- return s.toString()
-
-
60Ejemplo (cont)
- public class Alumno
- private String nombre
- private int edad
- private ClaseAlumnos clase
- public Alumno (String nombre, int edad)
- this.nombrenombre
- this.edadedad
-
- public ClaseAlumnos obtenerClase ()
- return this.clase
-
- public void asignarClase (ClaseAlumnos c)
- this.clasec
-
- public String descripcion ()
- return "Alumno " this.nombre " ("
this.edad - " años, clase "
this.clase.nombreClase() - ")"
-
61Versión con generics, I, (ver tras herencia)
- public class Main
- public static void main(String args)
- ClaseltAlumnogt c1new ClaseltAlumnogt("Tercero")
, - c2new ClaseltAlumnogt("Segund
o") - Alumno a1new Alumno("Juan", 21),
- a2new Alumno("Ana", 22),
- a3new Alumno("Luis", 23),
- a4new Alumno("Sonia", 23)
- c1.matricular(a1) c1.matricular(a2)
- c2.matricular(a3) c2.matricular(a4)
- System.out.println("Numero de clases de
alumnos " - Clase.numeroDeClasesCreadas(
)) - System.out.println(c1.descripcion())
- System.out.println(c2.descripcion())
-
62Versión con generics, II
- class ClaseltT extends Alumnogt
- private int numElementos
- private static int numClases0
- private String nombre
- private ArrayListltTgt elementos
- new ArrayListltTgt()
- public Clase (String nombre)
- this.nombrenombre
- numClases
-
- public String nombreClase ()
- return this.nombre
-
- public static int numeroDeClasesCreadas ()
- return numClases
-
- public void matricular (T a)
- a.asignarClase(this)
63Versión con generics, III
- public String descripcion ()
- StringBuffer snew StringBuffer("Clase "
-
this.nombre " (elementos " -
this.numElementos ")") - for (T elem elementos)
- s.append("\n "
elem.descripcion()) -
- return s.toString()
-
-
- // Hace falta ltT extends Alumnogt para poder
utilizar descripcion()
64Versión con generics, IV
- class Alumno
- private Claselt? extends Alumnogt clase
- private String nombre
- private int edad
- public void asignarClase (Claselt? extends
Alumnogt c) - this.clasec
-
- public Alumno (String nombre, int edad)
- this.nombrenombre
- this.edadedad
-
- public String descripcion ()
- return "Alumno " this.nombre " ("
this.edad - " años, clase "
this.clase.nombreClase() - ")"
-
-