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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Arreglo de inmuebles
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arreglo de inmuebles  (Leído 2,023 veces)
Omar_2013

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Arreglo de inmuebles
« en: 18 Febrero 2015, 21:30 pm »

Hola, estoy haciendo un programa pero tengo un error en la implementación de mi código y no se cual es, lo que pasa es que escogiendo la opción 2(Mostrar Inmuebles), sale para cada inmueble el mismo propietario.

Estas son las Clases

Código
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4.  
  5.  
  6. public class TestPropietario {
  7.  
  8. private static Inmueble ArregloI[]=new Inmueble[5];
  9.  
  10. public static void Imprimir(int Pos) throws IOException{
  11. System.out.println("\nPropietario " + ArregloI[Pos].getMiPropietario().getNombreCompleto() + ":\n");
  12. System.out.println("Estado " + ArregloI[Pos].getEstado() + "\n");
  13. }
  14.  
  15. public static int MenuPrincipal() throws IOException{
  16. int Opcion=0;
  17. String Capturar;
  18.  
  19. System.out.println("\n1. Ingresar un inmueble\n");
  20. System.out.println("2. Mostrar Inmuebles\n");
  21. System.out.println("3. Salir\n");
  22.  
  23. Capturar= Lector.readLine();
  24. Opcion=Integer.parseInt(Capturar);
  25. return Opcion;
  26. }
  27.  
  28.  
  29. public static void main(String[] args) throws IOException{
  30.  
  31. int OpcionM=0, Cont=0;
  32. Propietario AuxProp= new Propietario(null, null);
  33. String Estado = null;
  34.  
  35. String Capturar;
  36.  
  37. for(int i=0; i<5; i++)
  38. ArregloI[i]= new Inmueble();
  39.  
  40. while(OpcionM!=3){
  41.  
  42. OpcionM=MenuPrincipal();
  43.  
  44. switch(OpcionM){
  45. case 1:
  46. System.out.println("Ingrese el Estado del Inmueble (Libre - Ocupado)");
  47. Capturar= Lector.readLine();
  48. Estado=Capturar;
  49.  
  50. System.out.println("Ingrese el Nombre del Propietario");
  51. Capturar= Lector.readLine();
  52. AuxProp.setNombreCompleto(Capturar);
  53.  
  54. System.out.println("Ingrese el numero de telefono del propietario");
  55. Capturar= Lector.readLine();
  56. AuxProp.setTelContac(Capturar);
  57.  
  58. if(Cont<5){
  59. ArregloI[Cont].Llenar(Estado, AuxProp);
  60. Cont+=1;
  61. }
  62. else
  63. System.out.println("Ha llegado al límite máximo de Inmuebles");
  64. break;
  65. case 2:
  66. for(int i=0; i<5; i++)
  67. Imprimir(i);
  68. break;
  69. case 3:
  70. break;
  71. }
  72. }
  73.  
  74.  
  75. }
  76.  



Código
  1.  
  2. public class Propietario {
  3. private String NombreCompleto;
  4. private String TelContac;
  5.  
  6.  
  7. public Propietario(String nombreCompleto, String telContac) {
  8. NombreCompleto = nombreCompleto;
  9. TelContac = telContac;
  10. }
  11.  
  12.  
  13. public String getNombreCompleto() {
  14. return NombreCompleto;
  15. }
  16.  
  17.  
  18. public void setNombreCompleto(String nombreCompleto) {
  19. NombreCompleto = nombreCompleto;
  20. }
  21.  
  22.  
  23. public String getTelContac() {
  24. return TelContac;
  25. }
  26.  
  27.  
  28. public void setTelContac(String telContac) {
  29. TelContac = telContac;
  30. }
  31.  
  32. }
  33.  



Código
  1.  
  2. public class Inmueble {
  3. private String Estado;
  4. private Propietario MiPropietario=new Propietario(null, null);
  5.  
  6.  
  7. public void Llenar(String Estado, Propietario MiPropietario){
  8. setEstado(Estado);
  9. setMiPropietario(MiPropietario);
  10. }
  11.  
  12. public Inmueble() {
  13. }
  14.  
  15. public String getEstado() {
  16. return Estado;
  17. }
  18. public void setEstado(String estado) {
  19. Estado = estado;
  20. }
  21. public Propietario getMiPropietario() {
  22. return MiPropietario;
  23. }
  24. public void setMiPropietario(Propietario miPropietario) {
  25. MiPropietario = miPropietario;
  26. }
  27. }
  28.  

Verán, al momento ingresar a la opción 2 después de haber llenado 2 inmueble sale algo así:



« Última modificación: 18 Febrero 2015, 21:32 pm por Omar_2013 » En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Arreglo de inmuebles
« Respuesta #1 en: 18 Febrero 2015, 22:47 pm »

Primero tienes que entender bien la POO para poder aplicarla. Te explicaré un poco.

Ésta línea:

Código
  1. Propietario AuxProp= new Propietario(null, null);

Lo que hace es crear una instancia de la clase Propiertario. A partir de ahora, AuxProp es un objeto que guarda una referencia. Hay dos estados en la creación de objetos:

  • Declaración
  • Instanciación


PARTE 1: DECLARACIÓN


Código
  1. Propietario auxProp;
.

Éste objeto le indica al compilador que es un objeto tipo Propietario pero que aún no es instanciado. Es como si Lamborgini creara un plano de un nuevo automóvil, el plano indica que dicho plano es de tipo X Modelo, pero aún no ha sido creado, por lo que ese plano no tiene utilidad hasta que se construya.

Volviendo a tu código, auxProp aún no ha sido construido, está en "espera". En éste punto, el objeto auxProp tiene una referencia que la VM le asigna por defecto a los objetos sin instanciar, que es NULL. Un valor NULL significa que no hace referencia a absolutamente nada.

PARTE 2: INSTANCIACIÓN


En ésta parte se construye el objeto tipo Propietario con la palabra reservada new. Pon especial atención en ésta palabra. En Java y en todos los lenguajes de alto nivel, la palabra new hace que se construya una representación de una clase y dicha representación tendrá los atributos y métodos/funciones de dicha clase. Ésto es ahora una instancia, un objeto funcional.

Al instanciar un objeto con new, la VM le asigna una dirección en memoria y dicho objeto siempre hará referencia a esa dirección en memoria. Cuando tu uses auxProp en realidad estás llamando al objeto que tienes almacenado en algún espacio de memoria. Entender ésto es muy importante.

Como ya has creado e instanciado tu objeto tipo Propietario, se le ha asignado una dirección en memoria. Ahora, cuando tu haces:

Código
  1. AuxProp.setNombreCompleto(Capturar);

Las veces que hagas eso, le estarás cambiando el nombre al mismo objeto. Si ese mismo objeto Propietario lo guardas en 5 objetos Immueble, los cinco objetos Propietario en los 5 objetos Immueble serán el mismo. Por ésta razón, cuando le cambias en nombre al objeto 1, 2, 3, 4 o 5, al imprimir los objetos Propietario te mostrará la misma información, por la razón que es el mismo objeto en memoria.

Lo que tienes que hacer es simplemente eliminar la declaración del objeto auxProp del main y colocarlo dentro del case 1 del switch. De ésta manera:

Código
  1. System.out.println("Ingrese el Estado del Inmueble (Libre - Ocupado)");
  2. String estado = lector.readLine();
  3.  
  4. System.out.println("Ingrese el Nombre del Propietario");
  5. Propietario propietario = new Propietario();
  6. propietario.setNombreCompleto(lector.readLine());
  7.  
  8. System.out.println("Ingrese el numero de telefono del propietario");
  9. propietario.setTelContac(lector.readLine());
  10.  
  11. if(Cont<5){
  12.    ArregloI[Cont].Llenar(Estado, AuxProp);
  13.    Cont+=1;
  14. }
  15. else
  16.    System.out.println("Ha llegado al l&#237;mite m&#225;ximo de Inmuebles");
  17. break;


Así estamos declarando un objeto Propietario cada vez que se elige la opción uno. Por lo que, cada vez que elijas la opción 1, se creará un nuevo objeto Propietario y por lo tanto serán objetos diferentes.

Como recomendación:

  • Las variables deben empezar por minúscula. Si hay una segunda palabra, ésta debe empezar con mayúscula.
  • Analizar si una variable u objeto va a ser utilizada solo en un pequeño ámbito o si será compartida entre varios procesos. Ésto para evitar crear variables en contextos donde no se van a utilizar y gastar memoria.
  • Empieza a utilizar POO.
  • Leer buenas prácticas en Java
  • Leer Patrones de diseño en Java


« Última modificación: 18 Febrero 2015, 22:50 pm por Gus Garsaky » En línea

"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
Omar_2013

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Arreglo de inmuebles
« Respuesta #2 en: 18 Febrero 2015, 22:54 pm »

Wow que tremenda explicación ;-)  muchas gracias por tu tiempo Gus Garsaky.
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Arreglo de inmuebles
« Respuesta #3 en: 18 Febrero 2015, 23:12 pm »

De nada amigo mío, cuando gustes ^^

Un salu2.
En línea

"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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo en ComboBox
Programación Visual Basic
yonky_85 2 2,493 Último mensaje 28 Septiembre 2006, 18:40 pm
por CeLaYa
JMenuItem en arreglo
Java
ioshi 2 4,338 Último mensaje 15 Abril 2009, 20:41 pm
por celestino
Sistema de administracion de posada/alquiler/venta de Inmuebles, conocen alguno?
Bases de Datos
Graphixx 0 1,800 Último mensaje 29 Septiembre 2012, 00:04 am
por Graphixx
arreglo en c++
Programación C/C++
sabar 7 3,464 Último mensaje 1 Diciembre 2014, 23:54 pm
por zShackra
Consulta Inmuebles/Contratos
Bases de Datos
e500 6 2,244 Último mensaje 15 Febrero 2019, 20:53 pm
por e500
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines