Mostrar o conteúdo de uma classe em outra classe

Olá Devs, estou com uma dúvida que não achei em nenhum lugar!
Eu tenho a classe principal, a classe Venda e a Classe Cliente. Os métodos de cada classe não pode mudar. Por exemplo: O método cadastrar( ) da classe Cliente não pode ir para dentro da classe Venda senão resolve o meu problema. Esse método cadastrar( ) precisa ficar dentro da classe Cliente.

Dentro da classe Venda eu tenho um método para finalizar a compra.
O problema está ai: eu preciso mostrar o nome do cliente.

Eu chamo o método cadastrar atraves do objeto, ele cadastra direitinho. (nome e endereço).
O que eu fiz:
Na classe Vendas, criei um atributo nomeCliente do tipo Cliente.
E dentro do método finalizar( ), eu pedi para mostrar nomeCliente.nome. Não deu erro mas quando eu executo dá erro. Segue imagens para melhor entendimento.

Classe Principal

tela01

Esse método cadastrar ( ) não pode ir para a classe Venda (sei q isso solucionaria meu problema, porém não posso tirar ela daí)

tela02

Ai que está o problema. Não está mostrando o System.out.println(nomeCliente.nome);

tela03

tela do erro

Você criou uma variável do tipo Cliente, mas não instanciou o Objeto. Sua variável nomeCliente está vazia, portanto, não possui a propriedade nome. Isso dispara um NullPointerException. Só fazer isso:
public Cliente nomeCliente = new Cliente();//inclusive, nomeCliente é um nome que não faz muito sentido nessa variável

Assim o erro é resolvido, mas acho que você não vai chegar ao resultado que deseja usando essa implementação
.

Oi Zeca_Peteca!!
Cara, valeu. Fiz as alterações que vc recomendou. O Erro parou , mas está mostrando null. Segue o o print da chamada e o print da Classe.

tela05

era para mostrar José

tela06

Esse objeto nomeCliente da classe Venda é diferente do objeto cliente1 que você instanciou na main().
Da pra fazer o que você está tentando fazer desse jeito:

public Cliente nomeCliente = new Cliente();//tira essa linha

public void finalizar(Cliente cliente){
    Scanner leia = new Scanner(System.in);
    int opc;
    System.out.println("Deseja realmente finalizar a compra?");
    System.out.println("1 - SIM");
    System.out.println("2 - NAO");
    opc = leia.nextInt();
    if (opc == 1){
        System.out.println("Cliente: " + cliente.nome);
    }
}

Perceba que o método finalizar() recebe um objeto Cliente como parâmetro, então na main() passamos como parâmetro o nosso objeto Cliente:

public static void main(String args[]){
    Cliente cliente1 = new Cliente();
     Venda venda1 = new Venda();
     cliente1.nome = "José";
     venda1.finalizar(cliente1);
}

O output deve ser: Cliente: José agora.

1 curtida

@danilomatta Faça como o @Zeca_Peteca passou que vai resolver seu problema.

Apenas para complementar, pense assim:

Geralmente, uma venda é vinculada à um cliente. Com isso, ao finalizar uma venda, normalmente, o cliente já é para ser conhecido pela venda.

Pensando assim, vc pode determinar que toda venda que for criada, precisa ter o cliente informado. E isso pode ser feito assim no código:

Classe Venda

public class Venda {
    private final Cliente cliente;

    public Venda(Cliente cliente) {
        this.cliente = cliente;
    }
}

E para criar a venda:

public class ProjetoVendas {
    public static void main(String args[]) {
        Cliente cliente1 = new Cliente();
        cliente1.nome = "José";

        Venda venda1 = new Venda(cliente1);
        venda1.finalizar();
    }
}

Dessa forma, ao finalizar a venda, o cliente já vai está preenchido.

Isso é apenas uma forma de pensar. Da forma como exemplifiquei e como o @Zeca_Peteca postou, dá o mesmo resultado. O que muda é a questão da modelagem das classes e pode fazer diferença na medida que o sistema for evoluindo.

Obs.: Evite ao máximo postar imagens do código. Isso não ajuda em nada. É melhor vc copiar e colar o código aqui formatando usando o botão </> do editor do GUJ. Flws!

1 curtida

Funfol direitinho cara!! Brigadão mesmo de verdade!!:clap::clap::+1::+1:

Vlw irmão! :grin::+1::clap:
funcionou das duas maneiras! Obrigadão mesmo