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

Post on 18-Aug-2020

3 views 0 download

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

Clases

LSUB

GSYC

10 de febrero de 2016

(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.

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.

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.

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.

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.

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.

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.

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.

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.

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 ] ;

. . . .}

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.

Ocultacion (II)

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

I protected: son accesibles solo desde las clases derivadas.

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.

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.

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 {. . .

}

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).

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 ) { . . . }

}

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.

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 ){

. . .}

}

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.

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.

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 ( ) ;. . .

}}

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 ( ) ;

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 ( ) ;