No tengo claro el concepto de interfaz (Programación en Java)

Hola, tengo una asginatura en la que estoy estudiando programación en Java y nos estan dando los temas introductorios: de donde viene Java, la programación orientada a objetos, ect... y por lo visto el concepto de interfaz es muy importante de tenerlo claro, pero yo no lo tengo: esto es lo que me han dado en clase:
[...]

Una aplicación se puede describir en base a las piezas o componentes que vamos a necesitar para su construcción. [...] Las descripciones que hacemos de los componentes en los módulos tienen un mapeo directo en los lenguajes orientados a obje3tos, como en java sobre el concepto de interfaz.

Una vez están determinadas las interfaces (descripciones de los componentes de una aplicación) es necesario implementar estas piezas de algún modo. Esto se hace gracias a los elementos de implimentación llamados Clases de objetos.

[...]

Bueno, lo que interpreto con esto es que una interfaz es la descripción que hacemos nosotros, con nuestra imaginación, de una pieza de un programa y una clase es esta descripción implementada en el código sobre el que estemos trabajado:

1º) ¿Es así?.

Si es que es así, se me contradice con lo siguiente:

Para definir una interfaz en java utilizaremos la siguiente sintaxis:

[modificaciones] interface nombredeinterfaz
{
Lista de prototipos
}


Con esto tengo varias dudas:

2º) ¿No habiamos dicho que una interfaz era una descripción hecha con nuestra imaginación de la pieza de un programa?, entonces, ¿Porque aparece implementada en java?, ¿Eso no es una clase?.

3º) ¿Que es un prototipo?

_________

Intento aprobar esta asignatura y quiero tener bien claros los conceptos, muchas gracias adelantadas a todos los que me vayais a ayudar.

Saludos

NOTA: Tenía problemas con enviar el mensaje, de hecho me ha salido un hilo fantasma por ahí [qmparto], pero aquí ya está bien ;).
aqui un enlace que te podra venir bien: enlace



SAlu2.
Te explico

Java es un lenguaje orientado a objetos, y permite que el programador haga uso de la herencia, el polimorfismo, el encapsulamiento, etc.

Bien, el tema de los interfaces va orientado a la herencia.

Supongo que ya sabras lo que es la herencia, pero si no lo sabes te lo resumo muy mucho:


Por ejemplo creamos una clase llamada vehiculo, con los atributos y metodos que quieras, y creamos otra clase llamada terrestre que herede que vehiculo, de tal forma que terrestre tiene todos los atributos y metodos que tenga vehiculo. Los puede redefinir y meter cosas nuevas, por supuesto.


Pero esta herencia tiene una limitacion. Java permite herencia, pero simple. Es decir, una clase no puede heredar mas que de otra clase. C++, por ejemplo, permite que una clase herede de varias clases (esto se conoce como herencia multiple).

Imaginate que sigues con vehiculo y terrestre, y creamos otra clase llamada maritimo que hereda de vehiculo tambien ¿va? (tenemos 3 clases). Vale, eso java lo acepta.

Pero ahora imaginate que metemos una 4ª clase llamada anfibio que queremos que herede simultaneamente de terrestre y maritimo. Eso es una herencia multiple y java no lo soporta. Es por ello que se usan los interfaces.

Ahora la cosa está en que ya sabemos porqué existen interfaces y cuando son necesarios, pero la cosa está en saber ¿y qué coño es exactamente?. Voy a hacer un simil con C para que te hagas una idea. Si no sabes C dimelo y te pongo otro ejemplo.

Imaginate que en C puedes hacer include de ficheros .c y .h, por ejemplo

// anfibio.c
#include
#include

Eso seria como hacer herencia multiple, es decir, en un fichero estas metiendo el contenido de 2 ficheros. (en 1 clase estas metiendo el contenido de 2 clases por analogia), pero eso en java no se puede hacer.

¿Cual es la solucion?. Crearte un .h en otro fichero e incluir el .h en un lado y programar el .c en otro.

// anfibio.c
#include
#include

Esto seria como hacer herencia simple y usar un interfaz. En un fichero metes el contenido de otro e indicas que por ahi hay otra clase que quieres insertar, pero como no lo puedes hacer directamente lo haces indirectamente a traves del .h.


Lo de los interfaces no es mas que un truco. En serio, piensa que un interfaz es como un .h que tiene una clase detras si eso te ayuda.

Los interfaces son usados por ejemplo en RMI por esto mismo, porque tienes que heredar de dos clases a la vez. Solucion: heredas de una y usas la otra como interfaz.

Espero haberte ayudado.


Por cierto, en breve colgare un tuto sobre como instalar el JDK 1.4.2 con los IDE Eclipse y NetBeans en linux. Lo digo por si te interesa.


