A classe Venda que é abstract não enxerga objeto produto. Como inseri-lo se essa classe não pode ser instanciada e tem duas classes filhas VendaVista e VendaPrazo, que pelo meu entendimento não deve conter os métodos existentes na classe mãe

Estou criando um projeto de vendas, antes ela estava funcionando mas quando a tornei uma classe abstrata e mãe das classe VendaPrazo e VendaVista, ela não reconhece o objeto Produto, e assim ela não consegue calcular o total de preços. Segue os códigos:

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

public String toString() {
	return "Descricao: " + descricao + "        Preco: " + preco;
}

}

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

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

public Venda(Date data) {
	this.data = data;
}

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

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

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

public abstract double getTotal();

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

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

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

public Produto produto(int posicao) {
	if (posicao < 0) {
		throw new IllegalArgumentException(posicao + " uma posicao invalida");
	}
	if (posicao >= numProdutos) {
		throw new IllegalArgumentException(
				posicao + " uma posicao invalida " + numProdutos + " elementos no vetor");
	}
	return p[posicao];
}

public int numProdutos() {
	return numProdutos;
}

public int getNumProdutos() {
	return numProdutos++;
}

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

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

public String toString() {
	return "Data: " + data + "\nCliente: " + cliente.nome + "\nEndereco: " + cliente.endereco + " " + total;
}

}

public class Aplicacao {

/**
 * @param args
 */
public static void main(String[] args) {
	Date data = new Date();
	Atendente atendente = new Atendente("Mariana", 756148, 1700.0, 50.0);
	Cliente cliente = new Cliente("McGyver", "Belivery Hills");
	Gerente gerente = new Gerente("Juliana", 951357, 4000.0, 1000.0);
	Repositor repositor = new Repositor("Pedro", 852456, 1400.0, 100.0, 17.0);
	Produto produto = new Produto("arroz", 30.0);
	VendaPrazo vendaPrazo = new VendaPrazo(data, cliente, produto);
	VendaVista vendaVista = new VendaVista(data, cliente);

	System.out.println("Atendente-> " + atendente);
	System.out.println("Cliente-> " + cliente);
	System.out.println("Gerente-> " + gerente);
	System.out.println("Repositor-> " + repositor);
	System.out.println("\nProduto: ");
	System.out.println(produto);
	System.out.println("\nVenda a prazo: ");
	System.out.println(vendaPrazo);
	System.out.println("\nVenda a vista: ");
	System.out.println(vendaVista);

}

}

import java.util.*;

public class VendaPrazo extends Venda {
private Date data;
private Cliente cliente;
private Produto[] p;
private double total;

public VendaPrazo(Date data, Cliente cliente, Produto[] p) {
	super(data, cliente, p);
}
@Override
public double getTotal() {
	double juros = 1 + 0.15;
	total = this.total() * juros;
	return total;
}

public void setTotal(double total) {
	this.total = total;
}

@Override
public String toString() {
	return super.toString() + ", Total: " + this.total();
}

}

Para sua classer ser abstrata ela precisa ter no mínimo 1 método abstrato.
Se vc não tem nenhum método abstrato, tire a flag “abstract” da sua classe. (Para usar herança, a classe pai não precisa, necessariamente, ser abstrata.)

Obrigado!
Inseri um método abstrato mas continua informando o mesmo erro.

Tem um erro de semântica.
A variável produto esta no singular mas é um array, portanto, deveria estar no plural (produtos).
Não enxerga o objeto produto por que ele é private, portanto visível apenas na classe.
Assim você precisa adicionar o método:

public Produto[] getProdutos(){ return p;}
Observando que você já possui os métodos:

Desculpa eu entendi o que fazer, mas não compreendi em que classe devo fazer.
Estou aprendendo Java neste semestre.

Você pode implementar na classe mãe.
A classe filha vai herdar esse método por ser public.
As classes filhas são classes especializadas.
O que for comum/genérico, você implementa na classe mãe.
O que for muito particular, você pode implementar na classe filha.
Quando for algo particular que já exista na classe mãe, você pode sobrescrever na classe filha usando a anotação @Override.
Então fica assim:
Se o método é comum você o cria na classe mãe.
Se o método é comum mas a classe filha faz de forma diferente, você usa o @Override na classe filha e sobrescreve o método.
Se for algo novo, muito particular, você cria o método na classe filha, por ser algo novo.
Ex.:

public abstract class Animal{
    public void fazerBarulho(){
        System.out.println("Fazendo barulho");
    }
}
public class Cachorro extends Animal{

    @Override
    public void fazerBarulho(){
        System.out.println("au au");
    } 
}

public class Coruja extends Animal(){
    //como não sobrescrevi com @override ela escreverá fazendo barulho quando 
   //chamar o método fazer barulho

   public void voar(){
        System.out.println("voando");
   }
}

Veja, a classe cachorro, embora tenha herdado o método fazerBarulho, faz um barulho distinto dos outros animais.

Já a classe coruja, executa o fazer barulho da classe mãe contudo tem um método particular referente a voar implementado diretamente na classe filha.

Veja, a classe Coruja poderia extender de Ave e a classe Ave de Animal, depois jogaria o método voar de Coruja para a classe mãe Ave.

Com o tempo e prática você vai entender.

Deve ajudar com os conceitos:
https://www.youtube.com/watch?v=PKTHY61u2oE&list=PLxQNfKs8YwvGhXHbHtxtoB-tRRv6r3Rlr&index=49

Obrigado!
Estou fazendo as modificações e testando…

Deu o seguinte erro:

Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The constructor VendaPrazo(Date, Cliente, Produto) is undefined at Heranca.Aplicacao.main(Aplicacao.java:26)

Construtor indefinido.
É um problema no construtor.
Veja a variavel produto é referente a um único item.

Já o construtor produto é um array de itens.

O construtor buscado é:
public Venda(Date data, Cliente cliente, Produto p) sem colchetes.
Mas o existente é:
public Venda(Date data, Cliente cliente, Produto[] p)
Vai ter que ajustar o construtor.

Depois estude a classe ArrayList.

Eu entendo, mas o objeto produto não é um vetor.
Eu crio um vetor de produtos em vendas.

Mas o método construtor na classe vendas pede um vetor, por isso dá erro.

Você pode passar um vetor “vazio”.

VendaPrazo vendaPrazo = new VendaPrazo(data, cliente, new produto[8]);//máximo de 8 produtos pois foi informado 8 posições
//Depois você chama o método incluir produto.
vendaPrazo.incluirProduto(produto);

Obs.: após um certo número de tentativas, vai dar arrayIndexOutOfBoundsException.
O ideal seria usar a classe ArrayList e não vetores.

Tá tudo bem o programa é para testar o funcionamento da Herança.
Funcionou em parte. Ele não tá calculando nem os descontos, nem os juros em cima dos preços.

Bom dia!
Deu certo agora!
Foi falta de atenção na escrita do código.
Muito obrigado!
Boa semana!