Um arquivo java pode ter mais de uma classe?

Respostas:

128

Sim pode. No entanto, só pode haver uma classe pública de nível superior por .javaarquivo, e as classes públicas de nível superior devem ter o mesmo nome do arquivo de origem.

O objetivo de incluir várias classes em um arquivo de origem é agrupar a funcionalidade de suporte relacionada (estruturas de dados internas, classes de suporte, etc.) junto com a classe pública principal. Observe que é sempre bom não fazer isso - o único efeito é na legibilidade (ou não) do seu código.

Sean Reilly
fonte
1
Acho que é uma boa ideia fazer isso se você quiser manter essas classes extras privadas, para que possam ser completamente alteradas mais tarde, sem quebrar nada externo que use essas classes acidentalmente.
Erich Kitzmueller
3
Ele está lá para compatibilidade 1.0 (antes das classes aninhadas). É um grande erro de linguagem. A maior vantagem de usá-lo é que os IDEs têm um tratamento de arquivos impossível.
Tom Hawtin - tackline
25
Uma classe pública de nível superior por arquivo. Pode haver quantas classes internas públicas por arquivo você desejar.
Erickson
@Tom, qual parte você acha que é um erro, classes internas ou várias classes de nível superior por arquivo?
finnw
@finnw Várias classes de nível superior por arquivo. É tão errado. Onde está java.awt.LightweightDispatcher?
Tom Hawtin - tackline
17

Se você deseja implementar uma classe pública, deve implementá-la em um arquivo com o mesmo nome dessa classe. Um único arquivo pode conter uma classe pública e opcionalmente algumas classes privadas. Isso é útil se as classes são usadas apenas internamente pela classe pública. Além disso, a classe pública também pode conter classes internas.

Embora seja bom ter uma ou mais classes privadas em um único arquivo de origem, eu diria que é mais legível usar classes internas e anônimas. Por exemplo, pode-se usar uma classe anônima para definir uma classe Comparator dentro de uma classe pública:

  public static Comparator MyComparator = new Comparator() {
    public int compare(Object obj, Object anotherObj) {

    }
  };

A classe Comparator normalmente requer um arquivo separado para ser pública. Dessa forma, ele é empacotado com a classe que o usa.

kgiannakakis
fonte
1
Não é realmente uma classe privada se estiver no arquivo sem modificador. Você não pode ter uma aula particular sem que seja uma classe interna, porque se você tivesse, quem poderia usá-la?
Bjorn
10

Sim, quantos você quiser!

MAS, apenas uma classe "pública" em cada arquivo.

Alberto
fonte
6

Um arquivo .java é chamado de unidade de compilação. Cada unidade de compilação pode conter qualquer número de classes e interfaces de nível superior. Se não houver tipos públicos de nível superior, a unidade de compilação pode receber qualquer nome.

//Multiple.java
//preceding package and import statements

class MyClass{...}
interface Service{...}
...
//No public classes or interfaces
...

Só pode haver uma classe / interface pública em uma unidade de compilação. O cu deve ser nomeado exatamente como este tipo público de nível superior.

//Test.java
//named exactly as the public class Test
public class Test{...}
//!public class Operations{...}
interface Selector{...}
...
//Other non-public classes/interfaces

Pontos importantes sobre o método principal - parte 1

Parte 2

(Pontos sobre o número de classes e seus níveis de acesso cobertos na parte 2)

Utsav
fonte
5

Sim, você pode criar mais de uma classe pública, mas deve ser uma classe aninhada.

public class first {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }

    public class demo1
    {

        public class demo2
        {

        }
    }
}
Ganesh
fonte
4

Além das classes internas anônimas, outro uso são as classes internas privadas que implementam uma interface pública ( consulte este artigo ). A classe externa pode acessar todos os campos e métodos privados da classe interna.

Isso permite criar duas classes fortemente acopladas, como um modelo e sua visualização, sem expor as implementações de qualquer um. Outro exemplo é uma coleção e seus iteradores.

Rich Apodaca
fonte
4

Em geral, deve haver uma classe por arquivo. Se você organizar as coisas dessa maneira, quando pesquisar uma turma, saberá que só precisa pesquisar o arquivo com aquele nome.

A exceção é quando uma classe é melhor implementada usando uma ou mais pequenas classes auxiliares. Normalmente, o código é mais fácil de seguir quando essas classes estão presentes no mesmo arquivo. Por exemplo, você pode precisar de uma pequena classe de wrapper 'tupla' para passar alguns dados entre chamadas de método. Outro exemplo são as classes de 'tarefa' que implementam Runnable ou Callable. Eles podem ser tão pequenos que são mais bem combinados com a classe pai os criando e chamando.

