Como uso um método que chama objetos?

import java.util.*;

public class Loja {
Date data = new Date();
Produto[] produto;
Cliente cliente;

public static void main(String[] args) {
	int i;
	
	Caixa  caixa = new Caixa();
		
	caixa.addVendas(new Venda(new data,new cliente("Pedro","Rua"), new produto("feijão", 8.0)));
	caixa.printVenda();			

}
}

Não estou entendo o que fazer aqui…

Os métodos não chamam objetos, os objetos são criados, e os únicos métodos q são chamados no momento de sua criação são os construtores, que podem ser vazios ou inicializados com seus parâmetros assim:
class Cliente
{
private String nome1,nome2;
public Cliente(String nome1,String nome2) //metodo construtor
{
this.nome1=nome1;
this.nome2=nome2;
}

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

}
Caixa caixa = new Caixa();
Date data = new Date();
Cliente cliente = new Cliente(“Pedro”,“Ana”);
Produto produto = new produto(“feijão”, 8.0);
caixa.setNome(“Isaura”);
output(caixa.getNome());

Espero ter ajudado!!

1 curtida

Boa noite Isaura!

Obrigado!
Vou tentar aqui…

Eu entendi mas como se aplica a meu caso?
Posso enviar meu código?

Estou chamando usando um método como parâmetro é isso?

Deve, pois não temos como adivinhar o que você implementou. :wink:

Não esqueça de formatar o seu código com o botão '</>' do fórum.
forum

Isso já foi te pedido e você sempre posta sem formatar. :frowning:

identar texto pré-formatado por 4 espaços

public class Cliente {
private String nome;
private String endereco;

public Cliente(String nome, String endereco) {
	this.nome = nome;
	this.endereco = endereco;
}

public Cliente(String nome) {
	this.nome = nome;		
}

public Cliente() {
	
}

public String getNome() {
	
	return this.nome;
	
}

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

public String getEndereco() {
	
	return this.endereco;
	
}

public void setEndereco(String endereco) {
	
	this.endereco = endereco;
}

public String imprimeCliente() {		
	return "Cliente: " + this.nome + "\n Endereco: " + this.endereco;
}

}

public class Produto {

private String descricao;						       
private double preco;
private int total;

	
public Produto(String descricao, double preco) {		
	this.descricao = descricao;
	this.preco = preco;		
}



/**
 * @return the descricao
 */
public String getDescricao() {
	return descricao;
}



/**
 * @param descricao the descricao to set
 */
public void setDescricao(String descricao) {
	this.descricao = descricao;
}



/**
 * @return the preco
 */
public double getPreco() {
	return preco;
}



/**
 * @param preco the preco to set
 */
public void setPreco(double preco) {
	this.preco = preco;
}



/**
 * @param total the total to set
 */
public void setTotal(int total) {
	this.total = total;
}



public double getTotal() {		
	return total++;		
}

public String imprimeProduto(String descricao, double total) {
	return "Produto: "  + this.descricao + " Total:" + this.total;
}

}

import java.util.*;

public class Venda {
int i;
int numProdutos;
double total;
Date data;
private Cliente cliente;
private Produto [] produto;

public Venda() {

}
        
public Venda(Date data, Cliente cliente, Produto[] produto) {		
	this.data = data;
	this.cliente = cliente;
	this.produto = produto;		
}

/**
 * @return the data
 */
public Date getData() {
	return data;
}

/**
 * @param data the data to set
 */
public void setData(Date data) {
	this.data = data;
}

/**
 * @return the cliente
 */
public Cliente getCliente() {
	return cliente;
}

/**
 * @param cliente the cliente to set
 */
public void setCliente(Cliente cliente) {
	this.cliente = cliente;
}

/**
 * @return the produto
 */
public Produto[] getProduto() {
	return produto;
}

/**
 * @param produto the produto to set
 */
public void setProduto(Produto[] produto) {
	this.produto = produto;
}

public double getTotal() {		
	return this.total;	
}


public void adicioneProduto(Produto[] p) {
	produto = p;
	numProdutos++;
}

public Produto getProduto(int i) {
	return this.getProduto(i);
}

public int getNumProdutos() {
    return this.numProdutos;
}

public String imprimeVenda() {
	return data + " " + cliente + " " + produto; 
}		

}