Saludos [bye]
Y más brevemente, un interfaz es una clase abstracta, es decir, una clase de la que no se pueden crear instancias, y que no tiene nada implementado, sólo las cabeceras.

Los interfaces se usan para "obligar" a otras clases a cumplir un determinado contrato. Por ejemplo un interfaz muy usado es Comparable. Si haces que todas las clases que metes en una lista, array o lo que sea implementen ese interfaz, con esto permites que se puedan comparar entre sí, y por lo tanto ordenarse.
Escrito originalmente por Churly
Y más brevemente, un interfaz es una clase abstracta, es decir, una clase de la que no se pueden crear instancias, y que no tiene nada implementado, sólo las cabeceras.

Los interfaces se usan para "obligar" a otras clases a cumplir un determinado contrato. Por ejemplo un interfaz muy usado es Comparable. Si haces que todas las clases que metes en una lista, array o lo que sea implementen ese interfaz, con esto permites que se puedan comparar entre sí, y por lo tanto ordenarse.


Qué que lo qué mande ud. lo queeeeee?!???

Que una clase abstracta es un interface?!?

Hombre, por favor.. si no se sabe la respuesta, mejor no decir nada...

Una clase abstracta se diferencia de un interface en que aunque ambos incluyen prototipos de los métodos que van a ser implementados posteriormente, en una clase abstracta puedes poner lógica dentro de algunos métodos...
Escrito originalmente por sapison

Que una clase abstracta es un interface?!?

No ha dicho eso, sino que un interface es una clase abstracta que no tiene nada implementado, que no es lo mismo. Si digo que una pelota es un juguete no estoy diciendo que todos los juguetes sean pelotas. (los ejemplos nunca han sido lo mío [tomaaa])
Escrito originalmente por Kedao

No ha dicho eso, sino que un interface es una clase abstracta que no tiene nada implementado, que no es lo mismo. Si digo que una pelota es un juguete no estoy diciendo que todos los juguetes sean pelotas. (los ejemplos nunca han sido lo mío [tomaaa])


No claro.. la frase "Y más brevemente, un interfaz es una clase abstracta", admite cientos de interpretaciones... desde luego... no empecemos con los corralillos y los acosos.. [+risas]

De todas formas, no pasa nada.. si no lo sabía, pues no lo sabía.. oye, nadie nace enseñao.. yo tuve que aprenderlo también...:D
Como siempre sacando defectos donde no lo hay, y metiéndose en hilos sólo para pinchar sin aportar nada :-)

En fin...
Creo que Churly pretendía decir que un interfaz se conoce también como clase abstracta PURA. O sea, todos sus métodos abstractos.

Un saludo.
Por supuesto, por eso dije "y nada implementado", pero vamos, que ya nos conocemos todos.
Escrito originalmente por Churly
Por supuesto, por eso dije "y nada implementado", pero vamos, que ya nos conocemos todos.


claro, por supuesto.. ya nos conocemos todos..

fíjate que lo he dicho porque eras tu... Tengo la teoría que de vez en cuando viene bien tener alguna pequeña lección de humildad.. acostumbras a ser demasiado prepotente para tus conocimientos y experiencia...

Así que una vez cumplida mi misión en esta esfera, me largo a mi *puto* planeta, con mis *putos* amigos raros de corralillo [sati]
Sois la caña, de verdad. Yo que vengo de buen rollo a ver si el chaval ha visto ya un poco mas claro que es un interfaz y hala, flame al canto y jodida de hilo. Ya me extrañaban tantas respuestas en tan poco tiempo.

Cortaros un poquito ¿va?.

Puntualiza un poco lo que ha dicho Churly. En java existe el concepto de clases abstractas, que son clases de las cuales no puedes hacer instancias, solo puedes heredar.

Por ejemplo. Imaginate un juego en 3D. Podriamos hacer una clase abstracta llamada pixel con varios atributos y varias cosas y que este punto fuese tridimensional. Un pixel tridimensional en un juego tiene poco sentido, solo tienen sentidos los poligonos, asi que lo podriamos hacer abstracto ya que no vamos a crear ningun objeto de tipo pixel, pero si vamos a crear poligonos que hereden de el.

Una clase abstracta tiene todos sus metodos definidos y se puede programar perfectamente. No se pueden hacer instancias pero esa programacion servira luego cuando la heredes.

Es, hablando el plata, una clase como otra cualquiera pero luego no puedes hacer objetos porque no, coñe XD

Otra cosa son los interfaces. Un interfaz no es mas que la cabecera de una clase. No puedes hacer instancias de la interfaz pero si de la clase que esta asociada a la interfaz.

Si es que es lo que yo ya dije antes, un truco algo cutre para permitir herencia multiple en java y poco mas.

