Acessando um objeto de outra classe

4 respostas
K

Boa tarde, estou tentando fazer um projeto Java com três classes
Pessoa
Veículo
Principal

Criei um objeto Pessoa na classe Veiculo, mas na classe main não consigo alterá-lo, crie os gets e sets direitinho, mas não estou conseguindo acessá-lo, alguém poderia me ajudar?
Quero acessar o objeto pessoa, e alterálo, como tambem alterar o objeto veiculo e depois imprimir os dois…

//Classe Pessoa

package br.com.classes; 
public class Pessoa { 

private String cpf; 
private String nome; 
private String sobrenome; 
private int idade; 

public String getCpf() { 
return cpf; 
}

public void setCpf(String cpf) { 
this.cpf = cpf; 
}

public String getNome() { 
return nome; 
}

public void setNome(String nome) { 
this.nome = nome; 
}

public String getSobrenome() { 
return sobrenome; 
}

public void setSobrenome(String sobrenome) { 
this.sobrenome = sobrenome; 
}

public int getIdade() { 
return idade; 
}

public void setIdade(int idade) { 
this.idade = idade; 
}


 
 
//Classe Veiculo

package br.com.classes; 
public class Veiculo { 

private String placa; 
private String marca; 
private String modelo; 
private int ano; 

Pessoa pessoa = new Pessoa(); 

public String getPlaca() { 
return placa; 
}

public void setPlaca(String placa) { 
this.placa = placa; 
}

public String getMarca() { 
return marca; 
}

public void setMarca(String marca) { 
this.marca = marca; 
}

public String getModelo() { 
return modelo; 
}

public void setModelo(String modelo) { 
this.modelo = modelo; 
}

public int getAno() { 
return ano; 
}

public void setAno(int ano) { 
this.ano = ano; 
}

public Pessoa getPessoa() { 
return pessoa; 
}

public void setPessoa(Pessoa pessoa) { 
this.pessoa = pessoa; 
}

}
 
 
//Classe Principal
 
package br.com.classes; 

import javax.swing.JOptionPane; 

public class Principal { 

public static void main(String[] args) { 

Pessoa pessoa = null; 
Veiculo veiculo = null; 

veiculo.getPessoa().setNome(JOptionPane.showInputDialog("Digite o nome do cliente: ")); 
veiculo.getPessoa().setSobrenome(JOptionPane.showInputDialog("Digite o Sobrenome do cliente: ")); 
veiculo.getPessoa().setCpf(JOptionPane.showInputDialog("Digite o CPF do cliente")); 
veiculo.getPessoa().setIdade(Integer.parseInt(JOptionPane.showInputDialog("Digite a idade do cliente"))); 

veiculo.setMarca(JOptionPane.showInputDialog("Digite a marca do veículo: ")); 
veiculo.setModelo(JOptionPane.showInputDialog("Digite o modelo do veículo: ")); 
veiculo.setPlaca(JOptionPane.showInputDialog("Digite a placa do veículo")); 
veiculo.setAno(Integer.parseInt(JOptionPane.showInputDialog("Digite o ano do veículo"))); 

imprimir(veiculo);
}
public static void imprimir(Veiculo veiculo){ 

JOptionPane.showConfirmDialog(null, "Nome: " + pessoa.getNome() + pessoa.getSobrenome() + "\nCPF: " + pessoa.getCpf() + "\nIdade: " + pessoa.getIdade() + "\n\n\nVeículo: " + veiculo.getMarca() + veiculo.getModelo() + "\nPlaca: " + veiculo.getPlaca() + "\nAno: " + veiculo.getAno()); 
}

}

Espero que tenham entendido, não está compilando

4 Respostas

jzaires

Olá Kleidson!

Primeiramente, você deve instanciar um “Veiculo”, para assim você possa trabalhar com a referência deste objeto que está na memória.
Perceba que ele está null.

Segundo, como o pessoa é um atributo de “Veiculo”, chame os valores dentro do método imprimir assim:

JOptionPane.showConfirmDialog(null, "Nome: " + veiculo.pessoa.getNome() + veiculo.pessoa.getSobrenome()
                + "\nCPF: " + veiculo.pessoa.getCpf()
                + "\nIdade: " + veiculo.pessoa.getIdade()
                + "\n\n\nVeículo: " + veiculo.getMarca() + veiculo.getModelo()
                + "\nPlaca: " + veiculo.getPlaca() + "\nAno: " + veiculo.getAno());

Abraço

K

jzaires, muito obrigado consegui, instanciei um objeto veiculo na principal, e chamei do jeito que vc falou…

Abraço

A

1° passo - Use identação;
2° passo - Atributo dentro de método fico acessível apenas dentro deste escopo (dentro do próprio método);
3º passo - Objeto objeto = null; se chamá-lo irá dar NullPointerException, é preciso criar uma instância do mesmo;

Alguns ajustes:

package agencia_de_veiculo;

import javax.swing.JOptionPane;

public class Principal {

