Dúvida em exercício de Orientação a Objeto?

Programa Principal para entrada de dados , consumo da classe de GerencimentoMatricula e impressão de dados, no programa principal construa 3 instancias de matricula pedindo para usuário informar os dados do Aluno e dos Dados do Curso por meio da classe java.util.Scanner no java. Armazene os dados do aluno digitados pelo usuário em uma instancia de Aluno e os dados do curso em uma instancia de Curso.

Classe Aluno

package br.com.fabricadeprogramador.exerc1;

public class Aluno extends Matricula{
	
	private String nome;
	private String cpf;
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

}


Classe Curso

package br.com.fabricadeprogramador.exerc1;

public class Curso extends Matricula {
	
	private String nome;
	private Integer cargahoraria;
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Integer getCargahoraria() {
		return cargahoraria;
	}
	public void setCargahoraria(Integer cargahoraria) {
		this.cargahoraria = cargahoraria;
	}

}

Classe matricula

package br.com.fabricadeprogramador.exerc1;

import java.util.Date;

public class Matricula {
	
	private Integer codigo;
	private Date data;
	private Curso curso;
	private Aluno aluno;
	public Integer getCodigo() {
		return codigo;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public Date getData() {
		return data;
	}
	public void setData(Date data) {
		this.data = data;
	}
	public Curso getCurso() {
		return curso;
	}
	public void setCurso(Curso curso) {
		this.curso = curso;
	}
	public Aluno getAluno() {
		return aluno;
	}
	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

}


Classe dos metodos

package br.com.fabricadeprogramador.exerc1;

public class GerenciadorMatricula {

		
		Matricula matricula[] = new Matricula[3];
		int codigoSeq = 0;
		
		public void cadastrar(Matricula nova) {
			if (codigoSeq < matricula.length) {
				matricula[codigoSeq] = nova;
				codigoSeq++;
			}
		}
		public void imprimir() {
			for (int i = 0; i < matricula.length; i++) {
				System.out.println("Código: " + matricula[i].getCodigo() + ", Data: " + matricula[i].getData() + ", Curso: " + matricula[i].getCurso() + ", Aluno: " + matricula[i].getAluno());
				if(matricula[i] instanceof Curso){
					System.out.println("Nome: " + ((Curso) matricula[i]).getNome());
					System.out.println("Carga Horária: " + ((Curso) matricula[i]).getCargahoraria());
				}else if(matricula[i] instanceof Aluno){
					System.out.println("Nome: " + ((Aluno) matricula[i]).getNome());
					System.out.println("Cpf: " + ((Aluno) matricula[i]).getCpf());
				}
			}
		}
} 


Classe do programa principal

package br.com.fabricadeprogramador.exerc1;

import java.util.Scanner;


public class ProgramaPrincipalMatricula {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
				Scanner scan = new Scanner(System.in);
				Matricula m = new Aluno();
				
				System.out.println("Digite o nome do aluno");
				String nome = scan.nextLine();
				System.out.println("Digite o cpf do aluno");
				String cpf = scan.nextLine();
					
				m = new Curso();
				Curso jaofunc = (Curso)m;
				System.out.println("Digite o nome do curso");
				String nomecurso = scan.nextLine();
				System.out.println("Digite a carga horária");
                Integer cargahoraria = scan.nextInt();
				
				System.out.println(m.getAluno());
				System.out.println(jaofunc.getNome());
			

			}

	
}

como faço pra pegar os valores pois nao esta mostrando todos os dados da classe aluno nem os dados da classe curso e esta passando nulo no resultado do programa principal ja sei porque porem como pega esses dados alguem me ajuda?

Alterei um pouco a classe principal

package br.com.fabricadeprogramador.exerc1;

import java.util.Scanner;

public class ProgramaPrincipalMatricula {

public static void main(String[] args) {
	// TODO Auto-generated method stub
			Scanner scan = new Scanner(System.in);
			Matricula m = new Aluno();
			
			Aluno a = new Aluno();
			
			System.out.println("Digite o nome do aluno");
			a.setNome(scan.nextLine());
			System.out.println("Digite o cpf do aluno");
			a.setCpf(scan.nextLine());
				
			m = new Curso();
			Curso jaofunc = (Curso)m;
			System.out.println("Digite o nome do curso");
			jaofunc.setNome(scan.nextLine());
			System.out.println("Digite a carga horária");
            jaofunc.setCargahoraria(scan.nextInt());
			
			System.out.println(a.getNome()+""+a.getCpf());
			System.out.println(jaofunc.getNome()+""+jaofunc.getCargahoraria());
		

		}

}

Bom dia tudo bem?

Não use herança nas classes matricula e curso.
na classe principal você faz assim:

package br.com.fabricadeprogramador.exerc1;

import java.util.Scanner;

public class ProgramaPrincipalMatricula {

public static void main(String[] args) {
	// TODO Auto-generated method stub
			Scanner scan = new Scanner(System.in);
			Matricula m = new Matricula();
			
			Aluno a = new Aluno();
			
			System.out.println("Digite o nome do aluno");
			a.setNome(scan.nextLine());
			System.out.println("Digite o cpf do aluno");
			a.setCpf(scan.nextLine());
				
			
			Curso jaofunc = new Curso();
			System.out.println("Digite o nome do curso");
			jaofunc.setNome(scan.nextLine());
			System.out.println("Digite a carga horária");
            jaofunc.setCargahoraria(scan.nextInt());

                        m.setAluno(a);
                        m.setCurso( jaofunc);
			
			System.out.println(m.getAluno.getNome()+""+m.getAluno.getCpf()\nm.getCurso.getNome()+""+m.getCurso.getCargahoraria());
			
		

		}

}

Tanto aluno como curso são atributos da classe matricula, então você instância um objeto matricula e salva os objetos alunos e curso que você criou através do set

espero ter ajudado