elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?  (Leído 3,651 veces)
4dr14n31t0r

Desconectado Desconectado

Mensajes: 85



Ver Perfil
¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« en: 21 Diciembre 2016, 20:47 »

Supongamos que tengo 3 clases: A, B y C, y que la clase A tiene un metodo: getB(), que devuelve un objeto de la clase B, y que B tambien tiene un metodo, getC(), que devuelve un objeto de la clase C.

Si hiciera lo siguiente:
Código
  1. A a = new A();
  2. B b = a.getB();
  3. C c = b.getC();
Tendria que importar la clase A,B y C. Sin embargo, si yo hiciera esto:
Código
  1. A a = new A();
  2. C c = a.getB().getC();
No tendria que importar la clase B. ¿Por que?
Si es porque la clase B ya importa la clase C, entonces ¿Por que en el primer caso tengo que importarla si ya viene incluida al incluir C?

EDIT:Voy a poner la definición de las clases A, B y C para que me entendáis mejor:
Código
  1. package paquete_a;
  2.  
  3. import paquete_b.B;
  4.  
  5. public class A{
  6.    public B getB(){
  7.        return new B();
  8.    }
  9. }
Código
  1. package paquete_b;
  2.  
  3. import paquete_c.C;
  4.  
  5. public class B{
  6.    public C getC(){
  7.        return new C();
  8.    }
  9. }
Código
  1. package paquete_c;
  2.  
  3. public class C{
  4.    //Esta clase no tiene nada
  5. }
Código
  1. package test;
  2.  
  3. import paquete_a.A;
  4. import paquete_b.B;
  5. import paquete_c.C;
  6.  
  7. public class Test_1{
  8.    public static void main(String[] args){
  9.        A a = new A();
  10.        B b = a.getB();
  11.        C c = b.getC();
  12.    }
  13. }
Código
  1. package test;
  2.  
  3. import paquete_a.A;
  4. //No es necesaria la importación de la clase B
  5. import paquete_c.C;
  6.  
  7. public class Test_2{
  8.    public static void main(String[] args){
  9.        A a = new A();
  10.        C c = a.getB().getC();
  11.    }
  12. }
