Por que você não pode declarar uma classe como estática em Java?
java
static-class
Mariselvam
fonte
fonte
static
?static
classes comoabstract final
, ou seja, elas não podem ser instanciadas e não podem ser estendidas. Isso significa que eles podem conter apenas membros estáticos, o que é útil para classes que contêm apenas métodos auxiliares.Respostas:
Somente classes aninhadas podem ser estáticas. Ao fazer isso, você pode usar a classe aninhada sem ter uma instância da classe externa.
Fontes :
Sobre o mesmo tópico:
fonte
As classes de nível superior são estáticas por padrão. Classes internas são não estáticas por padrão. Você pode alterar o padrão para classes internas marcando-as explicitamente estáticas. As classes de nível superior, em virtude de serem de nível superior, não podem ter semântica não estática porque não pode haver classe pai a que se referir. Portanto, não há como alterar o padrão para as classes de nível superior.
fonte
static
palavra-chave em uma classe de nível superior denotasse e reforçasse que ela pode conter apenas membros estáticos e não ser instanciada; isso poderia, no entanto, confundir as pessoas, poisstatic
tem um significado diferente para as classes aninhadas.Estou chegando atrasado à festa, mas aqui estão meus dois centavos - filosoficamente acrescentando à resposta de Colin Hebert.
Em um nível alto, sua pergunta lida com a diferença entre objetos e tipos. Embora existam muitos carros (objetos), há apenas uma classe de carros (tipo). Declarar algo como estático significa que você está operando no espaço "tipo". Há apenas um. A palavra-chave da classe de nível superior já define um tipo no espaço "type". Como resultado, "a classe estática pública Car" é redundante.
fonte
Classe com construtor privado é estática.
Declare sua turma assim:
e você pode usar sem inicialização:
fonte
static class
declaração em C #), o compilador nem permitirá que o código declare variáveis desse tipo, nem a use como parâmetro de tipo genérico. Uma mera falta de construtores acessíveis em uma classe que poderia ser instanciada ou herdada não impediria a declaração de variáveis desse tipo, nem seu uso como parâmetro de tipo genérico.Claro que podem, mas apenas classes
internasaninhadas. Lá, isso significa que as instâncias da classe aninhada não requerem uma instância anexa da classe externa.Porém, para as classes de nível superior, os designers de idiomas não conseguiram pensar em nada útil para fazer com a palavra-chave, portanto, não é permitido.
fonte
static
, às vezes faria sentido poder. Por exemplo, uma classe que contém apenas métodos auxiliares estáticos não faz sentido para ser instanciada, mas a linguagem Java não impede você de fazê-lo. Você pode tornar a classe não instável (e praticamente 'estática') para outras classes declarando o construtor padrãoprivate
, que proíbe a instanciação porque nenhum construtor está visível.Você pode criar uma classe de utilitário (que não pode ter instâncias criadas) declarando um tipo de enum sem instâncias. ou seja, você está declarando especificamente que não há instâncias.
fonte
... pode ser declarado estático - desde que seja uma classe membro.
Do JLS:
e aqui:
Uma palavra-chave estática não faria sentido para uma classe de nível superior, apenas porque uma classe de nível superior não possui um tipo de anexo.
fonte
Inner
?Nested
teria sido uma escolha menos confusa.Como explicado acima, uma classe não pode ser estática, a menos que seja membro de outra classe.
Se você deseja criar uma classe "da qual não pode haver várias instâncias", convém examinar o padrão de design "Singleton".
Informações sobre Singleton para iniciantes aqui .
Embargo:
fonte
Além de como o Java define classes internas estáticas, há outra definição de classes estáticas conforme o mundo C # [1] . Uma classe estática é aquela que possui apenas métodos estáticos (funções) e destina-se a oferecer suporte a programação procedural. Essas classes não são realmente classes, pois o usuário da classe está interessado apenas nas funções auxiliares e não na criação de instâncias da classe. Embora as classes estáticas sejam suportadas em C #, não existe esse suporte direto em Java. No entanto, você pode usar enumerações para imitar classes estáticas de C # em Java, para que um usuário nunca possa criar instâncias de uma determinada classe (mesmo usando reflexão) [2] :
fonte
Tudo o que codificamos em java entra em uma classe. Sempre que executamos uma classe, a JVM instancia um objeto. A JVM pode criar vários objetos, por definição Estático significa que você tem o mesmo conjunto de cópias para todos os objetos.
Portanto, se Java permitiria que a classe superior fosse estática sempre que você executa um programa, ele cria um Objeto e continua substituindo o mesmo local da memória.
Se você está apenas substituindo o objeto toda vez que o executa, qual é o objetivo de criá-lo?
Portanto, esse é o motivo pelo qual o Java se livrou da estática da classe de nível superior.
Pode haver razões mais concretas, mas isso fez muito sentido lógico para mim.
fonte
As únicas classes que podem ser estáticas são as classes internas. O código a seguir funciona bem:
O objetivo das classes internas estáticas é que elas não têm uma referência ao objeto de classe externa.
fonte
Eu acho que isso é possível tão fácil quanto beber um copo de café! Basta dar uma olhada nisso. Não usamos palavras-chave estáticas explicitamente ao definir classe.
Isso não é uma definição de classe estática? Nós apenas usamos uma função ligada a apenas uma classe. Tenha cuidado para que, neste caso, possamos usar outra classe nesse aninhado. Veja isso:
fonte
new StaticClass()
e isso realmente não faz muito sentido. Com um construtor privado, não permitiria instâncias dele.Pode-se observar no
PlatformUI
Eclipse uma classe com métodos estáticos e construtor privado, sendo ele próprio final.fonte
se o benefício de usar uma classe estática não era instanciar um objeto e usar um método, basta declarar a classe como pública e esse método como estático.
fonte