Buenas.
Es más intuitivo de lo que parece.
Veamos, un atributo sería la clase SistemaOperativo, que podría ser esta:
public class SistemaOperativo {
private String tipo;
private int version;
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}
Y luego dos atributos para la camara delantera y para la trasera, que como sus atributos son los mismos, no hace falta escribir dos clases, nos bastaría con una sola clase Camara
public class Camara {
private int resolucion;
private int numCamaras;
private boolean estabilidador;
public int getResolucion() {
return resolucion;
}
public void setResolucion(int resolucion) {
this.resolucion = resolucion;
}
public int getNumCamaras() {
return numCamaras;
}
public void setNumCamaras(int numCamaras) {
this.numCamaras = numCamaras;
}
public boolean tieneEstabilidador() {
return estabilidador;
}
public void setEstabilidador(boolean estabilidador) {
this.estabilidador = estabilidador;
}
}
Fíjate que a estas clases no les he puesto constructor. Podríamos ponérselos, pero para este ejemplo no será necesario (aunque esto va un poco a gusto del programador)
El caso es que ahora hay que crear la clase Movil con estos objetos como atributos:
public class Movil {
private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;
}
No está completa, falta constructor y métodos get/set. Y es que aquí es cuando hay que parase a pensar que es lo que podemos necesitar.
Podemos hacer un constructor que reciba TODOS los parámetros necesarios para dar valores a todos los objetos que componen este teléfono móvil. Así que iremos construyendo cada atributo y les seteamos sus valores
public class Movil {
private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;
public Movil(String tipoSo, int version, int resolCamDelan, int numCamDelan, boolean estabilDelan,
int resolCamTras, int numCamTras, boolean estabilTras) {
//Construimos SO
so = new SistemaOperativo();
so.setTipo(tipoSo);
so.setVersion(version);
//Construimos camara delantera
camDelantera = new Camara();
camDelantera.setResolucion(resolCamDelan);
camDelantera.setNumCamaras(numCamDelan);
camDelantera.setEstabilidador(estabilDelan);
//Construimos la trasera
camTrasera = new Camara();
camTrasera.setResolucion(resolCamTras);
camTrasera.setNumCamaras(numCamTras);
camTrasera.setEstabilidador(estabilTras);
}
}
Pero puede que no siempre vayamos a querer usar un constructor al que haya que pasarle taaaantos parámetros.
Así que podemos darle un segundo constructor a nuestra clase, un constructor "por defecto" el cuál no recibe ningún parámetro.
Simplemente construimos los atributos sin darles valores, con la idea de que ya luego en el programa donde se utilice nuestra clase, ya le darán esos valores con unos setters.
public class Movil {
private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;
//Constructor que recibe valores
public Movil(String tipoSo, int version, int resolCamDelan, int numCamDelan, boolean estabilDelan,
int resolCamTras, int numCamTras, boolean estabilTras) {
//Construimos SO
so = new SistemaOperativo();
so.setTipo(tipoSo);
so.setVersion(version);
//Construimos camara delantera
camDelantera = new Camara();
camDelantera.setResolucion(resolCamDelan);
camDelantera.setNumCamaras(numCamDelan);
camDelantera.setEstabilidador(estabilDelan);
//Construimos la trasera
camTrasera = new Camara();
camTrasera.setResolucion(resolCamTras);
camTrasera.setNumCamaras(numCamTras);
camTrasera.setEstabilidador(estabilTras);
}
//Constructor que no recibe valores.
public Movil() {
so = new SistemaOperativo();
camDelantera = new Camara();
camTrasera = new Camara();
}
}
Y ahora, unos getters/setters.
public class Movil {
private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;
//Constructor que recibe valores
public Movil(String tipoSo, int version, int resolCamDelan, int numCamDelan, boolean estabilDelan,
int resolCamTras, int numCamTras, boolean estabilTras) {
//Construimos SO
so = new SistemaOperativo();
so.setTipo(tipoSo);
so.setVersion(version);
//Construimos camara delantera
camDelantera = new Camara();
camDelantera.setResolucion(resolCamDelan);
camDelantera.setNumCamaras(numCamDelan);
camDelantera.setEstabilidador(estabilDelan);
//Construimos la trasera
camTrasera = new Camara();
camTrasera.setResolucion(resolCamTras);
camTrasera.setNumCamaras(numCamTras);
camTrasera.setEstabilidador(estabilTras);
}
//Constructor que no recibe valores.
public Movil() {
so = new SistemaOperativo();
camDelantera = new Camara();
camTrasera = new Camara();
}
public SistemaOperativo getSo() {
return so;
}
public void setSo(SistemaOperativo so) {
this.so = so;
}
public Camara getCamDelantera() {
return camDelantera;
}
public void setCamDelantera(Camara camDelantera) {
this.camDelantera = camDelantera;
}
public Camara getCamTrasera() {
return camTrasera;
}
public void setCamTrasera(Camara camTrasera) {
this.camTrasera = camTrasera;
}
}
Hay que tener en cuenta que estos getters/setters trabajan también con objetos. Es decir, si quiero obtener la versión de sistema operativo de un móvil, tendré que pedirle al móvili que me retorne su so, y a este so pedirle que me retorne su versión.
Por ejemplo, si ejecutamos este programa de prueba:
public class Prueba {
public static void main(String[] args) {
Movil miMovil = new Movil("Android", 13, 600, 3, true, 400, 2, false);
System.out.println("Tipo de SO: " + miMovil.getSo().getTipo());
System.out.println("Versión: " + miMovil.getSo().getVersion());
}
}
En pantalla obtendremos los datos que hemos buscado:
Tipo de SO: Android
Versión: 13
Y bueno, creo que con esto queda explicado.
Si tuvieras más dudas, solo tienes que preguntar.
Un saludo.