Ajuda em array de objetos

Oi gente estou com dúvidas em array de objetos, preciso de ajuda!
Vou colocar logo a questão aqui e o que eu ja fiz:

Conceitos básicos de Programação OO; Método toString( ): Implementar as classes a
seguir:
a) Classe: Pessoa
i) Atributos da classe Pessoa:
nome (string) → não pode receber um valor nulo ou string vazia;
idade (inteiro) → não pode receber um valor menor que 0;
filhos (Array de objetos do tipo Pessoa) → não pode manter um array nulo.
ii) Implementar apenas um construtor recebendo valores para os atributos nome e idade da
classe Pessoa. OBS: este construtor deverá inicializar o atributo filhos com um array de
tamanho 3.
iii) Utilizar a técnica de encapsulamento apresentada no curso e implementar métodos get e
set para todos os atributos (ver observação abaixo).
iv) OBS: Não implementar o método set para o atributo filhos. O atributo filhos só será
manipulado pelo método cadastrarFilho da classe Pessoa detalhado a seguir.
v) O método boolean cadastrarFilho(Pessoa filho) insere um objeto do tipo Pessoa no
array de filhos da Pessoa. O método retorna verdadeiro se o filho foi cadastrado com
sucesso e falso quando o array de filhos estiver cheio ou se o objeto filho passado como
parâmetro é nulo.
vi) Na classe Pessoa, implementar o método String toString( ) que retorna uma representação string de um objeto da classe Pessoa no seguinte formato:

Dados da pessoa:
Nome: xxxxxxxxxxxxxxx
Idade: xx
Filhos: xxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx

OBS: Para simplificar não é necessário imprimir todos os dados dos filhos dos
filhos (se houverem), apenas o nome de cada um dos filhos.

b) Implementar uma aplicação chamada AplicacaoPessoa que instancia um objeto do tipo
Pessoa, a partir do nome e da idade informados pelo usuário. Em seguida, o programa deve
oferecer um menu para o usuário com as seguintes opções:
i) Cadastrar filho. O usuário deverá informar os dados do filho a ser cadastrado;
ii) Imprimir dados da Pessoa. Nesta opção, o programa deve imprimir os valores de todos
os atributos do objeto Pessoa instanciado fazendo uso do método toString
implementado.

O QUE EU JÁ FIZ:

public class Pessoa {

private String nome;
private int idade;
private Pessoa[] filhos;
private int contador;

Pessoa(String n, int i) {
	setNome(n);
	setIdade(i);
	filhos = new Pessoa[3];
	contador = 0;
	
}

public void setNome(String n) {
	if(n != null && n.trim().length() > 0) {
		nome = n;
	}
}

public String getNome() {
	return nome;
}

public void setIdade(int i) {
	if(i >= 0) {
		idade = i;
	}
}

public int getIdade() {
	return idade;
}

public Pessoa[] getFilhos() {
	return filhos;
}

public boolean cadastrarFilho(Pessoa filho) {
	if(contador == 3 || filho == null) {
		return false;
	} else {
		filhos[contador] = filho;
		contador++;
		return true;
	}
}

public String toString() {
	String s = "Nome: " + nome +
			"\nIdade: " + idade +
			"\nFilhos: \n";
	for(int i = 0; i < contador; i++) {
		s += filhos[i].toString() + "\n";
	}
	return s;
	
}

import javax.swing.JOptionPane;
public class AplicacaoPessoa {

public static void main(String[] args) {
	
	String op = "";
	
	String nome = JOptionPane.showInputDialog("Digite seu nome:");
	int idade = Integer.parseInt(JOptionPane.showInputDialog("Digite sua idade:"));
	Pessoa p = new Pessoa(nome, idade);
	
	do {
		
		op = JOptionPane.showInputDialog("Digite a opção desejada: \n1. Cadastrar filho \n2. Imprimir dados \n0. Sair");
		
		if(op.equals("1")) {
			String nomeFilho = JOptionPane.showInputDialog("Digite o nome do seu filho:");
			int idadeFilho = Integer.parseInt(JOptionPane.showInputDialog("Digite a idade do seu filho:"));
			Pessoa f = new Pessoa(nomeFilho, idadeFilho);
			boolean status = p.cadastrarFilho(f);
			if(status) {
				JOptionPane.showMessageDialog(null, "Filho cadastrado com sucesso!");
			} else {
				JOptionPane.showMessageDialog(null, "Filho não cadastrado!");
				System.out.println(p.toString());
			}
		} else if (op.equals("2")) {
			System.out.println(p.toString());
		}
		
	}while(!op.equals("0"));

}

}

O problema é que quando vou rodar a aplicação, os filhos que estão implementados no método toString() não aparecem no formato correto. É como se o array não estivesse “funcionando” hehehehe espero que tenham entendido minha dúvida. Já agradeço desde já!

Como a questão disse, não é necessário imprimir todos os dados dos filhos, apenas os nomes, então ao invés de usar toString() nos filhos, utilize apenas getNome().