sapison, todos deberiamos saber un poco mas de java ;). A mi me encanta el puto lenguaje, y eso que reconozco que tiene muchas limitaciones y acaba siendo una mierda, pero ya no puedo vivir sin el.

Llevo ya varios años programando en java y el otro dia fui a una clase introductoria de java. Yo decia "voy para perder el tiempo fijo", pero dudé y me equivoqué muchas veces con cosas básicas como conversiones de datos. Si vale, a la 3ª compilacion rulaba, pero a priori no podia saber el resultado.

Espero que los proximos post del hilo sean solo para ayudar al chaval.

Saludos [bye]
Escrito originalmente por RaUleX
Sois la caña, de verdad. Yo que vengo de buen rollo a ver si el chaval ha visto ya un poco mas claro que es un interfaz y hala, flame al canto y jodida de hilo. Ya me extrañaban tantas respuestas en tan poco tiempo.

Cortaros un poquito ¿va?.

Puntualiza un poco lo que ha dicho [B]Churly
. En java existe el concepto de clases abstractas, que son clases de las cuales no puedes hacer instancias, solo puedes heredar.

Por ejemplo. Imaginate un juego en 3D. Podriamos hacer una clase abstracta llamada pixel con varios atributos y varias cosas y que este punto fuese tridimensional. Un pixel tridimensional en un juego tiene poco sentido, solo tienen sentidos los poligonos, asi que lo podriamos hacer abstracto ya que no vamos a crear ningun objeto de tipo pixel, pero si vamos a crear poligonos que hereden de el.

Una clase abstracta tiene todos sus metodos definidos y se puede programar perfectamente. No se pueden hacer instancias pero esa programacion servira luego cuando la heredes.

Es, hablando el plata, una clase como otra cualquiera pero luego no puedes hacer objetos porque no, coñe XD

Otra cosa son los interfaces. Un interfaz no es mas que la cabecera de una clase. No puedes hacer instancias de la interfaz pero si de la clase que esta asociada a la interfaz.

Si es que es lo que yo ya dije antes, un truco algo cutre para permitir herencia multiple en java y poco mas.

sapison, todos deberiamos saber un poco mas de java ;). A mi me encanta el puto lenguaje, y eso que reconozco que tiene muchas limitaciones y acaba siendo una mierda, pero ya no puedo vivir sin el.

Llevo ya varios años programando en java y el otro dia fui a una clase introductoria de java. Yo decia "voy para perder el tiempo fijo", pero dudé y me equivoqué muchas veces con cosas básicas como conversiones de datos. Si vale, a la 3ª compilacion rulaba, pero a priori no podia saber el resultado.

Espero que los proximos post del hilo sean solo para ayudar al chaval.

Saludos [bye] [/B]


Bueno, siempre se puede aprender saber más de java... o de cualquier lenguaje orientado a objetos moderno.. el concepto de clase abtracta existe en algun lenguaje más y siempre con ese significado.. es algo básico en la OO. Pero bueno, ya lo he explicado en mi primer post..

Ahora vamos a puntualizar un par de cosas que has dicho.. un Interface es un prototipo de la clase, una especificación completa sin lógica que deberá ser implementada posteriormente en una clase.. es lo que tu has llamado clase asociada.. en realidad el término no es muy correcto; como ya he dicho es la implementación..

Un Interface puede tener múltiples implementaciones.. de hecho ahí radica la potencia de un interface, es una puerta de acceso común... Por poner un ejemplo comprensible: Imagina que tienes que trabajar con componentes externos a tu aplicación.. si defines un interface común de acceso y todas tus clases los referencian, pues podrías cambiar esos componentes sin tener que reprogramar nada más que la implementación.. De igual forma hay múltiples escenarios en los que puedes utilizar incluso varias implementaciones de un mismo interface..

Por tanto eso de que es un truco algo cutre para permitir la herencia múltiple en java... buf.. Es cierto que puedes heredar de una clase y múltiples interfaces simultaneamente.. pero vamos, no es la máxima utilidad que tiene precisamente..

De hecho, la herencia multiple (Que soportaban lenguajes como C++) es más bien un concepto teórico que práctico.. rara vez hemos tenido que aplicarlo en una aplicación del mundo 'real'.. complica en exceso la lógica y además es peligroso.. de ahí que lenguajes como Java, la suprimieran...

Tantos los interfaces como las clases abstractas son necesarias y tienen su razón de ser..

Yo no soy ningun guru de la orientación a objetos, ni ningún purista.. pero llevo bastantes años trabajando con lenguajes OO y con aplicaciones OO puras... de forma que algo de idea sí que tengo...
Muy bien sapiston, tanto en la explicación (muy acertada) como en las formas del post [oki].

Espero que el chaval de la pregunta aparezca al menos para decir que le ha quedado claro :), o sino pues que diga que no tiene claro.

