Eu tenho um arquivo Test.java
e o seguinte código dentro dele.
public class Abcd
{
//some code here
}
Agora a classe não compila, mas quando eu removo o public
modificador, ela compila bem.
Qual é o raciocínio por trás do Java que nos permite compilar um nome de classe que é diferente do nome do arquivo quando não é público.
Eu sei que é uma pergunta para iniciantes, mas não consigo encontrar uma boa explicação.
Respostas:
A lógica é permitir mais de uma classe de nível superior por
.java
arquivo.Muitas classes, como ouvintes de eventos, são apenas de uso local e as versões mais antigas do Java não suportam classes aninhadas. Sem esse relaxamento da regra "nome do arquivo = nome da classe", cada uma dessas classes exigiria seu próprio arquivo, com o resultado inevitável da proliferação infinita de
.java
arquivos pequenos e da dispersão de códigos fortemente acoplados.Assim que o Java introduziu classes aninhadas, a importância dessa regra diminuiu significativamente. Hoje você pode passar por centenas de arquivos Java, nunca se deparando com um que tire proveito dele.
fonte
O motivo é o mesmo para as placas da porta. Se uma pessoa reside oficialmente no escritório (público declarado), seu nome deve estar na etiqueta da porta. Como "Alex Jones" ou "Detetive Colombo". Se alguém apenas visita a sala, conversa com um funcionário ou limpa o chão, seu nome não precisa ser oficialmente colocado na porta. Em vez disso, a porta pode ler "Utilitários" ou "Sala de reunião".
fonte
A especificação Java afirma que você só pode ter no máximo uma classe pública por arquivo. Nesse caso, o nome da classe deve corresponder ao nome do arquivo. Todas as classes não públicas podem ter qualquer nome, independentemente do nome do arquivo.
fonte
Eu acho que permiti-los é um pré-requisito para classes aninhadas. Classes anônimas, em particular, reduzem drasticamente o número de arquivos .java necessários. Sem suporte para isso, você precisaria de muitas implementações de interface de método único em seus próprios arquivos separados da classe principal em que são usados. (Estou pensando em ouvintes de ação em particular)
Há uma boa explicação de todas as classes aninhadas no tutorial Java de classes aninhadas no site da Oracle, que possui exemplos de cada uma. Ele também tem um motivo para serem úteis, que cito:
(ênfase minha)
Não estou familiarizado com as especificações Java nos primeiros dias, mas uma pesquisa rápida mostra que classes internas foram adicionadas no Java 1.1.
fonte
Eu olho para o contrário. O estado natural das coisas seria o programador escolher o nome da classe e o nome do arquivo independentemente. Provavelmente, para simplificar a localização de classes públicas de fora de um pacote durante a compilação, há uma restrição especial de que uma classe pública esteja em um arquivo com o nome correspondente.
fonte
Observe que Java diferencia maiúsculas de minúsculas, mas o sistema de arquivos não precisa ser. Se o nome base do arquivo for "abcd", mas a classe for "Abcd", isso seria compatível com a regra em um sistema de arquivos que não diferencia maiúsculas de minúsculas? Certamente não quando portado para um que diferencia maiúsculas de minúsculas.
Ou suponha que você tenha uma classe chamada ABCD e uma classe Abcd (não vamos deixar de ser uma má idéia: isso pode acontecer) e o programa é portado para um sistema de arquivos que não diferencia maiúsculas de minúsculas. Agora você não apenas precisa renomear arquivos, mas também classes, oops!
Ou e se não houver arquivo? Suponha que você tenha um compilador Java que possa receber entrada na entrada padrão. Então a classe deve ser nomeada "StandardInput"?
Se você explorar racionalmente as implicações de exigir que os nomes de arquivos sigam os nomes das classes, você descobrirá que é uma má ideia de mais de uma maneira.
fonte
Foo
foi declarado, os identificadoresFOO
,foo
,fOo
, etc. seriam todos "indefinido", mesmo que existia dentro escopos externos. Esse design eliminaria o problema de distinção entre maiúsculas e minúsculas nos nomes de arquivos.Outro ponto que muitas respostas não foram apontadas é que, sem a
public
declaração, a JVM nunca saberia qual método principal de classes precisa ser chamado. Todas as classes declaradas em um arquivo .java podem ter métodos principais, mas o método principal é executado apenas na classe marcada como pública. HTHfonte
Como um arquivo java pode conter mais de uma classe, ele pode ter duas classes em um arquivo java. Mas um arquivo java deve conter uma classe com o mesmo nome que o nome do arquivo, se contiver uma classe pública.
fonte