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. 
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());
}
}