¿Por qué a los objetos de la clase Retiro re1, re2, etc... le invocas dos veces el método setTotalRetiro() con distintos valores?
Lo que haya hecho re1.setTotalRetiro(3500000), ¿no quedaría machacado si acto seguido hacemos re1.setTotalRetiro(200000)?
Y luego habría que revisar la lógica de ese método setTotalRetiro()
Si recibe por parámetro esos 3500000..
- el primer if no hace nada, el atributo "float retiro" mantiene el valor 0.0 que el compilador le da por defecto.
- el segundo if tampoco hace nada, el atributo "float retiro" conserva valor 0.0
- el tercer if SI actúa, ahora retiro vale 0.04
- el cuarto if, cambia el valor de retiro (porque 0.04 != 4) y ahora vale 1
Ahora se hace
descuento = totalRetiro * retiro;
Es decir:
descuento = 3500000 * 1;
O sea que ahora mismo retiro vale 1, descuento vale 3500000 y totalDescuento vale 3500000
Y por último se hace:
retiro = descuento - totalRetiro;
Es decir:
retiro = 3500000 - 3500000
Resultado:
retiro = 0;
Por eso te sale un 0 en pantalla.
La lógica de ese método no es correcta. Toca revisarla.