¿En qué estoy fallando en herencia java? auxilio por favor

Iniciado por miltonprogramador, 15 Diciembre 2016, 15:53 PM

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

miltonprogramador

¿En qué estoy fallando en herencia java?

Hola a todos, esta es mi primera vez que pido ayuda en este foro y espero que puedan ayudarme a la brevedad posible porque tengo gran urgencia...

Les explico: Estoy desarrollando un sistema servidor con soporte a multiples clientes en java. Hasta ahora apenas vy por el desarrollo del servidor y mi dificultad en cocreto es mantener los datos de logueo (o sessión) en memoria con los cambios que las clases hijas puedan hacer, es decir, especificamente tengo una super clase denominada "Servidor" y una que hereda de ella denominada "Personas". Colocare las secciones del código que mestran la dificultad:
Código (java) [Seleccionar]

class Servidor {
    /* Declaración de variables */
    private   Escritorio    escritorio;
    private   Escritorio    vstEscritorio;
    private   Validador     validacion;
    public    Icono         ico;
    public    boolean       estadoSesion, foco;
    //private String        pantallaActiva;
    protected String[][]    validable;
    //Variables de Sesion
    public   boolean        autenticado;
    public   int            idSesionServidor;
    public   String         idUsuarioServidor;
    public   String         privilegioUsuarioServidor;
    public   String         nombreUsuarioServidor;
    public   String         fechaSesionServidor;
    public   String         horaSesionServidor;
    //public   String        ultimaSesionUsuarioServidor;
    public   HashMap        permisosUsuarioServidor;
    //Constructores ...........................................................
    public Servidor(){
    }
    public Servidor(String ini){
        vstEscritorio = new Escritorio();
        mostrarVista(vstEscritorio);
        iniciarVariables();
        escritorio.txtABitacora.setText(
                                escritorio.txtABitacora.getText() +
                                Bitacora.get(                                       
                                        ">> Hola!, el servidor 'nombre del servidor' "
                                        + "está activo.\n>> Por ahora sus "
                                        + "servicios se encuentran apagados.",
                                        this.nombreUsuarioServidor
                                )
                        );
        if ( idSesionServidor != 0 ){
            iniciarConectividad();
        }else{
            escritorio.txtABitacora.setText(
                                escritorio.txtABitacora.getText() +
                                Bitacora.get(                                       
                                        ">> Se requiere Autenticación de Usuario",
                                        this.nombreUsuarioServidor
                                )
                        );
            autenticarUsuario();
            System.out.println(this.nombreUsuarioServidor); // ---> AQUI NO MUESTRA EL NOMBRE DE USUARIO ACTUALIZADO. (E S T A   E S   L A   D I F I C U L T A D )
            if ( autenticado == true ) {
                escritorio.txtABitacora.setText(
                                escritorio.txtABitacora.getText() +
                                Bitacora.get(                                       
                                        ">> Ya pueden iniciarse los servicios",
                                        this.nombreUsuarioServidor   //--->OBVIAMENTE AQUI TAMPOCO MUESTRA EL DATO ACTUALIZADO
                                )
                        );
            }
        }
    }
    private void iniciarVariables(){
        //Variables de sesion
        autenticado = false;
        idSesionServidor = 0; //Variable con el id de la sesion.....
        idUsuarioServidor = "svr";
        privilegioUsuarioServidor = "boot";
        nombreUsuarioServidor = "Servidor";
       
    }
    private void autenticarUsuario() {
        CtrlPersonas vstLogin = new CtrlPersonas();
        escritorio.txtABitacora.setText(
                                escritorio.txtABitacora.getText() +
                                Bitacora.get(                                       
                                        ">> Abriendo el formulario de "
                                        + "Autenticación de Usuario",
                                        this.nombreUsuarioServidor
                                )
                        );
        vstLogin.mostrarVistaLogin(escritorio);
    }
}


Este es el constructor y el metodo del problema de la clase Persona que extiende a Servidor

Código (java) [Seleccionar]