Saludos
Escrito originalmente por sapison


claro, por supuesto.. ya nos conocemos todos..

fíjate que lo he dicho porque eras tu... Tengo la teoría que de vez en cuando viene bien tener alguna pequeña lección de humildad.. acostumbras a ser demasiado prepotente para tus conocimientos y experiencia...

Así que una vez cumplida mi misión en esta esfera, me largo a mi *puto* planeta, con mis *putos* amigos raros de corralillo [sati]



Mira, no iba a volver a responder a este hilo, porque ya está bastante destrozado, pero como vas a todos los lados a buscar a la gente (se te tiene bien calado), te tiras al cuello por haberme equivocado con una coma, y luego encima me llamas prepotente...

¿Sabes que el prepotente es precisamente el que se llama humilde de esa manera? Estoy ya bastante harto de ti, no tienes ni la más remota idea de mis conocimientos y mi experiencia. Puede que no sea ningún genio, pero por lo menos intento ayudar y no voy provocando a la gente que no piensa como yo sólo por joder.

En fin, sobre lo último, ya paso de ti totalmente.

Perdón a todos por este hilo.
Escrito originalmente por Churly



Mira, no iba a volver a responder a este hilo, porque ya está bastante destrozado, pero como vas a todos los lados a buscar a la gente (se te tiene bien calado), te tiras al cuello por haberme equivocado con una coma, y luego encima me llamas prepotente...

¿Sabes que el prepotente es precisamente el que se llama humilde de esa manera? Estoy ya bastante harto de ti, no tienes ni la más remota idea de mis conocimientos y mi experiencia. Puede que no sea ningún genio, pero por lo menos [b]intento ayudar
y no voy provocando a la gente que no piensa como yo sólo por joder.

En fin, sobre lo último, ya paso de ti totalmente.

Perdón a todos por este hilo. [/B]


Mira, yo tampoco te iba a contestar, pero no quiero que quede la imagen de mi que pretendes dejar con tu posición victimista..

Yo no soy el que va riendose y ridiculizando a los demás contínuamente por no compartir mis ideas, ni por utilizar un software que yo no uso.. TODOS sabemos quien hace eso, verdad?

Precisamente por eso es por lo que te viene bien tomar de tu propia medicina, para que de vez en cuando moderes el tono de tus mensajes y te rias menos de la gente.

A mi, que yo te tenga harto o no es algo que por decirlo de alguna manera simple (y quizás un pelín soez), me la trae bastante floja... pero no te quieras engañar con eso de que intentas ayudar a la gente.. tu lo que intentas es imponer por narices tus ideas.. y si no lo haces voluntariamente, repasa tus posts y luego me lo cuentas, vale?..

Por mi parte he acabado.. Espero que todos saquemos algo positivo de esto.

Adiós
¿Qué yo que? No se si tendré que recordarte ciertos comentarios tuyos en el foro de noticias, cuando decías tonterías basadas en tu "experiencia" que varios te rebatieron, y como no sabías que decir soltaste varias cosas y te callaste... o por no hablar de varios posts en SL, que en vez de ayudar a algo, te metías a pinchar, como has hecho en este hilo en el primer post.

Lo primero es que tu no eres quien para decirme a mi lo que tengo o lo que no tengo que hacer, ni darme lecciones. ¿Tú que te crees que eres? [carcajad]

Revisa tus posts, frente a los mios, y veamoslo, hay algunos que sólo nacen para tocar las pelotas. Si hubiese faltado alguna vez al respeto a alguien, se me hubiese toqueado alguna vez por parte de los moderadores, lo cual nunca ha pasado.

Ale, vas a ser el primer ignorado en dos años y medio, felicidades [risita]
Escrito originalmente por Churly
¿Qué yo que? No se si tendré que recordarte ciertos comentarios tuyos en el foro de noticias, cuando decías tonterías basadas en tu "experiencia" que varios te rebatieron, y como no sabías que decir soltaste varias cosas y te callaste... o por no hablar de varios posts en SL, que en vez de ayudar a algo, te metías a pinchar, como has hecho en este hilo en el primer post.

Lo primero es que tu no eres quien para decirme a mi lo que tengo o lo que no tengo que hacer, ni darme lecciones. ¿Tú que te crees que eres? [carcajad]

Revisa tus posts, frente a los mios, y veamoslo, hay algunos que sólo nacen para tocar las pelotas. Si hubiese faltado alguna vez al respeto a alguien, se me hubiese toqueado alguna vez por parte de los moderadores, lo cual [b]nunca
ha pasado.

Ale, vas a ser el primer ignorado en dos años y medio, felicidades [risita] [/B]


[maszz] Me dejas preocupado
17 respuestas