Confusão
fonte
4

Sim 200% ,

Exemplo:

class A {
 void methodDeclaration() { System.out.println("!!!"); }
 }
 class B {
 public static void main(String[] args) {
new A().methodDeclaration();
    }
 }
Shivanandam
fonte
2

Sim, pode, mas só pode haver 1 classe pública dentro de qualquer pacote, pois o compilador java cria o arquivo .Class que tem o mesmo nome que o nome da classe Pública, portanto, se houver mais de 1 classe pública, seria difícil selecionar compilador que qual deve ser o nome do arquivo de classe.

Meetu Choudhary
fonte
1

Varia ... Um exemplo seria uma classe anônima (você encontrará muitas delas ao usar ouvintes de eventos e outros).

laginimaineb
fonte
1

Eu acho que deveria ser "só pode haver uma classe pública de nível superior NÃO ESTÁTICO por arquivo .java". Não é?

HolidayCactus
fonte
Você deve fazer isso como uma pergunta, em vez de responder aqui.
Ashish Kumar
1

Se você deseja implementar um singleton, que é uma classe que roda em seu programa com apenas uma instância na memória durante a execução do aplicativo, uma das maneiras de implementar um singleton é aninhar uma classe estática privada dentro de uma classe pública . Então, a classe privada interna apenas se instancia quando seu método público para acessar a instância privada é chamado.

Confira este artigo wiki,

https://en.wikipedia.org/wiki/Singleton_pattern

O conceito demora um pouco para ser mastigado.

chrismjh
fonte
1

Em um arquivo .java, pode haver apenas uma classe pública de nível superior cujo nome é o mesmo do arquivo, mas pode haver várias classes internas públicas que podem ser exportadas para todos e acessar os campos / métodos da classe externa, por exemplo : AlertDialog.Builder (modificado por 'public static') em AlertDialog (modificado por 'public')

Baoyang
fonte
1

Sim, você pode ter mais de uma classe em um arquivo .Java. Mas você tem que tornar um deles Público. e salve o arquivo .java com o mesmo nome da classe pública. quando você compilar esse arquivo .java, obterá arquivos .class separados para cada classe definida no arquivo .java.

Além disso, existem muitos métodos para definir mais de uma classe em um arquivo .java.

  1. conceito de uso de classes internas.
  2. Use o conceito de classes anônimas.
Gaurav Varshney
fonte
1

Sim ! O arquivo .java pode conter apenas uma classe pública.

Se você deseja que essas duas classes sejam públicas, elas devem ser colocadas em dois arquivos .java: A.java e B.java.

Rakesh Singh
fonte
2
Não tenho certeza se sua resposta acrescenta mais alguma coisa das 12 outras respostas
vá para
1

Sim, você pode ter mais de uma classe dentro de um arquivo .java. No máximo um deles pode ser público. Os outros são pacotes privados. Eles NÃO PODEM ser privados ou protegidos. Se um for público, o arquivo deve ter o nome dessa classe. Caso contrário, QUALQUER COISA pode ser dado a esse arquivo como seu nome.

Ter muitas classes dentro de um arquivo significa que essas classes estão no mesmo pacote. Portanto, quaisquer outras classes que estão dentro desse pacote, mas não naquele arquivo, também podem usar essas classes. Além disso, quando esse pacote é importado, a classe importadora também pode usá-los.

Para uma investigação mais detalhada, você pode visitar minha postagem do blog aqui .

Merter Sualp
fonte
1
Bem-vindo ao Stack Overflow! Agradeço que você expôs informações que ainda não foram abordadas aqui. Você também fez um bom trabalho ao citar a postagem do seu blog ao declarar a propriedade e incluir informações relevantes aqui. Se você decidir contribuir mais para este site no futuro (e espero que o faça), certifique-se de considerar este artigo para garantir que suas postagens continuem a ser bem recebidas se você citar seu blog.
4castle de
0

Só pode haver uma classe pública de nível superior em um arquivo. O nome da classe dessa classe pública deve ser o nome do arquivo. Ele pode ter muitas classes internas públicas.

Você pode ter muitas classes em um único arquivo. Os limites para vários níveis de visibilidade de classe em um arquivo são os seguintes:

Classes de nível superior:
1 classe pública
0 classe privada
qualquer número de classes padrão / protegidas

Classes internas:
qualquer número de classes internas com qualquer visibilidade (padrão, privado, protegido, público)

Por favor corrija-me se eu estiver errado.

Lakshmikant Deshpande
fonte
0

Sim pode. No entanto, só pode haver uma classe pública por arquivo .java, pois as classes públicas devem ter o mesmo nome do arquivo de origem.

user3077069
fonte