//Constructor
    public CtrlPersonas(){
        super(); // ---->> COLOCANDO ESTA LÍNEA O SIN ELLA IGUAL MENTE PEDO acceder A LAS VARIABLES...
        modPersonas = new ModeloPersonas();
    }


//Asi se modifican las variables, mismas que al intentar acceder al valor (que ahora deberia ser el colocado en este método) no lo mantiene y se obtiene es el valor original de la super clase


   this.idUsuarioServidor = resultadoUsuario.getString("rif_personas");
   this.nombreUsuarioServidor = resultadoUsuario.getString("pnombre_personas") + " " + resultadoUsuario.getString("papellido_personas") ;
   this.privilegioUsuarioServidor = resultadoUsuario.getString("privilegio_personas");
   this.fechaSesionServidor = Calendario.get("fecha", null);
   this.horaSesionServidor = Calendario.get("hora", null);
   


Reitero, leer las variables desde la clase personas si se ve el cambio registrado pero, al regresar a la clase Servidor no... y creo que ya deberia hacerlo puesto que la clase servidor se mantiene activa en todo momento, de tal forma que las variables estan en memoria susceptibles a las modificaciones...

Pido, con humildad, su ayuda con urgeeeeeeeeeeeencia... porque de los expertos se aprende a serlo también... gracias de ante mano...

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

miltonprogramador

Aca les dejo dos clases que explican mas claramente lo que necesito resolver...


Esta es la clase principal
Código (java) [Seleccionar]

public class Clase {
    int num;
    public Clase(){
       
    }
   
    public Clase(String ini) {
        num = 0;
        System.out.println("Clase > Invocando a Hija1");
        Hija1 log = new Hija1();
        System.out.println("Clase > Num:" + num); //Aqui deberia mostrarse el valor de num como 27 ya que es el valor que se le asigno desde la sub clase pero no lo mustra... sigue imprimiendo el valor de cero.... NECESITO que mantenga el valor dado en la sub-clase
    }
    public static void main(String[] args) {
        Clase log = new Clase("ini");
    }
}



Esta es la sub clase:

Código (java) [Seleccionar]

public class Hija1 extends Clase {
public Hija1(){
     System.out.println("Hija1 > El valor num es: " + this.num);
     this.num = 27;
     System.out.println("Hija1 > He cambiado el valor de num a: " + this.num);
}   
}
Aprendiendo de los mejores se llega a ser uno de ellos...

ivancea96

Cita de: miltonprogramador en 15 Diciembre 2016, 19:29 PM
Código (java) [Seleccionar]

public class Clase {
    int num;
    public Clase(){
       
    }
   
    public Clase(String ini) {
        num = 0;
        System.out.println("Clase > Invocando a Hija1");
        Hija1 log = new Hija1();
        System.out.println("Clase > Num:" + num); //Aqui deberia mostrarse el valor de num como 27 ya que es el valor que se le asigno desde la sub clase pero no lo mustra... sigue imprimiendo el valor de cero.... NECESITO que mantenga el valor dado en la sub-clase
    }
    public static void main(String[] args) {
        Clase log = new Clase("ini");
    }
}

Código (java) [Seleccionar]

public class Hija1 extends Clase {
public Hija1(){
     System.out.println("Hija1 > El valor num es: " + this.num);
     this.num = 27;
     System.out.println("Hija1 > He cambiado el valor de num a: " + this.num);
}   
}


Heredar implica que la clase hija tendrá los métodos y las variables de la clase padre.
Cuando haces Hija1 log = new Hija1();, estás generando una nueva Hija1, y por tanto, una nueva Clase. Clase tiene su campo num, y es el que estás modificando. Si en evz de eso, pones:
Código (java) [Seleccionar]
public class Clase {
    int num;
    public Clase(){

    }

    public Clase(String ini) {
        num = 0;
        System.out.println("Clase > Invocando a Hija1");
        Hija1 log = new Hija1();
        System.out.println("Clase > Num:" + log.num); //Aqui deberia mostrarse el valor de num como 27 ya que es el valor que se le asigno desde la sub clase pero no lo mustra... sigue imprimiendo el valor de cero.... NECESITO que mantenga el valor dado en la sub-clase
    }
    public static void main(String[] args) {
        Clase log = new Clase("ini");
    }
}

