Oi Adauto, espero conseguir responder suas perguntas... vamos lá!
1-" No código tenho duas classes compiladas juntas [...].
É possível ter duas classes dentro de um mesmo arquivo sim! A lógica é: quando você tem um arquivo (A.java) e possui dentro dele duas declarações de classe:class A
e class B
, sem serem públicas. O compilador irá gerar as classes sem problema algum.
O único problema que pode acontecer é a classe pública ser diferente do nome do arquivo ou então conter duas classes públicas dentro do mesmo arquivo. O resto é tudo livre!
2-"Na classe B tenho um método B, com o mesmo nome da classe certo? Eu comentei o get e o set do B e fui criar de novo via Eclipse mas ele cria só o get, sabe me dizer o por que?
Há uma diferença dos valores existentes dentro da classe, veja:
class B {
// atributo inteiro com nome b (atente-se ao minúsculo)
private final int b;
// construtor da classe B, sem modificador de acesso
//(modificador padrão default)
B(int b) {
this.b = b;
}
// getter para o atributo b
public int getB() {
return b;
}
// setter para o atributo b
public void setB(int b) {
// cuidado com os parâmetros
b = b;
}
}
Na marcação de cuidado com os parâmetros está acontecendo o seguinte: o parâmetro b está recebendo o valor dele mesmo (b = b
).
Isso acontece por conta do escopo de seu método. Quando temos um atributo b dentro da classe, podemos acessá-lo em um método dentro da mesma a partir de seu nome ou com o operador this. Este operador se torna opcional quando não temos nenhuma variável ou parâmetro dentro do escopo que interfira com o atributo.
A partir do momento em que temos um parâmetro (ou variável) chamada b dentro do método, o compilador entenderá que ela deverá ser tratada com prioridade, fazendo com que o atributo fique ''escondido''. Nesses casos de variáveis e parâmetros juntos, é necessária a utilização do this para sua invocação.
Isso nós chamamos de shadowing, dá uma olhada neste post feito pelo Alex lá no blog.
3- Comentando o que o código faz [...]
Agora, tratando sobre o método main dentro da classe A:
class A {
public static void main(String[] args) {
// cria instância de B (classe) e com b (atributo) valendo 10
B b = new B(10);
// define o valor de b (atributo) para 5
b.setB(5);
// imprime 5
System.out.println(b.getB());
}
}
NOTA: Eu só tive certeza em dizer que seria para o atributo b por olhar a implementação do setter e getter definidos na classe B, mas tome cuidado com isso, pois depende da implementação.
Tenha cuidado também com as nomenclaturas, declarações e escopos de métodos, pois é isso que está causando o problema.
Espero ter ajudado.