EDIT 2: Vamos a suponer que en C++ tenemos 3 archivos headers (esos que tienen la extension ".h"): Uno para la clase A, otro para la clase B y otro para la clase C, que basicamente seran iguales que las clases que acabo de mostrar, pero con la unica diferencia de que estan escritos en C++. Supongamos tambien que tenemos 2 archivos: test1.cpp y test2.cpp, que solo tienen un metodo main que simplemente hacen lo mismo que el metodo main de la clase Test_1 y Test_2 de java que he mostrado antes para ver como seria un ejemplo. Bueno pues en C++ cuando tu incluyes un archivo (En este caso, algo como #include A.h ó #include B.h) lo que realmente pasa es que se "inserta" tal cual el archivo encima de aquel en el que lo incluyes, de modo que si un archivo solo tiene el siguiente codigo:
Código
  1. #include <stdio.h>
  2.  
  3. int main(
y otro incluye al anterior y solo tiene el siguiente codigo:
Código
  1. ){
  2.    printf("Hola Mundo");
  3. }
Compilará sin problemas y si ejecutamos nos mostrará el mensaje "Hola Mundo".
Ahora bien, si en el archivo que contiene la clase A incluyo el archivo de la clase B, y en el archivo que contiene la clase B incluyo el archivo que contiene la clase C, entonces el resultado seria el mismo que si hubiese creado un archivo con las 3 clases. Si en el archivo test1.cpp incluyo el archivo que contiene la clase A, entonces nisiquiera tendre que incluir el archivo que contiene la clase C para que el codigo equivalente de C++ de este trozo de codigo
Código
  1.    A a = new A();
  2.    B b = a.getB();
  3.    C c = b.getC();
Se pueda compilar y ejecutar sin problemas. Sin embargo con java no pasa esto, sino que algunas veces (Como el primer caso que muestro arriba del todo) hay que importar la clase B, y en otros (Como el ejemplo de codigo que viene inmediatamente despues) no es necesario para ejecutar getC(). ¿Por que? ¿Por que unas veces si y otras veces no?


« Última modificación: 22 Diciembre 2016, 20:16 por 4dr14n31t0r » En línea

miltonprogramador

Desconectado Desconectado

Mensajes: 25



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #1 en: 22 Diciembre 2016, 01:50 »

Hola creo que deberias hacer mas comletas las clases para que recibas la orietación mas adecuada...


En línea

Aprendiendo de los mejores se llega a ser uno de ellos...
kingcreek

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #2 en: 22 Diciembre 2016, 12:28 »

Como ha comentado miltonprogramador, si dejas un ejemplo practico del cual viene tu duda podriamos darte una axplicacion.  Ya que por ejemplo:
Código
  1. A a = new A();
  2. C c = a.getB().getC();
No es posible si declaras una funcion que retorne un objeto tipo String como en el siguiente ejemplo que dare.
Cuando llamas a la clase A, esta retorna un valor de la clase B con getB(), pero no puedes llamar a getC() ya que esa clase no contiene ningun metodo llamado de tal manera, ni mucho menos llamarlos de manera seguida.
Todo esto suponiendo que tengas algo asi:
Código
  1. class Ideone
  2. {
  3. public static void main (String[] args)
  4. {
  5. A a = new A();
  6. B b = new B();
  7.        System.out.print(a.getB() + b.getC());
  8. }
  9. }
  10.  
  11. class A {
  12.  
  13.        public String getB() {
  14.        B b = new B();
  15.        return b.B;
  16.    }
  17. }
  18.  
  19. class B {
  20.  
  21.    public String B = "B";
  22.    public String getC() {
  23.        C c = new C();
  24.        return c.C;
  25.    }
  26. }
  27.  
  28. class C {
  29.  
  30.    public String C = "C";
  31. }
  32.  
Eso sigue el esquema que tu has dicho, A retorna el valor de B, y B el de C, pero como digo, no puedes llamar ahi a A y retornar el valor de C, para ello has de hacer como has puesto en el primer ejemplo que has dado.
Otra alternativa es la herencia, para hacer uso de atributos y metodos de la clase heredada.
En línea

4dr14n31t0r

Desconectado Desconectado

Mensajes: 85



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #3 en: 22 Diciembre 2016, 19:08 »

Acabo de editar el post para que me entendais mejor.
Como ha comentado miltonprogramador, si dejas un ejemplo practico del cual viene tu duda podriamos darte una axplicacion.  Ya que por ejemplo:
Código
  1. A a = new A();
  2. C c = a.getB().getC();
No es posible si declaras una funcion que retorne un objeto tipo String como en el siguiente ejemplo que dare.
Supongamos que tengo 3 clases: A, B y C, y que la clase A tiene un metodo: getB(), que devuelve un objeto de la clase B, y que B tambien tiene un metodo, getC(), que devuelve un objeto de la clase C.
¿Que parte de "la clase A tiene un metodo: getB(), que devuelve un objeto de la clase B" no entiendes?
Si estoy diciendo que devuelve un objeto de la clase B, ¿Por que me saltas con que no es posible si retorna un objeto de tipo String? ¿No estoy diciendo que retorna un objeto de la clase B?  >:( :P
« Última modificación: 22 Diciembre 2016, 19:28 por 4dr14n31t0r » En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #4 en: 22 Diciembre 2016, 19:21 »

No es obligatorio importar el paquete de la clase B cuando llamas al metodo getB()

Código
  1. package test;
  2.  
  3. import paquete_a.A;
  4. //No es necesaria la importación de la clase B
  5. import paquete_c.C;
  6.  
  7. public class Test_2{
  8.    public static void main(String[] args){
  9.        A a = new A();
  10.        a.getB();
  11.    }
  12. }


El anterior codigo es funcional pero no le puedes asignar a una variable de tipo B porque la actual clase no reconoce ese tipo de dato, miralo asi cuando llamas a getB() te retorna la referencia donde se encuentra el objeto pero no sabe de que tipo es, lo unico que puedes hacer es importar la clase a la que pertenece o  asginarlo a una variable de tipo Object que es la clase la cual todos los objetos heredan.


En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
4dr14n31t0r

Desconectado Desconectado

Mensajes: 85



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #5 en: 22 Diciembre 2016, 19:28 »

cuando llamas a getB() te retorna la referencia donde se encuentra el objeto pero no sabe de que tipo es, lo unico que puedes hacer es importar la clase a la que pertenece o  asginarlo a una variable de tipo Object que es la clase la cual todos los objetos heredan.
Si no reconoce la clase, ¿Como es posible ejecutar un metodo de la misma sin importarla? Como en este caso, que seria el metodo getB(). ¿Como reconoce este metodo sin reconocer la clase?
En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #6 en: 22 Diciembre 2016, 19:39 »

Todos los objetos al heredar de Object contiene el metodo getClass() con el cual se puede identificar a que clase pertenece

Código
  1. public static void main(String[] args) {
  2.       A a=new A();    
  3.       System.out.println(a.getB().getClass());
  4.    }
  5.  
Ejecuta lo anterior el cual te mostrara la clase y el paquete al que pertenece el objeto
En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
4dr14n31t0r

Desconectado Desconectado

Mensajes: 85



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #7 en: 22 Diciembre 2016, 19:49 »

Todos los objetos al heredar de Object contiene el metodo getClass() con el cual se puede identificar a que clase pertenece
¿Y como puedes saber que el objeto tiene una funcion llamada getC() con getClass()? La unica forma que se me ocurre es haciendo uso de una cosa que se llama "Reflection", pero obviamente no creo que sea asi como se hace, ya que de esa forma se consume muchos mas recursos.
En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #8 en: 22 Diciembre 2016, 20:14 »

Como te mencione el metodo getClass() te regresa la clase y el paquete al que pertenece la clase pero al mismo tiempo nos das información de la clase en especifico como que métodos han sido declarados.

Para ello usamos la funcion getDeclaredMethods() que viene en el metodo getClass() y si utiliza "Reflection".

Código
  1. public static void main(String[] args) {
  2.       A a=new A();    
  3.       for(Method current :a.getB().getClass().getDeclaredMethods()){
  4.           System.out.println(current.getName());
  5.       }
  6.    }

« Última modificación: 22 Diciembre 2016, 20:20 por crack81 » En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
4dr14n31t0r

Desconectado Desconectado

Mensajes: 85



Ver Perfil
Re: ¿Por que solo hay que importar una clase cuando la escribes en el codigo?
« Respuesta #9 en: 22 Diciembre 2016, 22:53 »

He formulado la misma pregunta en stack overflow para ver si ellos me entienden y me han respondido algo que no tiene nada que ver con tu explicacion.
Parece ser que cuando pones "import paquete.Clase" lo que estarias haciendo en C seria algo asi como "#define Clase paquete.Clase"
« Última modificación: 22 Diciembre 2016, 22:56 por 4dr14n31t0r » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pc se reinicia solo cuando intento abrir WIN TV
Windows
cmjesus 2 1,448 Último mensaje 9 Julio 2014, 02:24
por andreselmejor
Unificar código en clase abstracta « 1 2 »
Java
CaTZ 11 2,954 Último mensaje 16 Enero 2015, 10:33
por CaTZ
Solo 12,5 GB cuando en realidad tengo 320GB
GNU/Linux
Chico de fuego 2 1,227 Último mensaje 6 Julio 2015, 15:21
por gAb1
Color celeste de clase en codigo asp.net c#
.NET (C#, VB.NET, ASP)
llogui 1 1,040 Último mensaje 5 Agosto 2016, 09:47
por Eleкtro
QT Creator C++, importar valor de lineEdit a funcion en una nueva clase
Programación C/C++
aurquiel 1 838 Último mensaje 18 Noviembre 2016, 23:14
por DoeJohn
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines