NullPointerException

Boa tarde!
Na linha indicada abaixo com (AQUI->>>), o atributo ‘conta’ está com o erro de ‘NullPointerException’.
Se alguém puder me ajudar, agradeço muito!

public abstract class Pessoa {

Conta conta;  //Se uma pessoa deve ter uma conta, uma pf e uma pj por herdar seus atributos tbm terá.

private String nome;
private static int totalDePessoas;

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

public String getNome(){
	return nome;
}

public static int getTotalDePessoas(){
	return Pessoa.totalDePessoas;		
}

Pessoa(){
	this.totalDePessoas = totalDePessoas + 1;
}

Pessoa(Conta c){
	this.conta = c;
}	

}

public abstract class Conta {
//implementar tudo da outra outra conta
private int numeroDaConta;

public void setNumeroDaConta(int numeroDaConta){
	this.numeroDaConta = numeroDaConta;
}	
public int getNumeroDaConta(){
	return this.numeroDaConta;
}

}

public class Main {
public static void main(String[] args){

ContaPoupanca cp = new ContaPoupanca();
cp.setNumeroDaConta(1);
ContaCorrente ccpf = new ContaCorrente();
ccpf.setNumeroDaConta(2);
PessoaFisica pf = new PessoaFisica(cp, ccpf);
pf.setNome(“nome”);
pf.setCpf(“cpf”);
AQUI ->>>System.out.println("\nNumero da conta poupança é: " + pf.conta.getNumeroDaConta());
}

public class PessoaFisica extends Pessoa{
private String cpf;
private static int totalDePessoasFisicas;

public void setCpf(String cpf){
	this.cpf = cpf;
}

public String getCpf(){
	return this.cpf;
}

public static int getTotalDePessoas(){
	return PessoaFisica.totalDePessoasFisicas;
}	

//Aqui ou eu faço o construtor exigindo as duas contas e eu posso colocar null em uma delas, quando eu for criar um objeto do tipo PessoaFisica ou crio dois
//construtores. Um pra cada tipo de conta.
public PessoaFisica(ContaPoupanca cp, ContaCorrente cc) {
this.totalDePessoasFisicas = totalDePessoasFisicas + 1;
}
}

public class PessoaJuridica extends Pessoa {
private String cnpj;
private static int totalDePessoasJuridicas;

public void setCnpj(String cnpj){
	this.cnpj = cnpj;
}

public String getCnpj(){
	return this.cnpj;
}

public static int getTotalDePessoas(){
	return PessoaJuridica.totalDePessoasJuridicas;
}

//Pela regra de negócio, PessoaJurídica deve ter uma ContaCorrente.
public PessoaJuridica(ContaCorrente c) {
this.totalDePessoasJuridicas = totalDePessoasJuridicas + 1;
}
}

public class ContaPoupanca extends Conta{
}

public class ContaCorrente extends Conta{
}

Você está passando as contas no construtor mas não está alimentado sua variável. Este é o motivo do seu nullPointer.

@Gedson_Silva, as variáveis cp e ccpf que são de ContaPoupanca e ContaCorrente, respectivamente já estão sendo alimentadas. Essas que citei que precisam ser alimentadas, já que são herança de Conta, estou errado?

Não tenho interesse em alimentar Conta porque ela é abstrata.

Estou cometendo algum engano de conceito?

…ou vc se refere à uma outra variável?
Pode codificar a resposta, por favor?

@Joabe.Carmo o problema neste caso que você desenhou se baseia em um equívo de implementação.
Olhe a classe Pessoa, ela tem um atributo chamado Conta (desconsidere o fato de que classes herdam de Conta). Você tem um construtor de Pessoa que recebe uma Conta, mas este construtor nunca é chamado no restando do código, logo, por meio do construtor de Pessoa a conta não foi alimentado em nenhum momento.
Na sua classe Main você cria uma instancia de ContaPoupança, uma de ContaCorrente e instancia uma PessoaFIsica passando as duas contas.
O problema é que o construtor da sua classe PessoaFisica não faz nada com esses atributos que ela recebe.
Pra que o atributo conta em Pessoa não estivesse nulo você precisaria instanciar ou injetar uma instância. A passagem pelo construtor é uma forma de injetar, mas você precisa fazer o processo manualmente, o que seria assim:

public PessoaFisica(ContaPoupanca cp, ContaCorrente cc) {
    this.totalDePessoasFisicas = totalDePessoasFisicas + 1;
    conta = cp;
}

ou

