Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente...

25
Clases LSUB GSYC 10 de febrero de 2016

Transcript of Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente...

Page 1: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases

LSUB

GSYC

10 de febrero de 2016

Page 2: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

(cc) 2015 Laboratorio de Sistemas,

Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento -

NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, vease

http://creativecommons.org/licenses/by-sa/2.1/es. Tambien puede solicitarse a Creative Commons, 559 Nathan

Abbott Way, Stanford, California 94305, USA.

Page 3: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases y objetos

Un objeto es una instancia de una clase, y tiene miembros:

I Atributos o campos (valirables de la instancia).

I Metodos u operaciones.

Page 4: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Constructor

I Es un metodo especial que se invoca automaticamente cuandose crea un nuevo objeto de una clase.

I Su nombre es el nombre de la clase y no retorna nada.

I El constructor por omision existe si no definimos ningunconstructor, y no tiene parametros.

I Si definimos nuestro constructor, perdemos en constructor poromision.

Page 5: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Sobrecarga

I Definicion de metodos con el mismo nombre pero condistintos argumentos.

I Ojo: siempre hay que retornar el mismo tipo.

I El constructor suele estar sobrecargado para poder inicializarun objeto de distintas formas.

Page 6: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

This

Es una referencia a ti mismo.

I p.move(3,4) es en realidad <Punto>move(p, 3, 4)

I Si llamamos al metodo this(), estamos llamando a nuestropropio constructor.

I Si usamos this en un constructor, tiene que estar al principio.Ası podemos simplificar la construccion y ahorrar codigoduplicado.

Page 7: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Ocultacion

Las clases pueden ser:

I public: son accesibles desde todas las clases.

I package-private: visible desde el paquete, es ası si no se ponenada.

Los miembros ademas pueden ser:

I public: son accesibles desde fuera del objeto.

I private: no son accesibles desde fuera del objeto.

I package-private: visible desde el paquete, es ası si no se ponenada.

Page 8: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Relaciones

Objetivo: abstraer correctamente y no repetir codigo (principioDRY: don’t repeat yourself!):

I Composicion: una clase tiene uno o mas objetos subordinadosde otras clases como parte de su estado (tiene-un).

I Herencia: una clase deriva de otra clase (es-un).

I Delegacion: una clase delega parte de su implementacion enotra clase subordinada, o expone parte de la interfaz de laclase subordinada que la compone.

Page 9: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Herencia

I Relacion es-un: la clase derivada es-una clase base.

I Principio de Liskov: Si S es un subtipo de T, entoncescualquier objeto de clase T puede ser sustituido por un objetode clase S sin alterar ninguna de las propiedades del programa(correccion, tarea realizada, etc.).Esto es, cualquier metodo que tiene sentido para un objeto dela superclase tiene que tener sentido para un objeto de lasubclase.

Page 10: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Herencia

I Una referencia de la clase base puede apuntar a un objeto dela clase derivada.

I Una clase derivada:I Hereda miembros.I Puede anadir miembros.I Puede redefinir (sobreescribir) metodos.I Puede llamar al constructor de la clase base invocando a

super() (al principio).I Con super te refieres a la clase base.

Page 11: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Herencia

p u b l i c c l a s s I n s t r u m e n t o {p r i v a t e boolean a f i n a d o ;

p u b l i c v o i d a f i n a r ( ){. . .

}}

. . .

p u b l i c c l a s s G u i t a r r a extends I n s t r u m e n t o {p r i v a t e c u e r d a s [ ] = new Cuerda [ 6 ] ;

. . . .}

Page 12: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Late (dynamic) binding

I En tiempo de ejecucion se decide a que metodo se va ainvocar.

I Se invocara al metodo de la clase concreta referenciada.

I Facilita el polimorfismo: distintas implementaciones con lamisma interfaz.

Page 13: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Ocultacion (II)

Ademas de public, private o package-private, un miembrotambien puede ser:

I protected: son accesibles solo desde las clases derivadas.

Page 14: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Sobrescritura (override)

I Las clases derivadas pueden reemplazar la implementacion delos metodos heredados.

I Ejemplo: hay que sobrescribir equals(), heredado de Object,si no deseamos que los objetos de nuestra clase se comparenen base a si son la misma instancia, sino por su contenido(p.ej. como String).