Nótese  el System.out.println, que ahora pone log.num.
Ahora sí que debería mostrarte 27, porque el num que ha sido modificado es el del objeto que acabas de crear.

miltonprogramador

Muchas Gracias por responderme ivancea96... entiendo lo que dices y esta muy correcto... ahora mi inquietud es ¿Entonces no puedo modificar las variables de la superClase y dejar esos cambios presentes para las otras clases? Esto lo necesito para mantener las variables de sesión de mi aplicación cargadas en memoria... darme un indicio que como podria lograrlo?
Aprendiendo de los mejores se llega a ser uno de ellos...

miltonprogramador

Hola... como solución lo siguiente:

crear una nueva clase llamada Sesión.java para colocar en ella los atributos de sesion... esta no sera heredada por nadie pero si instanciada por la clase principal y pasada por parametros las a las demás clases.... Estos son los códigos:

1.- La clase de sesion..
Código (java) [Seleccionar]

public class Sesion {
    int num;
    public Sesion(){
        num=20;
    }
}


2.- La clase principal..
Código (java) [Seleccionar]

public class Clase {
    protected int num;
    public Sesion sesion;
    public Clase(){
       
    }
    public Clase(String ini) {
        sesion = new Sesion();
        System.out.println("Clase > Invocando a Hija1");
        Hija1 log = new Hija1(sesion);
        System.out.println("Clase > Num:" + sesion.num);
    }
    public static void main(String[] args) {
        Clase log = new Clase("ini");
    }
}


3.- y la clase hija que será la que reemplazara el valor del atributo e sesión, mismo que debería matnerse presente durante toda la aplicación
Código (java) [Seleccionar]

public class Hija1 extends Clase {
public Hija1(){
     
}   
public Hija1(Sesion obj){
     System.out.println("Hija1 > El valor num es: " + this.num);
     obj.num = 37;
     System.out.println("Hija1 > He cambiado el valor de num a: " + this.num);
}   
}



Haciendolo de esta manera me mantinene el 37 en la clase principal

MI pregunta es: ¿esto es correcto o es un barbarismo?

guienme por favor...
[/b]
Aprendiendo de los mejores se llega a ser uno de ellos...

PabloPbl

Citar¿Entonces no puedo modificar las variables de la superClase y dejar esos cambios presentes para las otras clases? Esto lo necesito para mantener las variables de sesión de mi aplicación cargadas en memoria... darme un indicio que como podria lograrlo?
Todas las variables que crees en las clases, son de objeto, eso quiere decir que al hacer un cambio en esa variable, se vera reflejada en el objeto y solo en ese objeto, si quieres que se haga que el cambio afecte a todos los objetos puedes declarar esa variable como estática, de esta manera al hacer un cambio se vera reflejado en todos los objetos que instancies de esa clase.

Así se veria una variable estática:
Código (java) [Seleccionar]
static int numero = 10;


CitarHaciendolo de esta manera me mantinene el 37 en la clase principal

MI pregunta es: ¿esto es correcto o es un barbarismo?
Es correcto, ya que cuando pasas un objeto por parámetro, java lo pasa por referencia, es decir que esa variable apuntara también al objeto original, de modo que ambas variables apuntarían al mismo objeto en memoria, y si modificas uno, en realidad no modificas el otro, si no que afectara a ambos por que apuntan a lo mismo objeto.

Espero me entiendas, si no coméntame tu duda.

Saludos.

miltonprogramador

uff hermano habia olvidado por completos los atributos estáticos jejeje... creo que eso resuelve mi problema perfectamente.... de todas maneras estoy abierto a nuevas recomendaciones para el manejo de sesiones para aplicaciones de escritorio en java....


Te agradezco infinitamente... Por eso siempre digo "Aprendiendo de los mejores se lega a ser uno de ellos"...

Esta es mi primera consulta resuelta en tiempo record... puntito para elhacker.net  ;-)
Aprendiendo de los mejores se llega a ser uno de ellos...