Aclaración de conceptos teóricos

Iniciado por JonaLamper, 3 Febrero 2015, 21:49 PM

0 Miembros y 1 Visitante están viendo este tema.

JonaLamper

1.- ¿Qué hace (y para qué sirve) exactamente un método estático?

2.- ¿Por qué un método estático no puede ser abstracto? (de ahí que las interfaces no puedan tener métodos estáticos).

3.- Al igual que un método estático únicamente puede modificar un atributo estático, ¿un método no-estático únicamente puede modificar un atributo no-estático?

4.- ¿Por qué una interfaz solo puede tener atributos estáticos o finales (constantes)?


Gracias, seguiré estudiando  :silbar:
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

3n31ch

#1
Un método estático es también llamado "método de clase"
Los métodos estáticos no necesitan de un objeto para ser utilizado, y por esta razón tu puedes acceder a este método utilizando el nombre de la clase:

Código (java) [Seleccionar]
Clase.metodoEstatico();

Un método estático solo puede modificar atributos estáticos ya que de alguna manera ambos no pertenecen al objeto (si creas 10 objetos con un atributo estático, los 10 objetos tendrán el mismo valor en aquel atributo, si cambias ese valor en uno de los objetos, se cambiara en todos)

En otras palabras, las variables de clase solo pueden ser modificadas por métodos de clase, de hecho, tu no deberías poder usar la palabra this. para acceder a una variable estática.

En respuesta a tu pregunta 3 es muy deducible el porque. La razón por la cual no puedes crear un método estático y abstracto es porque los métodos estáticos se utilizan sin necesidad de un objeto, y si no creas un objeto de una clase abstracta nunca podrás definir sus métodos estáticos, por lo tanto es imposible el utilizar un método estático y abstracto, ya que simplemente no esta definido. (espero me entiendas)

Respecto a tu ultima pregunta, solo puedo decir que todo en una interface es publico, y por esa razón es recomendable que si declaras algún atributo tiene que ser por  recomendación final (regla de encapsulamiento). Si un atributo es publico, sera accesible desde cualquier lugar, por lo tanto lo mejor de todo es que esta variable sea FINAL de esta manera no tendrás problemas en que cambien el valor desde cualquier otro lugar. Pero según se no es obligatorio el que sea estático o final.




Modifico, efectivamente tienes razón tiene que ser public estatico y final... la verdad no sabría que decirte, pero según se las interfaces se utilizan siempre para redefinir métodos (no he tenido necesidad de utilizar variables)

Usuario Invitado

1) Un método estático solo puede manejar datos estáticos porque un método estático existe desde que el ClassLoader carga su clase. Una variable no estática está asociada con la existencia de un objeto. Por lo tanto, si los métodos estáticos "siempre están allí", ¿como pueden tener referencias de objetos (al cargarse la clase por medio del ClassLoader al levantar la aplicación) que aún no existen?

2) abstract quiere decir: "No implementa funcionalidad" y static dice "Aquí hay funcionalidad todo el tiempo sin necesidad de un objeto". Por lo que si haces un método static abstract también, no tendría sentido. Se contradice.

3) No. Un método no estático puede manipular datos estáticos sin problemas.

4) Los atributos de una interfaz son public, static y final porque una interfaz no puede ser instanciada directamente. El valor de su variable debe ser asignado en un contexto estático en caso no existan instancias que sobre-escriban la variable, por ésta razón también son constantes, porque se asegura que tengan algún valor en caso que ninguna implementación la sobre-escriba.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

JonaLamper

Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

JonaLamper

Sigo aquí con las dudas.

Dado el siguiente código:



(a): incorrecto.
(b): correcto.
(c): correcto.
(d): correcto.

¿Estaría bien?
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

3n31ch

#5
De donde sacas eso  :huh:

Las alternativas B y D supongo son correctas.

Ya en la alternativa C ya se esta implementado L2 gracias a la clase D entonces no le veo el caso de reimplementar.

Y bueno la A no porque estas heredando una interfaz. /* No tomen en cuenta esto, se me fue la cabeza   :rolleyes:  :silbar:*/

JonaLamper

Cita de: Nac-ho en  4 Febrero 2015, 13:25 PM
Ya en la alternativa C ya se esta implementado L2 gracias a la clase D entonces no le veo el caso de reimplementar.

Aún así, creo que sería correcto que Y vuelva a implementar la interfaz I2 (haciendo sobreescritura de métodos, por ejemplo).

Cita de: Nac-ho en  4 Febrero 2015, 13:25 PM
Y bueno la A no porque estas heredando una interfaz.

No te entiendo. La clase W es una subclase de la clase A y de la clase B (aquí no hay interfaces). La respuesta de porqué es incorrecto, creo que es porque en Java está prohibido la herencia múltiple, es decir, una subclase no puede tener dos superclases.

Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

3n31ch

#7
Sry. Lei mal, tienes razon, es incorrecto porque no puede haber multi herencia (lo lamento estaba en otra  ;D)  :-X (que vergüenza, lo lamento en serio)

Y si, pero no es necesario reimplementar, solo basta con redefinir los métodos. De hecho supongo que si reimplementas y no redefines los métodos aun asi no te molestara (ya que fueron definidos por la super clase) por eso no le veo el caso al implements (no te digo que no funcione, funcionara y no te dará error, pero no le veo la utilidad) quizás haga mas entendible el código ??  :huh:

Usuario Invitado

A) Java no soporta herencia múltiple, por lo tanto, no es una opción válida.

B) La clase C ya implementa L1, por lo que las subclases de C también heredan la implementación.

C) Lo mismo. Lo válido sería Y extends D implements L1. (L2 ya fue implementado por D).

D) Z implementa L1 y L2. Ésta es la opción más coherente.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

JonaLamper

Pero aunque ya lo implemente, el código sería correcto, no?
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.