I Si sobrescribimos equals, tenemos que sobrescribirhashCode, y vice versa.

Page 15: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases abstractas

I Una clase de la que solo se puede heredar, que tiene susmetodos por definir (late binding).

I No puede haber instancias: no podemos llamar a new con ella.

I Es una forma de obligar a tener una interfaz para las clasesderivadas.

Page 16: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases abstractas

p u b l i c a b s t r a c t c l a s s Mamifero {p r i v a t e Pelo p e l o ;p r i v a t e Mama mama ;. . .

}

. . .

p u b l i c c l a s s M a r s u p i a l extends Mamifero {. . .

}

Page 17: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Interfaces

I Es un contrato: similar a una clase puramente abstracta.

I Un clase puede implementar distintas interfaces. En Java, nohay herencia multiple (no se puede heredar de distintasclases).

I Una interfaz no tiene implementacion por omision (una claseabstracta lo puede tener, aunque puede que no sea apropiado).

Page 18: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Interfaces

p u b l i c i n t e r f a c e A c o n d i c i o n a d o {p u b l i c boolean e n c e n d e r A i r e ( double g r a d o s ) ;p u b l i c boolean a p a g a r A i r e ( ) ;p u b l i c boolean ponerTemperatura ( double g r a d o s ) ;

}

p u b l i c c l a s s Coche implements A c o n d i c i o n a d o {p u b l i c boolean e n c e n d e r A i r e ( double g r a d o s ) { . . . }p u b l i c boolean a p a g a r A i r e ( ) { . . . }p u b l i c boolean ponerTemperatura ( double g r a d o s ) { . . . }

}

p u b l i c c l a s s Casa implements A c o n d i c i o n a d o {p u b l i c boolean e n c e n d e r A i r e ( double g r a d o s ) { . . . }p u b l i c boolean a p a g a r A i r e ( ) { . . . }p u b l i c boolean ponerTemperatura ( double g r a d o s ) { . . . }

}

Page 19: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Miembros de clase

I Existen dentro de la clase, son globales para todos los objetosde la clase.

I Se indica con static.

I Atributos: son utiles para definir constantes.

I Metodos: son utiles para operaciones simetricas. No puedenacceder a miembros de instancia (metodos o atributos noestaticos de la clase) ni usar this.

Page 20: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Miembros de clase

p u b l i c c l a s s G u i t a r r a extends I n s t r u m e n t o {

p u b l i c s t a t i c f i n a l i n t NCUERDAS = 6 ;

p u b l i c s t a t i c boolean m i s m a A f i n a c i o n ( G u i t a r r a g1 ,G u i t a r r a g2 ){

. . .}

}

Page 21: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases anidadas

I Clases definidas dentro de otra clase. Es un miembro de laclase que la contiene. Ventajas:

I Permite agrupar clases en un fichero.I Facilita la ocultacion.

I Como miembros, pueden ser private, public, protected, opackage private.

I Dos tipos: Inner class (embebidas) y static nested class.

Page 22: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases embebidas (inner)

I La instancia de la clase interna esta contenida en la instanciade la clase contenedora.

I Tiene acceso a los miembros de la clase externa (incluidos losprivados).

I No puede definir miembros estaticos.

Page 23: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases embebidas (inner)

c l a s s C o l e c c i o n {. . .c l a s s I t e r a d o r {

. . .}void t o S t r i n g ( ) {

I t e r a d o r i = new I t e r a d o r ( ) ;. . .

}}

Page 24: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases embebidas (inner)

Para poder instanciarlas desde otra clase:

C o l e c c i o n c = new C o l e c c i o n ( ) ;C o l e c c i o n . I t e r a d o r i t = c . new I t e r a d o r ( ) ;

Page 25: Clases - lsub.orglsub.org/ast/5.clases.pdf · I Es un contrato: similar a una clase puramente abstracta. I Un clase puede implementar distintas interfaces. En Java, no hay herencia

Clases anidadas estaticas (static nested class)

I No esta asociada con una instancia de la clase externa.

I No puede acceder a miembros de instancia de la clase externa.

I Interactua con los miembros de una instancia de la claseexterna como cualquier otra clase de nivel superior.

P r o t o c o l o . MensajeA msg = new P r o t o c o l o . MensajeA ( ) ;