Como referenciar um objeto de uma classe no contrutor de outra?

No caso tenho duas classes Pessoa e Veiculo, na classe Pessoa temos.

public class Pessoa {

private final String nome;
private final String CPF;
 
public Pessoa ( String n, String c){
  nome = n;
  CPF = c ;

E na classe Veiculo existe os atributos ano, placa, modelo, porem tenho de fazer uma referencia ao objeto da classe Pessoa no construtor de Veiculo.

public class Veiculo 
{
    private final String  marca ;
    private final String  modelo;
    private final String  ano;
    private final String  placa;
    
   public Veiculo(String mar,String mod, String a, String pla,String n)**<- Como é feita a referências aqui.** 

   {
        marca = mar;
        modelo = mod;
        ano = a;
        placa = pla;

Pois já tentei com get, com this, mas não encontra a outra classe.

public Veiculo(String mar,String mod, String a, String pla,String n, Pessoa p){

Mas no momento em que é declarado as atribuições a baixo do construtor vai ficar
marca = mar;
modelo = mod;
ano = a;
placa = pla;
p = Pessoa; <— Porque esta ocorrendo erro, (Dando opção de importar da classe Pessoa, mas esta tudo no mesmo pacote, não teria o por que fazer isso, e também não surte efeito.
E na hora de declarar esse (p = Pessoa) ele vai trazer todos os dados ou tenho de fazer algum apontamento, como nome e CPF?

Qual e’ o erro ?

A mensagem informada é
(Ilegal start of expression) public Veiculo(String mar,String mod, String an, String plc, Pessoa p ){
marca = mar ;
modelo = mod;
ano = an;
placa = plc;
(cannot find symbol p = Pessoa
symbol: variable Pessoa
location: calss Veiculo)

Acho que você está se confundindo com a sintaxe.
Vou renomear seus parâmetros e atributos pra ver se fica mais claro.
Qualquer dúvida, só falar.

public Veiculo(String parametro_marca,
               String parametro_modelo,
               String parametro_ano,
               String parametro_placa,
               Pessoa parametro_pessoa ){
    // os objetos que você recebeu por parametro,
    // você atribui aos atributos da sua instancia
    this.atributo_marca  = parametro_marca;
    this.atributo_modelo = parametro_modelo;
    this.atributo_ano    = parametro_ano;
    this.atributo_placa  = parametro_placa;
    this.atributo_pessoa = parametro_pessoa;
}

A mensagem informada é
(Ilegal start of expression) public Veiculo(String mar,String mod, String an, String plc, Pessoa p ){
marca = mar ;
modelo = mod;
ano = an;
placa = plc;
(cannot find symbol p = Pessoa
symbol: variable Pessoa
location: calss Veiculo)

public class Pessoa {

private final String nome;
private final String CPF;

public Pessoa ( String n, String c){
nome = n;
CPF = c ;

Na Class Pessoa , private final, não pode ser modificado “nome” e ele deve estar instanciado, no seu caso retira o final para poder fazer uma atribuição a nome atraves do construtor Pessoa.

public class Veiculo {
private String marca ;
private String modelo;
private String ano;
private String placa;

public Veiculo(String marca,String modelo, String ano, String placa, Pessoa pessoa) {
    this.marca = marca;
    this.modelo = modelo;
    this.ano = ano;
    this.placa = placa;
}    

}


public class Pessoa {

private String nome=null;
private String cpf=null;
public Pessoa(String n, String ncpf) {
  nome = n;
  cpf  = ncpf;
}

// ou se preferir usa this
/*public Pessoa(String nome, String cpf) {
  this.nome = nome;
  this.cpf  = cpf;
}*/

public static void main(String[] args) {
    Pessoa jorge = new Pessoa("Jorge","123.122.898-98");
    Veiculo cruze  = new Veiculo("Cruze", "LTZ", "2017","JLM 0505", jorge);
}

}

Muito obrigado, sabia que não era nada muito dificil, o problema é quando estamos tanto tempo olhando para algo que não se enxerga mais nada. quanto ao atributos Final tem de esta la, é um requisito do sistema, que não podem ser modificados após instanciado.

não seria Pessoa que tem o veículo então ficaria assim:

public class Pessoa {

    private String nome;
    private String cpf;
    private Veiculo veiculo;

    public Pessoa(String n, String ncpf, Veiculo v) {
       this.nome = n;
       this.cpf  = ncpf;
      this.veiculo = v;
    }

getter e setter....
}

Dessa forma você fazendo uma composição de pessoa com veículo, ou seja, uma pessoa, para existir, precisa ter um veículo.

Poderias ter um atributo List<Veículo> correspondente aos veículos da pessoa e fornecer métodos para adicionar veículos à Pessoa

Já o Veículo ter um atributo Pessoa está certo, não pode haver um Veículo circulando ser ter um proprietário, e um veículo não pode ter mais de um proprietário, mas uma pessoa pode ter vários veículos

1 curtida

Outra questão que surgiu nesse projeto é o seguinte, agora a referencia está ok, mas quando mando imprimir o objeto veiculo já instanciado assim como um objeto de pessoa,

Pessoa p2 = new Pessoa (“DArtagnan”,“11111111111”);
cruze = new Veiculo(“Cruze”, “LTZ”, “2017”,“JLM 0505”, p2 );

E quando dou um
System.out.println(cruze);;

Utilizando o método toString, para imprimir as informações de um objeto e não sua referencia na memoria, o mesmo retorna
|Cruze,LTZ,2017,JLM 0505,null| (Null para a referencia realizada a pessoa.

Alguém sabe me dizer o por que ? e como posso resolver isso.

O toString() não imprime referência de memória, o número que vem depois do @ é o identity hashcode do objeto e ele pode mudar a medida que a JVM faz desfragmentação. :wink:

No construtor do Veiculo, você esqueceu de atribuir o parâmetro Pessoa ao atributo Pessoa.

Mas foi colocado no construtor (Pessoa p), tando que no main ele compreende isso e não aponta nenhum erro, só não retorna valor.

Sim, sabemos disso, mas você não faz nada com a Pessoa passada por parâmetro para o Veiculo, deveria atribuir ela para o atributo pessoa da classe Veiculo.

Como você implementou o método toString() na classe Veiculo?
Aquele null não veio do nada… :wink:

public Veiculo(String marca,String modelo, String ano, String placa, Pessoa pessoa) {
        this.marca = marca;
        this.modelo = modelo;
        this.ano = ano;
        this.placa = placa;
        // e o parâmetro pessoa serve pra que?
        // não vai fazer nada com ele?
        // se não vai utilizar, então não precisa dele
    }
}

Esse parâmetro vai servir para imprimir a pessoa associada ao veiculo. São as regras impostas no trabalho.
na classe veiculo, devo proceder como?
O construtor de Pessoa ela recebe o parâmetro (String, String), em veiculo devo fazer
this.pessoa = String n, String c;

no método toString eu informei para ele fique assim
public String toString (){
return “|” + marca + “,” + modelo + “,” + ano + “,” + placa + “,”+ p + “|”;
}

public Veiculo(String marca,String modelo, String ano, String placa, Pessoa pessoa) {
this.marca = marca;
this.modelo = modelo;
this.ano = ano;
this.placa = placa;
// e o parâmetro pessoa serve pra que?
// não vai fazer nada com ele?
// se não vai utilizar, então não precisa dele
}
}

Exato, para não ser null, você precisa fazer a atribuição dele

this.pessoa = pessoa;

Você vai observar que no seu metodo

public String toString() {
return “|” + marca + “,” + modelo + “,” + ano + “,” + placa + “,”+ pessoa + “|”;
}

ele retornara com a referencia de “pessoa”

|Cruze,LTZ,2017,JLM 0505,com.datagenia.repository.Pessoa@70dea4e|

então para trazer os dados apropriados, usa pessoa.nome , mas ao inves de :

private String nome;
public String nome; // pode ser protected tambem

return “|” + marca + “,” + modelo + “,” + ano + “,” + placa + “,”+ pessoa.nome + “|”;

Caso não queira mudar de private para public ou protected, cria um metodo tipo

public String getNome() {
return nome; //
}

então no metodo toString()

return “|” + marca + “,” + modelo + “,” + ano + “,” + placa + “,”+ pessoa.getNome() + “|”;

por fim, na classe Pessoa voce pode tambem fazer o metodo toString();

public String toString() {
return “|” + nome + “,” + cpf;
}

Então voltamos ao ponto inicial

return “|” + marca + “,” + modelo + “,” + ano + “,” + placa + “,”+ pessoa + “|”;

Bons codigos !

Pessoal só tenho a agradecer a ajuda de todos.
Mas aproveitando a sabedoria de todos vou pedir mais uma dica.
Em uma nova classe Frota, necessito adiciaonar um veiculo, mas antes tenho de verificar se o mesmo já esta na lista. Sendo que deve ser implementado dentro de um método,

public String Incluir (Veiculo novoveiculo){
List frota = new ArrayList();
frota.add(1,new Veiculo (“Rural”, “F75”, “1974”,“RUR 3535”, p ));

// Verificar se já existe na lista utilizando a placa como paramentro, e retornar caso exista, exibir uma mensagem de erro
de “veículo já existente na frota”.

Se você sobrescrever os métodos hashCode e equals da classe Veiculo, é só fazer assim:

private final List<Veiculo> frota = new ArrayList();

// usa sempre nome de método comecando com letra minúscula
public String incluir (Veiculo novoVeiculo) {
    if ( frota.contains(novoVeiculo) ) {
        return nao_sei_qual_String_tem_que_retornar_quando_ja_tem_veiculo_na_frota;
    }
    frota.add( novoVeiculo );   
    return nao_sei_qual_String_tem_que_retornar_quando_adicionou_veiculo;
}

Senão, terá de fazer assim

private final List<Veiculo> frota = new ArrayList();

// usa sempre nome de método comecando com letra minúscula
public String incluir (Veiculo novoVeiculo) {
    String placa = novoVeiculo.getPlaca();
    for ( Veiculo veiculo : frota ) {    
        if ( placa.equals( veiculo.getPlaca() ) ) {
            // veículo já existe na frota
            return nao_sei_qual_String_tem_que_retornar_quando_ja_tem_veiculo_na_frota;
        }
    }
    frota.add( novoVeiculo );   
    return nao_sei_qual_String_tem_que_retornar_quando_adicionou_veiculo;
}

Funcionou perfeitamente muito obrigado, agora tenho de excluir um objeto, usando a placa como parâmetro, estou fazer da seguinte maneira mas esta dando errado.

public String excluir(String placa );
Frota.remove(frota.getPlaca());
return “veículo inexistente”;

e exibir na saída caso não encontre nada “veículo inexistente”.