public class Caixa {
private int quantVendas = 0;
Venda [] venda;

public Caixa(Venda[] venda) {	    
	this.venda = venda;
}

public Caixa() {
	
}


public int getQuantVendas() {
	return quantVendas;
}

public void setQuantVendas(int quantVendas) {
	this.quantVendas = quantVendas;
}

public Venda[] getVenda() {
	return venda;
}
	
public void setVenda(Venda[] venda) {
	this.venda = venda;
}

public void addVendas(Venda vendas) {
	venda[quantVendas] = vendas;
	quantVendas++;		
} 
	
void printVenda() {
	for (int i = 0; i < quantVendas; quantVendas++) {
		venda[i].imprimeVenda();			
	}
}

}

import java.util.*;

public class Loja {
Date data = new Date();

public static void main(String[] args) {
			
	Caixa  caixa = new Caixa();
	Cliente cliente = new Cliente();
	Scanner input = new Scanner(System.in);
	int atender = 0;
	
	System.out.println("Novo produto Sim (1) Não (0) ");
	atender = input.nextInt();
	
    while (atender == 1) {
    	
    	caixa.venda.adicioneProduto(new Venda(data,"arroz", 7.0)); // Quero usar essa função para ler os dados da compra que está sendo processada
    	System.out.println("Novo produto Sim (1) Não (0) ");
		atender = input.nextInt();
		caixa.printVenda();
		
    }

}
}

Eu preciso adicionar os produtos, nome de cliente, endereço, a data, o preço e o produto. E a medida que for adicionando os produtos o vetor vai aumentando de tamanho. Não devo usar o array lista, apenas as referência.

Esse é o enunciado do exercício, agradeço por suas sugestões!

a) Implemente as classes em Java e seus relacionamentos.
b) Implemente uma classe Loja que cria objetos do tipo Cliente, Produto e Venda e exibe na tela o cliente que está realizando uma compra, os produtos comprados e o valor total da venda.
c) Nomeie os relacionamentos entre as classes.
d) Adicione uma classe Caixa à sua modelagem de classes. Um caixa contém uma coleção de vendas. Apenas uma venda é a venda atualmente aberta no caixa. A classe Caixa deve possuir operações para incluir um novo produto na venda atualmente aberta.
e) Adicione um construtor sobrecarregado à classe Venda de modo que se possa criar uma venda passando-se para ela um arranjo de produtos ou a quantidade máxima de produtos da venda.

Seu enunciado parece incompleto pois ele não descreve os atributos das classes.
De qualquer forma, dê uma olhada nas classes abaixo, acredito que você vai conseguir se virar sozinho se compilar e executar elas. :slight_smile:

Classe Cliente:

public class Cliente {

    private String nome;
    private String endereco;

    public Cliente(String nome, String endereco) {
        this.nome = nome;
        this.endereco = endereco;
    }

    public String getEndereco() {
        return endereco;
    }

    public String getNome() {
        return nome;
    }
}

Classe Produto:

public class Produto {

    private String descricao;
    private double preco;

    public Produto(String descricao, double preco) {
        this.descricao = descricao;
        this.preco = preco;
    }

    public String getDescricao() {
        return descricao;
    }

    public double getPreco() {
        return preco;
    }
}

Classe Venda:

public class Venda {

    private Cliente cliente;
    private Produto[] produtos;
    private int quantidade;

    public Venda(int qtdMaxima) {
        this(new Produto[qtdMaxima]);
    }

