Hola
Lo primero, el coche ha de tener 4 ruedas, así que o ponemos 4 atributos de clase
Rueda, o ponemos un array de dicha clase.
Ah, y salvo que haya un motivo de peso, los atributos de chasis y ruedas también deben ser privados.
public class Coche {
private String matricula;
private String marca;
private String modelo;
private int potencia;
private int velocidadMaxima;
private Rueda[] ruedas;
private Chasis chasis;
Los atributos de las clases
Chasis y
Rueda también es recomendable que sean privados.
Ahora, cómo construir un coche... aquí efectivamente es donde se presenta el problema.
Las clases
Chasis y
Rueda están anidadas dentro de
Coche, por tanto, por sí solas no pueden existir.
Para que existan y puedan ser invocadas, primero hay que instanciar un objeto
Coche.
Por tanto, en el constructor de coche no pondremos que reciban argumentos para chasis y ruedas, porque para disponer de ellos primero hay que construir el propio coche.
Lo que sí haremos será dotar a la clase de unos setters para, después de haber creado el coche, poder crear y asignarle chasis y ruedas.
public class Coche {
private String matricula;
private String marca;
private String modelo;
private int potencia;
private int velocidadMaxima;
private Rueda[] ruedas;
private Chasis chasis;
//Constructor no recibe ni ruedas ni chasis
public Coche(String matricula, String marca, String modelo, int potencia, int velocidadMaxima) {
this.matricula = matricula;
this.marca = marca;
this.modelo = modelo;
this.potencia = potencia;
this.velocidadMaxima = velocidadMaxima;
}
//Chasis y ruedas llegarán por setters
public void setChasis(Chasis chasis) {
this.chasis = chasis;
}
public void setRuedas(Rueda[] ruedas) {
this.ruedas = ruedas;
}
Ahora en el Main ya podemos crear todo lo necesario.
Primero el coche.
Luego, gracias a que tenemos un coche, podemos crear ruedas y chasis
Por último, asignamos ese chasis y ruedas, al coche creado.
Fíjate en el código, que para indicar el tipo del objeto que vamos a crear llamamos a los nombres de clases
Coche.Rueda y
Coche.ChasisPero para construir los objetos, llamamos al nombre del objeto
coche instanciado y a través de él podemos instancias los objetos de las clases anidadas.
public class Main {
public static void main(String[] args) {
//Primero creamos coche
Coche coche = new Coche("1998DTM","Jaguar","X-Type",280,250);
//Ahora, usando la instancia de Coche, podemos crear Ruedas y Chasis
Coche.Chasis chasis = coche.new Chasis("Carbono", 159.2);
Coche.Rueda[] ruedas = new Coche.Rueda[] {
//Ruedas delanteras
coche.new Rueda(145, "Seco", "Dunlop", "Eco Control"),
coche.new Rueda(145, "Seco", "Dunlop", "Eco Control"),
//Ruedas traseras
coche.new Rueda(165, "Seco", "Dunlop", "Sport Max Race"),
coche.new Rueda(165, "Seco", "Dunlop", "Sport Max Race")
};
//Tras crearlos, podemos asignarlo a la instancia de Coche
coche.setChasis(chasis);
coche.setRuedas(ruedas);
}
}
Como puedes ver, esto de las clases anónimas es un poco lioso y por lo general vamos a preferir usarlas en casos especiales, sobre todo cuando no se requieran datos externos a la clase que las contiene.
Es decir, todo lo necesario para crear una clase anónima, ya existe dentro de la clase principal contenedora y por lo tanto no hay necesidad de invocarlas fuera de dicha clase.
En este caso, para crear chasis y ruedas, se necesitan datos externos. Se supone que habrá un usuario tecleando los datos de las ruedas y de los diferentes chasis, así que para ir creando objetos con esos datos necesitamos poder invocar a la clase
Rueda y
Chasis desde la clase "main" donde se están pidiendo datos al usuario.
Es entonces cuando hay que complicarse con los nombres compuestos de dos (o más) clases separadas por puntos y la necesidad de instancia primero las clases "contenedoras" para luego poder llamar a las clases "anidadas".
En casos así, vamos a preferir escribir las distintas clases por separado, en lugar de anidarlas.