Estou iniciando, mas, pelo que entendo, é o seguinte:
- Depende dos problemas do negócio que seu app quer resolver. Digamos que seu app será responsável por controlar uma biblioteca, então vc poderia ter as seguintes classes:
class Biblioteca { /* ... */ }
class Livro { /* ... */ }
class Funcionario { /* ... */ }
class Usuario { /* ... */ }
- Não há problemas em criar outros objetos dentro de uma outra classe. No exemplo acima, um novo
Livro deve poder ser adicionado em algum lugar e este lugar provavelmente será em Biblioteca.
O que não pode acontecer é ter uma determinada classe com responsabilidades demais ou com responsabilidades que não deveriam ser dela.
A classe Biblioteca é apenas uma abstração do que seria uma biblioteca real, ela representa esta entidade em código. Ela não deveria ser responsável por exibir a interface gráfica, por exemplo; para isso seria melhor ter uma classe TelaInicial. Na verdade, uma classe pra cada tela: TelaCadastroLivros, TelaCadastroUsuario, etc…
- Normalmente, linguagens não estabelecem diretrizes sobre como vc deve criar suas classes.
No caso do Java o que vc tem são convenções para a criação de nomes, que no caso das classes devem começar com letra maiúsculas. Os métodos devem começar com um verbo e, assim como variáveis, devem começar com letra minúscula e, caso contenha mais de uma palavra, estas palavras adicionais devem começar com letra maiúscula.
class Pessoa { // classes começam sempre com letra maiúscula
int idade; // variáveis e métodos começam com minúscula
String nomeDaPessoa; // variável com nome composto
void exibirDadosDaPessoa() { /* ... */ } // métodos começam com verbo
}
Mas isso não passa de convenção apenas.
Para nos ajudar a resolver problemas recorrentes em desenvolvimento de software de forma padronizada há os Design Patterns, eles são independentes de linguagem e são muito importantes. Para desenvolver software de maior qualidade, comece estudando eles; leia também sobre SOLID e DRY.
Bons estudos!