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

22 respostas Resolvido
B

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.

22 Respostas

B
public Veiculo(String mar,String mod, String a, String pla,String n, Pessoa p){
B
Mas no momento em que é declarado as atribuições a baixo do construtor vai ficar

marca = mar;

modelo = mod;

ano = a;

placa = pla;

<strong>p = Pessoa;</strong> <strong><</strong> 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?
j-menezes

Qual e’ o erro ?

B
A mensagem informada é

<strong>(Ilegal start of expression)</strong> <em>public Veiculo(String mar,String mod, String an, String plc, Pessoa p ){</em>

marca = mar ;

modelo = mod;

ano = an;

placa = plc;

<strong>(cannot find symbol</strong>         p = <em>Pessoa</em>

<strong>symbol: variable Pessoa</strong>

<strong>location: calss Veiculo)</strong>
staroski

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;
}
j-menezes
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.

j-menezes
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","[CPF removido]");
    Veiculo cruze  = new Veiculo("Cruze", "LTZ", "2017","JLM 0505", jorge);
}

}

B

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.

B

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....
}
staroski

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

B

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”,“[telefone removido]”);
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.

staroski

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.

B

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.

staroski

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
    }
}
B

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 + |;

}
j-menezes
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 !

B

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”.

staroski

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;
}
B

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”.

staroski

O que é Frota e o que frota ?

Evita postar código incompleto, isso vira um “ping-pong” de mensagens desnecessárias…

B

Desculpe o inconveniente, Frota é a ultima classe do projeto a onde é gerado uma ArrayList dos veiculos e os manipulado. Com os métodos, de inserir um objeto na lista, remover, gerar um txt dos elementos com as informações (Placa Marca Modelo CPFdoProprietário.) e procurar um carro pela placa informando se existe ou não na frota. No momento estou tentando gerar o método que remove um carro, usando a placa como parâmetro de busca

public class Frota {

public String excluir(String placa ){

frota.remove(Veiculo.getPlaca());   // <<<<<<<   Erro esta ocorrendo aqui 
   return "\n******** Veiculo Inexistente ********\n";
    
}

public void procurarPorPlaca (String placa){

Map<String,Veiculo> classe = new HashMap();
    
    classe.put(Veiculo.getPlaca(), Veiculo); 
       
    System.out.println(Veiculo);

}

}

staroski
Solucao aceita

Tá então o Frota com F maíúsculo é o nome da classe, e o frota com f minúsculo é o que? Uma lista?
Se for uma lista, é uma lista de que?
Onde ela está declarada?

É difícil ajudar quando sem ver o código todo, não posta somente o trecho de código que não compila, posta tudo

Criado 18 de novembro de 2016
Ultima resposta 26 de nov. de 2016
Respostas 22
Participantes 4