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


 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  clases hijas que al ser instanciadas tienen el mismo valor del atributo estatico
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: clases hijas que al ser instanciadas tienen el mismo valor del atributo estatico  (Leído 415 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 538


youtu.be/0YhflLRE-DA


Ver Perfil
clases hijas que al ser instanciadas tienen el mismo valor del atributo estatico
« en: 17 Julio 2019, 06:42 »

clases hijas que al ser instanciadas tienen el mismo valor del atributo estatico del padre(clase abstracta)

Esto de crear clases hijas sin obtener un nuevo valor para el atributo privado estatico "saldo" en cada instancia , me pueden decir porque es valido esto? yo trate de simular el dinero disponible que posee un cajero y me sale que esta bien pero exijo explicaciones  :huh:

Código
  1. package padre;
  2.  
  3. import java.util.Scanner;
  4.  
  5. /**
  6.  *
  7.  * @author Ana Keldysh, Vanessa Navarro
  8.  */
  9. public abstract class Cajero {
  10.  
  11.    protected int transaccion, retiro, deposito, disponible = 500;
  12.    private static int saldo = 900; //Este valor siempre esta en cada instancia de una clase hija "Cliente", pero no toma el valor 900 sino el ultimo valor modificado o no
  13.    Scanner entrada = new Scanner(System.in);
  14.  
  15.    public void operaciones() {
  16.        int opcion = 0;
  17.        do {
  18.            System.out.println("Elija una opción");
  19.            System.out.println("1. Consultar saldo");
  20.            System.out.println("2. Extraer dinero");
  21.            System.out.println("3. Depositar dinero");
  22.            System.out.println("4. Salir");
  23.            opcion = entrada.nextInt();
  24.            switch (opcion) {
  25.                case 1:
  26.                    System.out.println("Saldo disponible: $" + disponible);
  27.                    break;
  28.                case 2:
  29.                    extraer();
  30.                    transaccion(false, retiro);
  31.                    break;
  32.                case 3:
  33.                    depositar();
  34.                    transaccion(true, deposito);
  35.                    break;
  36.                case 4:
  37.                    System.out.println("Gracias! Vuelva pronto" + Cajero.getSaldo());
  38.                    break;
  39.                default:
  40.                    System.out.println("Opcion incorrecta, intente nuevamente");
  41.            }
  42.        } while (opcion != 4);
  43.  
  44.    }
  45.  
  46.    public abstract void transaccion(boolean depositar, int dinero);
  47.  
  48.    //Método para extraer dinero
  49.    public void extraer() {
  50.        retiro = entrada.nextInt();
  51.    }
  52.  
  53.    //Método para depositar dinero
  54.    public void depositar() {
  55.        deposito = entrada.nextInt();
  56.    }
  57.  
  58.    public static int getSaldo() {
  59.        return saldo;
  60.    }
  61.  
  62.    public static void setSaldo(int aSaldo) {
  63.        saldo = aSaldo;
  64.    }
  65.  
  66. }
  67.  

Código
  1. package hijo;
  2.  
  3. /**
  4.  *
  5.  * @author Ana Keldysh, Vanessa Navarro
  6.  */
  7. public class Cliente extends Cajero {
  8.  
  9.    @Override
  10.    public void transaccion(boolean depositar, int dinero) {
  11.        if (depositar) {
  12.            disponible += dinero;
  13.            Cajero.setSaldo(Cajero.getSaldo() + dinero);
  14.        } else {
  15.            if (dinero > disponible) {
  16.                System.out.println("Saldo insuficiente");
  17.            } else if (dinero > Cajero.getSaldo()) {
  18.                System.out.println("Lo sentimos, la transacción no puede llevarse acabo");
  19.            } else {
  20.                disponible -= dinero;
  21.                Cajero.setSaldo(Cajero.getSaldo() - dinero);
  22.            }
  23.        }
  24.    }
  25.  
  26. }
  27.  



En línea

{_id: "5ef16999f6ce240abc225ss3",
nombre: "Ana Keldysh",
nacionalidad: "Argentina",
edad: "17",
profesion: "Desarrollador Web Full Stack",
"__v": 0
}
NEBIRE


Desconectado Desconectado

Mensajes: 2.272


Ver Perfil
Re: clases hijas que al ser instanciadas tienen el mismo valor del atributo estatico
« Respuesta #1 en: 17 Julio 2019, 10:58 »

Un campo debe ser estático, cuando sin importar la instancia ese valor deba mantenerse siempre así. Y a lo sumo ser cambiado desde donde se puede (pero para todas las instancias), de no ser así entonces sería preferible que fuera una constante.

Para entenderlo lo mejor es exponer un ejemplo:
He crado una interfaz vehículo... de la que luego he implementado una clase 'bicicleta', la clase bicicleta expone uel miembro estático "número de ruedas", cuyo valor evidente es 2... pués una bicicleta siempre tiene dos ruedas, si tiene otra cantidad será otro tipo de vehículo, no una bici... Si más tarde implemento una clase Triciclo, igualmente a ese campo le asignaría 3 ruedas, y si fuera 'coche' 4....

Ahora bien, supongmaos que tenemos un valor "Kilometros" (recorridos), carece de sentido que ese miembro sea estático... debe ir cambiando contínuamente.

Luego en tu diseño debes saber cuando un campo tiene que ser una constante, cuando estático y cuando variable.

En tu ejemplo, "saldo", es una cantidad que va a estar variando contínuamente, luego carece sentido de ponerle el atributo estático.


El uso más claro para el atributo 'static' suele verse en los métodos/funciones.

Supongamos que independientemente de cual sea la clase de vehículo creado, hay un método Pintar(color), si para todos los tipos de vehículos el método va a hacer siempre lo mismo, se hace estático, lo que en la práctica implica que solo existirá una copia de ese método en memoria y que es compartido por todos y que por supuesto no retiene datos de ninguno en específico, toma lo que se le da, hace el trabajo y lo entrega... internamente (sobre sí, no modifica nada que luego haría fallar algo, por ejemplo no importaría que internamente tuviera un campo que contara cuantos vehículos ha pintado y que se autoincremente con cada invocación, pués eso no interfiere con el trabajo que debe hacer).

Dicho de otra manera, cuando un miembro o método usa el atributo 'static' existe una única dirección para ese miembro/método en todas las instancias y es la misma. si no es 'static' cada instancia posee una dirección de memoria propia del miembro/método es decir es particular.
Es algo así como que en cada ciudad hay un solo alcalde... pero en cada casa habrá (por poner un ejemplo), una madre, un padre y un hijo, ...pero el alcalde, es el mismo para cada casa de dicha ciudad. Así, los miembros/métodos estáticos son compartidos por todas las instancias.

Aquí una ligera explicación (los ejemplos no son precisamente buenos, pero el texto inicial sí):
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html



Releyéndote, me parece entenderte mejor, pués aclaras que el saldo no es el de un cliente cualquiera si no el del cajero... lo cual por supuesto interesa proteger...

Bien en caso así, nota que lo que necesitas es el "static int SaldoInicial = 900" y luego otro miembro llamado (por ejemplo) "int saldoActual"
Ahora tu externamente operas con tu métodos 'depositar/extraer', pero estos alteran solo el 'SaldoActual' no el 'SaldoInicial'...


Un ejemplo en pseudocódigo para no perderse en detalles del lenguaje y hacerlo engorroso con 500 palabras superfluas...
Código:
satic int SaldoInicial = 900
int SaltoActual = 0

getSaldoInicial{
   devolver SaldoInicial
}

getSaldoActual{
   devolver (SaldoActual + SaldoInicial)
}

void Depositar(int cantidad){
   Si (cantidad >0) // no quremos que deposite valores negativos, para el caso mejor declarar 'cantidad' como un entero sin signo, así siempre será positivo.
       SaldoActual += cantidad
   fin si
}

void Extraer(int cantidad){
    Si (cantidad > 0) // no queremos que extraiga valores negativos, para el caso mejor declarar 'cantidad' como un entero sin signo, así siempre será positivo.
       Si (getSaldoActual -cantidad) >0)
           SaldoActual -= cantidad
       Sino
           Mensaje "no queda suficiente saldo en depósito en el 'cajero', para realizar la transacción (intente con una cantidad menor)..."
        fin si
   fin si
}
Como se ve  se opera con 'saldoactual'. El campo "saldoActual" inicialmente vale 0, pero al consultarlo suma siempre el valor 900 del campo "saldoInicial", el depósito queda a cero, cuando saldoActual = -900, pués -900 + SaldoInicial = (900-900) = 0

