No estoy muy seguro de que quieres representar exactamente con el atributo tiempo.
Si quieres representar simplemente el número de horas que tarda en realizar su recorrido:
7 horas, 2 horas, etc...
Puedes usar simplemente un atributo int que trabaje con minutos y dividiendo por 60 puedes convertir a horas.
Haciendo mod de 60 obtienes el resto para mayor precisión.
Por ejemplo,
tiempo = 450;(minutos)
tiempo / 60 --> 450 / 60 = 7 (horas enteras)
tiempo mod 60 --> 450 % 60 = 30 (resto minutos)
450 minutos son 7 horas y 30 minutos.
Es distinto si quieres representar un tiempo concreto del día
Supongamos que queremos representar la hora a la que sale cada objeto Transporte
Uno sale a las 10:00 de la mañana, otro sale a las 15:30, otro sale a las 20:45....
Y queremos preguntarle al programa que Transporte ha salido ya o cuál no ha salido todavía.
La clase Calendar está algo oxidada ya...
Y Date se considera obsoleta.
Es mejor usar otras clases más nuevas como LocalDate o LocalTime.
Puesto que en este ejemplo solo nos interesa el tiempo y no fechas, es mejor usar
LocalTime.
Así la clase Transporte puede usar un atributo de este tipo.
Y el get y set para tiempo, dejan de ser abstractos y es la superclase Transporte quien tiene el código para gestionar.
Fíjate que para setear el tiempo, usamos dos int, uno representa la hora y la otra el minuto
import java.time.LocalTime;
public abstract class Transporte {
private float precio;
private LocalTime tiempo;
private int capacidad;
public abstract void VelocidadMedia();
public abstract void Salida();
public float getPrecio() {
return precio;
}
public int getCapacidad() {
return capacidad;
}
public abstract void setCapacidad(int capacidad);
public abstract void setPrecio(float precio);
public LocalTime getTiempo() {
return tiempo;
}
public void setTiempo(int hora, int minuto) {
tiempo = LocalTime.of(hora, minuto);
}
}
Podemos hacer ahora un código para probar como funciona ese atributo.
Este es un programita que hace una lista de tres Barcos en un array.
Hay un método que, según la hora actual (coge la hora del sistema), nos dice que barcos han zarpado ya, y si no lo han hecho, nos dice a que hora salen y cuanto tiempo falta para que zarpen:
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
public class Prueba {
private static Barco[] barcos; //Listado de barcos
public static void main(String[] args) {
//Creamos lista e indicamos sus horas de salida
barcos = new Barco[3];
barcos[0] = new Barco(1);
barcos[0].setTiempo(10, 0);//Sale a las 10:00
barcos[1] = new Barco(2);
barcos[1].setTiempo(15, 30);//Sale a las 15:30
barcos[2] = new Barco(3);
barcos[2].setTiempo(22, 45);//Sale a las 22:45
comprobarHorarios();
}
/**
* Recorre la lista de Barcos e indica que barcos han salido ya
* y los que no han salido, cuanto tiempo falta para que salgan
*/
public static void comprobarHorarios() {
//Recogemos la hora actual, a partir de la hora del sistema
LocalTime ahora = LocalTime.now();
System.out.println("Hora actual: " + ahora.getHour() + ":" + ahora.getMinute());
for (int i = 0; i < barcos.length; i++) {
if (barcos[i].getTiempo().isAfter(ahora)) { //Este barco aún no ha salido
System.out.println("\n\nHay un Barco disponible a las " + barcos[i].getTiempo().toString());
long minutosHastaSalir = ahora.until(barcos[i].getTiempo(), ChronoUnit.MINUTES);
int horas = (int) (minutosHastaSalir / 60);
int minutos = (int) (minutosHastaSalir % 60);
System.out.println("Faltan " + horas + " horas y " + minutos + " minutos para zarpar");
}
else { //Este barco ya ha salido
System.out.println("\n\nHay un barco que ya ha zarpado a las " + barcos[i].getTiempo().toString());
System.out.println("No estará disponible hasta mañana");
}
}
}
}
En pantalla nos sale un resultado como este:
Hora actual: 0:20
Hay un Barco disponible a las 10:00
Faltan 9 horas y 39 minutos para zarpar
Hay un Barco disponible a las 15:30
Faltan 15 horas y 9 minutos para zarpar
Hay un Barco disponible a las 22:45
Faltan 22 horas y 24 minutos para zarpar
Si engaño en el código para decir que "ahora" son las 15:25
//Recogemos la hora actual, a partir de la hora del sistema
LocalTime ahora = LocalTime.of(15, 25);
En pantalla tenemos
Hora actual: 15:25
Hay un barco que ya ha zarpado a las 10:00
No estará disponible hasta mañana
Hay un Barco disponible a las 15:30
Faltan 0 horas y 5 minutos para zarpar
Hay un Barco disponible a las 22:45
Faltan 7 horas y 20 minutos para zarpar
Esta podría ser una forma de hacerlo. Todo depende de qué quieres representar exactamente con el atributo tiempo que, repito, aún no me ha quedado claro.
Incluso se puede combinar. Un atributo para la hora de salida y otro atributo para indicar la duración del viaje.
De ese modo, solo con indicar la hora de salida, se puede hacer el cálculo de cuál sera la hora de llegada, puesto que hay otro atributo para indicar la duración.
En cualquier caso, ahora ya conoces la clase LocalTime, que es una maravilla. Oracle la introdujo junto con LocalDate cuando lanzó Java8, porque Calendar, Date y otras necesitaban modernizarse.
Un saludo.