 public PessoaFisica(ContaPoupanca cp, ContaCorrente cc) {
         super(cp);
         this.totalDePessoasFisicas = totalDePessoasFisicas + 1;
    }

Testa ai dos dois jeitos e vai ver que vai funcionar.
Existe outras formas de pensar esta solução, mas o motivo dela não estar funcionando não é exatamente um erro de conceito, só um detalhe faltante.

@Gedson_Silva, deu certo sim. Obrigado!
O fato de eu não ter instanciado a classe Conta e, vamos dizer, não ter dado moral a ela, é que ela é abstrata. Como não instanciamos classes abstrata, não me preocupei em injetar ela em pessoa física. Aliás, fiz a mesma coisa no restante da “aplicação estudo” aqui. Agora, parece que estou cometendo um erro de estrutura do sistema. Porque, pra mim não faz sentido, ou pelo menos não entendi, porque passaria cc ou cp para uma conta, como você me instruiu. Então eu tenho algumas perguntas:
1 - Conceitualmente, porque eu eu devo fazer isso?
2 - Você disse que há outras formas melhores de pensar essa situação. Poderia, por gentileza, me mostrar?
3 - Eu tentei apagar o construtor Pessoa(Conta c){ } e deixar apenas o construtor PessoaFisica(ContaPoupanca cp, ContaCorrente cc) e chamar um método parecido com pf.cp.getNumeroDaConta(); mas não dá certo. Só é possível chamar dessa forma: pf.conta.getNumeroDaConta(); Usando ‘conta’ e não cp ou cc. Porquê?

Obrigado pela força aí! Sou iniciante e pensar e fazer esse inicio de forma certa pra mim é fundamental. Obrigado mais uma vez pela disponibilidade.

Só lembrando que minha intenção em fazer um construtor que receba contas é obrigar que toda pessoa física deve ter uma conta. Pode parecer longe da realidade mas foi apenas pra testar o conteúdo.

Não sou muito bom em explicar teoria mas vou tentar te ajudar com seus estudos.
Saber que existe herança é importante, ainda mais é saber quando e como usá-la. Conceito geral (serve pra maioria dos casos) : é melhor usar composição do que herança.
Ao usar herança você precisa ter sempre em mente o seguinte, a classe que herda “passa a ser” a classe super, ou seja, Gato herda de Animal, logo, Gato é Animal e carrega consigo TODAS as caracteristicas de um animal. Bagre também é um Animal e é completamente diferente de Gato, como podem os dois carregar TODAS (HERANÇA INDICA QUE SÃO TODAS) as caracteristicas identicas e serem tão diferentes. Aí você pensa: Ok, vou organizar os animais em classes e se depara com isso. Completamente inviável. Mas no fim isso é herança e é esse tipo de complexidade que você deve esperar toda vez que desejar utilizá-la.
Então respondendo as suas perguntas digo, use herança com muita cautela e certifique-se de estar haver compreendido bem os conceitos aplicados a ela.

Sobre a intenção de obrigar pessoa física a ter uma conta criando um construtor que receba conta como parâmetro vale dizer que é uma opção “viável”. Toda classe precisa de um construtor e se você tem certeza absoluta que só vai haver um construtor e que ele vai receber uma conta, ok, você está obrigando a CONSTRUÇÃO a ter uma conta, mas precisa repassar a informação para a instância criada;

public PessoaFisica(Conta conta){
   this.conta = conta;
}

Os tutoriais nos links devem ajudar a esclarecer um pouco melhor.

Espero ter contribuido.
[]'s

@Gedson_Silva, contribuiu sim. Muito obrigado!