    public Venda(Produto[] produtos) {
        this.produtos = produtos;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void incluir(Produto produto) {
        produtos[quantidade] = produto;
        quantidade++;

        if (quantidade == produtos.length) { // se o vetor tá cheio
            Produto[] vetorMaior = new Produto[2 * produtos.length]; // cria um novo vetor com o dobro do tamanho
            System.arraycopy(produtos, 0, vetorMaior, 0, produtos.length); // copia os elementos do vetor antigo pro novo
            produtos = vetorMaior;// atualiza a referência do vetor antigo para o novo
        }
    }

    public Produto produto(int posicao) {
        if (posicao < 0) {
            throw new IllegalArgumentException(posicao + " é uma posição inválida");
        }
        if (posicao >= quantidade) {
            throw new IllegalArgumentException(posicao + " é uma posição inválida pois só há " + quantidade + " elementos no vetor");
        }
        return produtos[posicao];
    }

    public int quantidade() {
        return quantidade;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public double total() {
        double total = 0;
        for (int i = 0; i < quantidade; i++) {
            total += produtos[i].getPreco();
        }
        return total;
    }
}

Classe Caixa:

public class Caixa {

    private int vendaAberta = -1;

    private Venda[] vendas;
    private int quantidade;

    public Caixa() {
        vendas = new Venda[10];
    }

    public void incluir(Produto produto) {
        vendas[vendaAberta].incluir(produto);
    }

    public Venda novaVenda() {
        vendaAberta++;
        vendas[vendaAberta] = new Venda(10);
        quantidade++;

        if (quantidade == vendas.length) { // se o vetor tá cheio
            Venda[] vetorMaior = new Venda[2 * vendas.length]; // cria um novo vetor com o dobro do tamanho
            System.arraycopy(vendas, 0, vetorMaior, 0, vendas.length); // copia os elementos do vetor antigo pro novo
            vendas = vetorMaior;// atualiza a referência do vetor antigo para o novo
        }
        return vendas[vendaAberta];
    }
}

E finalmente a classe executável Loja:

import java.io.PrintStream;
import java.util.Scanner;

public class Loja {

    public static void main(String[] args) {
        Loja programa = new Loja();
        programa.executar();
    }

    private final Scanner entrada = new Scanner(System.in);
    private final PrintStream saida = System.out;
    private Produto[] produtos;

    public Loja() {
        produtos = new Produto[] { // criar um array com os produtos disponíveis
                new Produto("Arroz 5Kg", 24.99),         // posição 0
                new Produto("Feijão 1Kg", 6.49),         // posição 1
                new Produto("Trigo 1Kg", 3.99),          // posição 2
                new Produto("Açucar 5Kg", 11.99),        // posição 3
                new Produto("Sal 1Kg", 2.99),            // posição 4
                new Produto("Batata 1Kg", 3.50),         // posição 5
                new Produto("Cebola 1Kg", 3.00),         // posição 6
                new Produto("Cenoura 1Kg", 3.00),        // posição 7
                new Produto("Alface Unidade", 2.00),     // posição 8
                new Produto("Repolho Unidade", 2.00),    // posição 9
                new Produto("Água sem gás 500ml", 3.50), // posição 10
                new Produto("Água com gás 500ml", 4.00)  // posição 11
        };
    }

    public void executar() {
        Caixa caixa = new Caixa();
        do {
            Venda venda = caixa.novaVenda();
            Cliente cliente = informarCliente();
            venda.setCliente(cliente);
            informarProdutos(venda);
        } while (continuarVendendo());
    }

    private boolean continuarComprando() {
        saida.print("Deseja adicionar outro produto? [S/N]:  ");
        String resposta = entrada.nextLine();
        return "S".equalsIgnoreCase(resposta);
    }

    private boolean continuarVendendo() {
        saida.print("Deseja efetuar uma nova venda? [S/N]:  ");
        String resposta = entrada.nextLine();
        return "S".equalsIgnoreCase(resposta);
    }

    private Cliente informarCliente() {
        saida.print("Nome do cliente:  ");
        String nome = entrada.nextLine();
        saida.print("        endereço: ");
        String endereco = entrada.nextLine();
        return new Cliente(nome, endereco);
    }

    private void informarProdutos(Venda venda) {
        do {
            saida.println();
            saida.println("Produtos disponíveis:");
            for (int i = 0; i < produtos.length; i++) {
                Produto produto = produtos[i];
                saida.println("  [ " + i + " ]    " + produto.getDescricao() + "    Preço: " + produto.getPreco());
            }
            
            saida.println();
            saida.print("Informe o produto desejado: ");
            int posicao = Integer.parseInt(entrada.nextLine());
            Produto produto = produtos[posicao];
            venda.incluir(produto);
            
            saida.println();
            saida.println(produto.getDescricao() + " adicionado ao carrinho");
            
            saida.println();
            saida.println("Conteúdo do carrinho:");
            for (int i = 0; i < venda.quantidade(); i++) {
                produto = venda.produto(i);
                saida.println("  " + produto.getDescricao() + "    Preço: " + produto.getPreco());
            }
            saida.println("Total:  " + venda.total());
        } while (continuarComprando());
    }
}

Olá Ricardo!

Boa tarde!
Gratidão pela paciência e pronto atendimento!!!
Estou aprendendo muito…

1 curtida

Seu professor te proibiu de utilizar LinkedList ou ArrayList, certo?

Mas você poderia criar o seu próprio VetorDinamico, conforme abaixo:

@SuppressWarnings("unchecked")
public class VetorDinamico<T> {

    private int quantidade;
    private Object[] vetor;

    public VetorDinamico() {
        vetor = new Object[10]; // inicialmente o vetor comporta 10 elementos
    }

    /**
     * Adiciona um elemento ao final deste vetor dinâmico.
     * 
     * @param elemento O elemento a ser adicionado.
     */
    public void adicionar(T elemento) {
        vetor[quantidade] = elemento;
        quantidade++;

        if (quantidade == vetor.length) { // se o vetor tá cheio
            Object[] vetorMaior = new Object[vetor.length * 2]; // cria um novo vetor com o dobro do tamanho
            System.arraycopy(vetor, 0, vetorMaior, 0, vetor.length); // copia os elementos do vetor antigo pro novo
            vetor = vetorMaior;// atualiza a referência do vetor antigo para o novo
        }
    }

    /**
     * Retorna uma referência ao elemento da posição informada.
     * 
     * @param posicao A posição desejada.
     * 
     * @return Uma referência ao elemento da posição informada.
     */
    public T elemento(int posicao) {
        if (posicao < 0) {
            throw new IllegalArgumentException(posicao + " é uma posição inválida");
        }
        if (posicao >= quantidade) {
            throw new IllegalArgumentException(posicao + " é uma posição inválida pois só há " + quantidade + " elementos no vetor");
        }
        return (T) vetor[posicao];
    }

    /**
     * Obtém a quantidade de elementos contidos neste vetor dinâmico.
     * 
     * @return O tamanho deste vetor dinâmico.
     */
    public int quantidade() {
        return quantidade;
    }

    /**
     * Obtém a representação textual deste vetor dinâmico.
     */
    @Override
    public String toString() {
        StringBuilder texto = new StringBuilder(getClass().getSimpleName());
        texto.append("[");
        for (int i = 0; i < quantidade; i++) {
            if (i > 0) {
                texto.append(", ");
            }
            texto.append(vetor[i]);
        }
        texto.append("]");
        return texto.toString();
    }
}

Aí ao invés de utilizar arrays nas suas implementações, você pode utilizar objetos da classe VetorDinamico.

Veja como ficaria a classe Caixa utilizando um VetorDinamico ao invés de array:

public class Caixa {

    private int vendaAberta = -1;

    private VetorDinamico<Venda> vendas;

    public Caixa() {
        vendas = new VetorDinamico<>();
    }

    public void incluir(Produto produto) {
        vendas.elemento(vendaAberta).incluir(produto);
    }

    public Venda novaVenda() {
        vendaAberta++;
        vendas.adicionar(new Venda(10));
        return vendas.elemento(vendaAberta);
    }
}

Obrigado!

Vou analisar com calma…

Oi Ricardo!

Boa noite!
Realmente estou meio perdido com POO, estou viciado em programação estruturada.

Fui tirar dúvidas com o monitor de forma remota e ele me respondeu que eu acessaria as informações que precisava desta forma:

caixa -> vendas[ ] -> produtos [ ] -> preco, descricao

Isso praticamente é ponteiros em C.

Eu tentei fazer o vetor dinâmico da sequinte forma:

Texto pré-formatado
if (i==quantProdutos) {
quantProdutos = 2 * quantProdutos;
Venda [] auxiliar = new auxiliar [quantProdutos];
this.compra = auxiliar;
}
Mas não consegui, ficou dando erro.

Estou cursando a disciplina de forma remota, com uma única hora de aula onde só vejo teoria. Já li bastante…

Mas estou tendo dificuldade de colocar na prática a teoria, eu aprendi a programar em FORTRAN olhando outros códigos, mas ela é uma linguagem estruturada.

Uma dificuldade que tive foi em programar com ponteiros, e Java usa a mesma lógica. Só que ela cria links entre os métodos e atributos das classes que se não souber fazer bem esse link já Elvis. Realmente tenho programado muito pela tentativa e erros. Paro para estudar o assunto mas os exemplos são muito simples e eu não consigo associar com o que estou fazendo. Agora estou vendo herança, mas é mais tranquilos que desta forma.
Aula remota é bom para curso teóricos que não exigem pratica, exige muita disciplina e determinação do aluno. Porque estou praticamente isolado, sem ter com que corresponder e tirar dúvidas. Na aula presencial a gente tem a ajuda dos colegas e a monitoria é presencial em que a gente vai com uma dúvida e os monitores colocam a experiência deles e a gente sai até sabendo mais é isso.

Agradeço muito pela a ajuda, aprendi a fazer coisas que tentei e não consegui como usar as classes booleans, dava erro e eu não sabia como tirar. Modifiquei para trabalhar com int. Agradeço a ajuda, paciência e disponibilidade em poder contar com sua ajuda e das pessoas que participam do guj.

Vou ficando por aqui vou voltar a meus afazeres.

Que Deus te abençoe agora e sempre.

boolean não é classe, é um tipo primitivo de dado.
Java possui 8 tipos primitivos:

byte  e boolean com magnitude de 1 byte
short e char    com magnitude de 2 bytes
int   e float   com magnitude de 4 bytes
long  e double  com magnitude de 8 bytes

Um objeto é uma referência para um endereço de memória, ou seja, é um ponteiro.
Única diferença é que no Java você não tem a aritmética de ponteiros.

O que o seu monitor quis explicar com o diagrama dele é que:

  • através de um objeto do tipo Caixa você teria acesso à um array de objetos do tipo Venda;
  • através de um objeto do tipo Venda você teria acesso à um array de objetos do tipo Produto;
  • através de um objeto do tipo Produto você teria acesso à descricao e ao preco.

Ele está certo pois a classe Caixa possui um array de Venda;
A classe Venda possui um array de Produto;
A classe Produto possui os atributos descricao e preco.

Como ele representou isso com setinhas (->) você associou com a sintaxe de acesso à ponteiros do C.

Isso é erro de sintaxe.
Você está fazendo isso:

<tipo_de_dado>[] <nome_da_variável> = new <nome_da_variável>[<tamanho_do_array>];

E o correto é assim:

<tipo_de_dado>[] <nome_da_variável> = new <tipo_de_dado>[<tamanho_do_array>];