Conceptos Básicos
Conceptos Básicos
Conceptos Básicos
Herencia: donde una clase nueva se crea a partir de una clase existente. La herencia (a la
que habitualmente se denomina subclase) proviene del hecho de que la subclase (la nueva
clase creada) contiene las atributos y métodos de la clase primaria. La principal ventaja de
la herencia es la capacidad para definir atributos y métodos nuevos para la subclase, que
luego se aplican a los atributos y métodos heredados.
Esta particularidad permite crear una estructura jerárquica de clases cada vez más
especializada. La gran ventaja es que uno ya no debe comenzar desde cero cuando desea
especializar una clase existente. Como resultado, se pueden adquirir bibliotecas de clases
que ofrecen una base que puede especializarse a voluntad (la compañía que vende estas
clases tiende a proteger las datos miembro usando la encapsulación).
Es la relación entre una clase general y otra clase mas especifica. Es un mecanismo que
nos permite crear clases derivadas a partir de clase base, nos permite compartir
automáticamente métodos y datos entre clases subclases y objetos. Por ejemplo: Si
declaramos una clase párrafo derivada de un clase texto todos los métodos y variables
asociadas con la clase texto son automáticamente heredados por la subclase párrafo. La
herencia, junto con la encapsulación y el polimorfismo, es una de las tres características
principales (o "pilares") de la programación orientada a objetos. La herencia permite crear
nuevas clases que reutilizan, extienden y modifican el comportamiento que se define en
otras clases. La clase cuyos miembros se heredan se denomina clase base y la clase que
hereda esos miembros se denomina clase derivada.
· Herencia Simple: Indica que se pueden definir nuevas clases solamente a
partir de una clase inicial
Herencia Multiple: Indica que se pueden definir nuevas clases a partir de dos o
más clases iniciales.
· Herencia de implementación: La implementación de los métodos es
heredada. Puede sobreescribirse en las clases derivadas.
· Herencia de interfaz: Sólo se hereda la interfaz, no hay implementación a
nivel de clase base (interfaces en Java, clases abstractas en C++)
Superclase: En Java, como en otros lenguajes de programación orientados a objetos,
las clases pueden derivar desde otras clases. La clase derivada (la clase que proviene
de otra clase) se llama subclase. La clase de la que está derivada se denomina
superclase.
De hecho, en Java, todas las clases deben derivar de alguna clase. Lo que nos lleva a
la cuestión ¿Dónde empieza todo esto?. La clase más alta, la clase de la que todas las
demás descienden, es la clase Object, definida en java.lang. Object es la raíz de la
herencia de todas las clases.
Las subclases heredan el estado y el comportamiento en forma de las variables y los
métodos de su superclase. La subclase puede utilizar los ítems heredados de su
superclase tal y como son, o puede modificarlos o sobreescribirlos. Por eso, según se
va bajando por el árbol de la herencia, las clases se convierten en más y más
especializadas.
Definición:
Una subclase es una clase que desciende de otra clase. Una subclase hereda el estado
y el comportamiento de todos sus ancestros. El término superclase se refiere a la clase
que es el ancestro más directo, así como a todas las clases ascendentes.
Clases abstractas
Una clase que declara la existencia de métodos pero no la implementación de dichos
métodos (o sea, las llaves { } y las sentencias entre ellas), se considera una clase abstracta.
Una clase abstracta puede contener métodos no-abstractos pero al menos uno de los
métodos debe ser declarado abstracto.
Para declarar una clase o un metodo como abstractos, se utiliza la palabra reservada
abstract.
abstract class Drawing
{
abstract void miMetodo(int var1, int var2);
String miOtroMetodo( ){ ... }
}
Una clase abstracta no se puede instanciar pero si se puede heredar y las clases hijas
serán las encargadas de agregar la funcionalidad a los métodos abstractos. Si no lo hacen
así, las clases hijas deben ser también abstractas.
Este Tipo de Clases nos permiten crear “método generales”, que recrean un
comportamiento común, pero sin especificar cómo lo hacen. A nivel de código tienen por
particularidad que algunos de sus métodos no tienen “cuerpo de declaración”, ¿qué quiere
decir esto? no tienen las llaves { } ni código dentro de ellos y deben estar precedidos por la
palabra clave abstract. Si una clases contiene uno o más métodos abstractos está clase
debe ser abstracta. Estas clases como son generalidades no pueden ser instanciadas por
ningún objeto (se dice que su nivel de abstracción es demasiado alto), entonces su único fin
es ser heredado/extendido por otras clases.
ATENCIÓN:
– Las clases que hereden de la clase Abstracta deben implementar todos los métodos
abstractos.
– Se debe tener presente que las clases abstractas sí pueden heredar de otras clases.
– La firma o parámetros de los métodos así como el tipo de dato deben respetarse, de lo
contrario se está hablando de otro método totalmente diferente.
Si una clase abstracta está compuesta sólo por métodos abstractos y constantes entonces
podemos hablar de una interface.
Un método abstracto nos da la posibilidad de introducir la declaración de un método (y no
su definición) en una clase, e implementar dicho método en alguna de las subclases de la
clase enque nos encontramos.nDe este modo, la declaración del método estará disponible
en la clase, y lobpodremos utilizar para, por ejemplo, definir otros métodos, y además no
nos vemos en la obligación de definirlo, ya que su comportamiento puede que sea
todavía desconocido. Una consecuencia de definir un método abstracto es que la clase
correspondiente ha de ser también abstracta, o, lo que es lo mismo, no se podrán crear
objetos de la misma (¿cómo sería el comportamiento de los objetos de la misma al invocar
a los métodos abstractos?), pero su utilidad se observará al construir objetos de las clases
derivadas. Además, la posibilidad
de declarar métodos abstractos enriquecerá las jerarquías de clases, ya que más clases
podrán compartir la declaración de un método (aunque no compartan su definición).
Polimorfismo : Capacidad que tienen los objetos de una clase de responder al mismo
mensaje o evento en función de los parámetros utilizados durante su invocación. Un objeto
polimórfico es una entidad que puede contener valores de diferentes tipos durante la
ejecución del programa.
En algunos lenguajes, el término polimorfismo es también conocido como ‘Sobrecarga de
parámetros’ ya que las características de los objetos permiten aceptar distintos parámetros
para un mismo método (diferentes implementaciones) generalmente con comportamientos
distintos e independientes para cada una de ellas.
El polimorfismo nos permite utilizar clases con tipos compatibles en cualquier punto de
nuestro código.
En Java tipos compatible significa que una clase extiende a otra o que una clase
implementa un interface.
Coloquialmente: a una referencia de tipo padre podemos enganchar referencias de sus
hijas. A una referencia de tipo interface le podemos enganchar cualquier instancia de una
clase que implemente el interface.
La Vinculación dinámica es el mecanismo que utiliza la máquina virtual de Java para
averiguar, en tiempo de ejecución, a qué método debe llamar, a partir del tipo del objeto
asignado a una referencia.
Encapsulamiento: También conocido como ocultamiento. Se encarga de mantener ocultos
los procesos internos que necesita para hacer lo que sea que haga, dándole al programador
acceso sólo a lo que necesita.
se denomina encapsulamiento al ocultamiento del estado, es decir, de los datos miembro de un
objeto de manera que solo se pueda cambiar mediante las operaciones definidas para ese
objeto.
Cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a un
agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados de un objeto
contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos
secundarios e interacciones.
De esta forma el usuario de la clase puede obviar la implementación de los métodos y
propiedades para concentrarse solo en cómo usarlos. Por otro lado se evita que el usuario
pueda cambiar su estado de maneras imprevistas e incontroladas.
La encapsulación define los niveles de acceso para elementos de esa clase. Estos niveles de
acceso definen los derechos de acceso para los datos, permitiéndonos el acceso a datos a
través de un método de esa clase en particular, desde una clase heredada o incluso desde
cualquier otra clase. Existen tres niveles de acceso: público, las funciones de todas las clases
pueden acceder a los datos o métodos de una clase que se define con el nivel de acceso
público. Este es el nivel de protección de datos más bajo; protegido, el acceso a los datos está
restringido a las funciones de clases heredadas, es decir, las funciones miembro de esa clase y
todas las subclases; privado, el acceso a los datos está restringido a los métodos de esa clase
en particular. Este es nivel más alto de protección de datos.
Interfaces:
Una interfaz es un conjunto de métodos abstractos y de constantes cuya funcionalidad es la
de determinar el funcionamiento de una clase, es decir, funciona como un molde o como
una plantilla. Al ser sus métodos abstractos estos no tiene funcionalidad alguna, sólo se
definen su tipo, argumento y tipo de retorno.
Las Interfaces solo pueden tener visibilidad de package o public.
Todos los métodos declarados en una Interfaz son public y abstract, si no se le indica, Java lo pondrá
implícitamente.
Los métodos de una Interfaz no pueden ser estáticos, ya que estos deben ser redefinidos, y al ser
estáticos les sería imposible.
Todos los atributos declarados en una Interfaz son "public static final" y deberán tener asignado un
valor constante. Todos los nombres de constantes van en "MAYÚSCULAS"
Una clase puede implementar una o más interfaces.
Una Interfaz puede heredar de una o varias interfaces, pero no pueden implementar NADA. Como
sabemos, las clases solo pueden heredar de otra clase, pero las Interfaces pueden hacer herencia
múltiples.
Todas las clases que implementen una interfaz deben de redefinir todos los métodos de esa interfaz.
Las interfaces no tienen constructor, por lo que no es posible crear objetos con el operador "new" de
ésta.
Si se implementa en una clase una Interfaz, y esta Interfaz hereda de otra, la clase deberá implementar
todos los métodos de la interfaz que implementa y de los métodos que esta hereda.
Para la herencia de las interfaces se pone la palabra clave extends y se ponen todas las interfaces que
se deseen separadas por comas.
Una Interfaz puede ocultar constantes y métodos heredados de otras Interfaces si los vuelve a declarar
en la clase que hereda.
Una interfaz es la descripción de uno o más servicios (métodos) que posteriormente lguna
clase puede implementar (y por ende ofrecer).
Por ejemplo, si un alumno sabe alemán, tenemos idea de lo que él es capaz. Además de
ser persona (herencia) él cumple la interfaz “interprete de alemán”. También podríamos
decir que él es un “interprete de alemán” (la misma relación que en herencia).
Clases internas
Cuando sólo necesitamos crear una instancia de un objeto, podemos definir la clase dentro
de otra clase. Son clases definidas dentro de otras (anidadas). Se permite el acceso a
miembros de la clase anfitriona – incluso si son privados. Se usan como mecanismo de
encapsulamiento. No son visibles desde fuera. Son muy útiles para reducir código fuente.
Especialmente cuando la clase sólo genera instancias locales.
Las clases internas existen sólo para el compilador, ya que éste las transforma en
clases regulares separando la clase externa e interna con signo $.La máquina virtual no
distingue la clases internas. También se pueden definir al interior de un método.
Sobrecarga
Fíjate que Java selecciona el método al que se invoca según su signatura. La sobrecarga
nos permite seleccionar el método adecuado.
No confundas la sobrecarga con la sobrescritura (@Override).
Sobrecargar significa definir nuevos métodos.
Sobrescribir significa ocultar un método con una nueva definición de ese mismo método.
La sobrecarga no implica herencia, la sobrescritura sí.
La sobrecarga permite seleccionar la llamada a un método a partir del número y tipo de sus
parámetros.
Úsala con cuidado, hacer un uso intensivo de la sobrecarga puede dar lugar a confusión
desde el punto de vista del programador.
Sobrecarga es la capacidad de un lenguaje de programación, que permite nombrar con el
mismo identificador diferentes variables u operaciones.
Colecciones:
Una colección representa un grupo de objetos. Esto objetos son conocidos como
elementos. Cuando queremos trabajar con un conjunto de elementos, necesitamos un
almacén donde poder guardarlos. En Java, se emplea la interfaz genérica Collection para
este propósito. Gracias a esta interfaz, podemos almacenar cualquier tipo de objeto y
podemos usar una serie de métodos comunes, como pueden ser: añadir, eliminar, obtener
el tamaño de la colección… Partiendo de la interfaz genérica Collection extienden otra serie
de interfaces genéricas. Estas subinterfaces aportan distintas funcionalidades sobre la
interfaz anterior.
4.1. Set
La interfaz Set define una colección que no puede contener elementos duplicados. Esta
interfaz contiene, únicamente, los métodos heredados de Collection añadiendo la restricción
de que los elementos duplicados están prohibidos. Es importante destacar que, para
comprobar si los elementos son elementos duplicados o no lo son, es necesario que dichos
elementos tengan implementada, de forma correcta, los métodos equals y hashCode. Para
comprobar si dos Set son iguales, se comprobarán si todos los elementos que los
componen son iguales sin importar en el orden que ocupen dichos elementos.
Modificadores de acceso
Existen los siguientes modificadores de acceso:
public - Todo el mundo puede acceder al elemento. Si es un dato miembro, todo el mundo
puede ver el elemento, es decir, usarlo y asignarlo. Si es un método todo el mundo puede
invocarlo.
private - Sólo se puede acceder al elemento desde métodos de la clase, o sólo puede
invocarse el método desde otro método de la clase.
protected - Se explicará en el capítulo dedicado a la herencia.
Sin modificador - Se puede acceder al elemento desde cualquier clase del package donde
se define la clase.
Pueden utilizarse estos modificadores para cualquier tipo de miembros de la clase, incluidos
los constructores (con lo que se puede limitar quien puede crear instancias de la clase).