Para fazermos um relacionamento entre classes, vamos supor o Objeto lutador, com esses atributos e métodos e suas visibilidades:
Lutador |
---|
- nome - nacionalidade - idade - altura - peso - categoria - vitórias - derrotas - empates |
+ apresentar() + status() + ganharLuta() + perderLuta() + empatarLuta() |
Crie um novo projeto Java com classe principal, e nele crie uma classe com o nome Lutador, que terá esse código:
package ultracombatpoo;
public class Lutador {
private String nome;
private String nacionalidade;
private int idade;
private float altura;
private float peso;
private String categoria;
private int vitorias;
private int derrotas;
private int empates;
public void apresentar() {
System.out.println("-----------------------------");
System.out.print("CHEGOU A HORA! O lutador " + this.getNome());
System.out.print(" veio diretamente de " + this.getNacionalidade());
System.out.println(", tem " + this.getIdade() + " anos e pesa " + this.getPeso() + "kg.");
System.out.print("Ele tem " + this.getVitorias() + " vitórias, ");
System.out.println(this.getDerrotas() + " derrotas e " + this.getEmpates() + " empates.");
}
public void status() {
System.out.println("-----------------------------");
System.out.print(this.getNome() + " é um peso " + this.getCategoria());
System.out.print(" e já ganhou " + this.getVitorias() + " vezes, ");
System.out.print("perdeu " + this.getDerrotas() + " vezes e ");
System.out.println("empatou " + this.getEmpates() + " vezes.");
}
public void ganharLuta() {
this.setVitorias(this.getVitorias() + 1);
// this.vitorias = this.vitorias + 1;
}
public void perderLuta() {
this.setDerrotas(this.getDerrotas() + 1);
}
public void empatarLuta() {
this.setEmpates(this.getEmpates() + 1);
}
public Lutador(String no, String na, int id, float al, float pe, int vi, int de, int em) {
this.nome = no;
this.nacionalidade = na;
this.idade = id;
this.altura = al;
this.setPeso(pe);
this.vitorias = vi;
this.derrotas = de;
this.empates = em;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getNacionalidade() {
return nacionalidade;
}
public void setNacionalidade(String nacionalidade) {
this.nacionalidade = nacionalidade;
}
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
public float getAltura() {
return altura;
}
public void setAltura(float altura) {
this.altura = altura;
}
public float getPeso() {
return peso;
}
public void setPeso(float peso) {
this.peso = peso;
this.setCategoria();
}
public String getCategoria() {
return categoria;
}
private void setCategoria() { // Não terá parâmetros e será privado.
if(this.peso <= 52.2) {
this.categoria = "Inválido";
}
else if(this.peso > 52.2 && this.peso <= 70.3) {
this.categoria = "Leve";
}
else if(this.peso > 70.3 && this.peso <= 83.9) {
this.categoria = "Médio";
}
else if(this.peso > 83.9 && this.peso <= 120.2) {
this.categoria = "Pesado";
}
else {
this.categoria = "Inválido";
}
}
public int getVitorias() {
return vitorias;
}
public void setVitorias(int vitorias) {
this.vitorias = vitorias;
}
public int getDerrotas() {
return derrotas;
}
public void setDerrotas(int derrotas) {
this.derrotas = derrotas;
}
public int getEmpates() {
return empates;
}
public void setEmpates(int empates) {
this.empates = empates;
}
}
Lembrando que no método construtor, não terá o atributo "categoria", pois ela será calculada automaticamente pelo nosso programa.
E na classe principal, coloque isso:
package ultracombatpoo;
public class UltraCombatPoo {
public static void main(String[] args) {
Lutador l[] = new Lutador[6]; // Uso de Array em Java.
l[0] = new Lutador("Pretty Boy", "França", 30, 1.75f, 68.9f, 11, 2, 1); // Precisa passar os parâmetros referentes.
l[1] = new Lutador("Putscript", "Brasil", 29, 1.68f, 57.8f, 14, 2, 3);
l[2] = new Lutador("SnapShadow", "EUA", 35, 1.65f, 80.9f, 12, 2, 1);
l[3] = new Lutador("Dead Code", "Austrália", 28, 1.93f, 81.6f, 13, 0, 2);
l[4] = new Lutador("UFOCobol", "Brasil", 37, 1.70f, 119.3f, 5, 4, 3);
l[5] = new Lutador("Nerdaart", "EUA", 30, 1.81f, 105.7f, 12, 2, 4);
l[0].perderLuta();
l[0].apresentar();
l[0].status();
}
}
Nesse caso, um evento dispara outro evento e o segundo automaticamente configura um atributo. As variáveis foram colocadas em um array (que começa sempre com 0). A setCategoria() não pode ser chamada por ser privada.
Teste outros "lutadores", e os outros métodos.
Continuando a aula anterior, com os lutadores, usaremos a agregação entre as classes, que é a relação entre uma classe e outra. Veja o diagrama da classe Luta:
Luta |
---|
- desafiado - desafiante - rounds - aprovada |
+ marcarLuta(l1, l2) + lutar() |
No caso, a classe Luta terá atributos e funções que farão a disputas entre eles.
A classe Lutador não será alterada, e na classe principal só deixe a criação dos objetos (lutadores), sem as invocações das funções.
PS: No Java, sempre devemos usar classes em arquivos separados pra facilitar o reuso.
Esse é o código da classe Luta, que deverá ser criada:
package ultracombatpoo;
import java.util.Random;
public class Luta {
private Lutador desafiado; // No lugar do tipo, usamos a classe criada.
private Lutador desafiante; // Mesmo caso acima.
private int rounds;
private boolean aprovada;
public void marcarLuta(Lutador l1, Lutador l2) {
if(l1.getCategoria().equals(l2.getCategoria()) && !l1.equals(l2)) { // Comparação tipo !=, mas com classes é recomendado usar equals.
this.aprovada = true;
this.desafiado = l1;
this.desafiante = l2;
}
else {
this.aprovada = false;
this.desafiado = null;
this.desafiante = null;
}
}
public void lutar() {
if(this.aprovada) {
System.out.println("### DESAFIADO ###");
this.desafiado.apresentar();
System.out.println("### DESAFIANTE ###");
this.desafiante.apresentar();
Random aleatorio = new Random(); // Não esqueça da importação.
int vencedor = aleatorio.nextInt(3); // Gerará números de 0 a 2.
switch(vencedor) {
case 0:
// Empate
System.out.println("Empate!");
this.desafiado.empatarLuta();
this.desafiante.empatarLuta();
break;
case 1:
// Desafiado Vence
System.out.println(this.desafiado.getNome() + " vence!");
this.desafiado.ganharLuta();
this.desafiante.perderLuta();
break;
case 2:
// Desafiante Vence
System.out.println(this.desafiante.getNome() + " vence!");
this.desafiado.perderLuta();
this.desafiante.ganharLuta();
break;
}
}
else {
System.out.println("Luta não pode acontecer!");
}
}
public Lutador getDesafiado() {
return desafiado;
}
public void setDesafiado(Lutador desafiado) {
this.desafiado = desafiado;
}
public Lutador getDesafiante() {
return desafiante;
}
public void setDesafiante(Lutador desafiante) {
this.desafiante = desafiante;
}
public int getRounds() {
return rounds;
}
public void setRounds(int rounds) {
this.rounds = rounds;
}
public boolean getAprovada() {
return aprovada;
}
public void setAprovada(boolean aprovada) {
this.aprovada = aprovada;
}
}
E na classe principal, basta colocar isso:
package ultracombatpoo;
public class UltraCombatPoo {
public static void main(String[] args) {
Lutador l[] = new Lutador[6];
l[0] = new Lutador("Pretty Boy", "França", 30, 1.75f, 68.9f, 11, 2, 1); // Precisa passar os parâmetros referentes
l[1] = new Lutador("Putscript", "Brasil", 29, 1.68f, 57.8f, 14, 2, 3);
l[2] = new Lutador("SnapShadow", "EUA", 35, 1.65f, 80.9f, 12, 2, 1);
l[3] = new Lutador("Dead Code", "Austrália", 28, 1.93f, 81.6f, 13, 0, 2);
l[4] = new Lutador("UFOCobol", "Brasil", 37, 1.70f, 119.3f, 5, 4, 3);
l[5] = new Lutador("Nerdaart", "EUA", 30, 1.81f, 105.7f, 12, 2, 4);
Luta uec01 = new Luta();
uec01.marcarLuta(l[0], l[1]);
uec01.lutar();
uec01.getDesafiado().status();
uec01.getDesafiante().status();
}
}
Agora teste, mudando os números dos arrays para mudar as lutas, pra ver se podem ou não acontecer e etc.