	private static Pessoa pessoa = new Pessoa();
	
	public static void main(String[] args) {
		
		Veiculo veiculo = new Veiculo();
		  
		veiculo.getPessoa().setNome(JOptionPane.showInputDialog("Digite o nome do cliente: "));   
		veiculo.getPessoa().setSobrenome(JOptionPane.showInputDialog("Digite o Sobrenome do cliente: "));   
		veiculo.getPessoa().setCpf(JOptionPane.showInputDialog("Digite o CPF do cliente"));   
		veiculo.getPessoa().setIdade(Integer.parseInt(JOptionPane.showInputDialog("Digite a idade do cliente")));   
		
		veiculo.setMarca(JOptionPane.showInputDialog("Digite a marca do veículo: "));   
		veiculo.setModelo(JOptionPane.showInputDialog("Digite o modelo do veículo: "));   
		veiculo.setPlaca(JOptionPane.showInputDialog("Digite a placa do veículo"));   
		veiculo.setAno(Integer.parseInt(JOptionPane.showInputDialog("Digite o ano do veículo")));
		
		imprimir(veiculo);
	}

	private static void imprimir(Veiculo veiculo) {
		JOptionPane.showConfirmDialog(
				null,
				"Nome: " + pessoa.getNome() + pessoa.getSobrenome() + "\nCPF: "
						 + pessoa.getCpf() + "\nIdade: " + pessoa.getIdade()
						 + "\n\n\nVeículo: " + veiculo.getMarca()
						 + veiculo.getModelo() + "\nPlaca: "
						 + veiculo.getPlaca() + "\nAno: " + veiculo.getAno());
	}
}
jzaires

Olá novamente Kleidson!

Apenas para melhorar o seu código:
Altere a acessibilidade do seu atributo pessoa para private;

private Pessoa pessoa;

Se você já possui métodos get/set para manipular tal atributo não há a necessidade de deixá-lo acessível diretamente pela
referência de veiculo, isso é até recomendado, por isso “não deixe os seus atributos expostos, e sim forneça uma interface
de uso para manipulá-los(simplificando, um método)”, encapsulando esse atributo na classe.
Exceto em algum caso específico.

No construtor de veículo instancie a pessoa:

public Veiculo() {  
        pessoa = new Pessoa();
}

Assim, ao invés de chamar os atributos de pessoa desta forma:

veiculo.pessoa.get....

Irá acessá-los de uma forma mais elegante e correta, perceba que você continuará manipulando os dados de “pessoa” normalmente:

public static void imprimir(Veiculo veiculo) {

        JOptionPane.showConfirmDialog(null, "Nome: " + veiculo.getPessoa().getNome() + veiculo.getPessoa().getSobrenome()
                + "\nCPF: " + veiculo.getPessoa().getCpf()
                + "\nIdade: " + veiculo.getPessoa().getIdade()
                + "\n\n\nVeículo: " + veiculo.getMarca() + veiculo.getModelo()
                + "\nPlaca: " + veiculo.getPlaca() + "\nAno: " + veiculo.getAno());
    }

Abraço

Criado 13 de março de 2011
Ultima resposta 13 de mar. de 2011
Respostas 4
Participantes 3