en el mensaje de 'no queda saldo... directamente s ele podría decir cuanto saldo queda, haciendo las cuentas pertienentes
Código:
void Extraer(int cantidad){ // no queremos que extraiga valores negativos, para el caso mejor declarar 'cantidad' como un entero sin signo, así siempre será positivo.
    int tmp

    Si (cantidad > 0)
       tmp = (getSaldoActual - cantidad)
       Si (tmp >0)
           SaldoActual -= cantidad
       Sino
           tmp = (cantidad - getSaldoActual)  //cantidad solicitada es mayor que cantidad en depósito.
           Mensaje "No queda en depósito la cantidad solicitada, el máximo que podría extraer ahora mismo del 'cajero' es: tmp ..."
        fin si
   fin si
}

Por último, nota además como tanto el saldoInicial como el SaldoActual están protegidos para solo ser leídos y no sobreescritos (con de solo lectura, no se proveen métodos de escritura), la única manera de escribir un nuevo valor en SaldoActual es a través de las operaciones: Depositar y Extraer. Y en cuanto a SaldoInicial, lo lógico es que cuando llegare el furgón blindado, si pudiera de nuevo ser modificado (si no, sería una constante), pero para eso debe hacerse con su propio método en su clase y siendo dicho método no accesible por las instancias...


« Última modificación: 17 Julio 2019, 11:54 por NEBIRE » En línea

Beginner Web


Desconectado Desconectado

Mensajes: 538


youtu.be/0YhflLRE-DA


Ver Perfil
Re: clases hijas que al ser instanciadas tienen el mismo valor del atributo estatico
« Respuesta #2 en: 18 Julio 2019, 00:49 »

muchas gracias, con las dos primeras lineas que leí me ha quedado bien claro, era lo que yo sospechaba que pasaba en estas clases, te amo  ;-)
En línea

{_id: "5ef16999f6ce240abc225ss3",
nombre: "Ana Keldysh",
nacionalidad: "Argentina",
edad: "17",
profesion: "Desarrollador Web Full Stack",
"__v": 0
}
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines