Um dos meus filhos está cursando Java no ensino médio e fez isso em um de seus testes:
Qual das alternativas a seguir é um identificador válido em Java?
uma.
123java
b.main
c.java1234
d.{abce
e)whoot
Ele respondeu be entendeu errado.
Eu olhei para a pergunta e argumentei que main
é um identificador válido e que deveria estar certo.
Examinamos a especificação Java para identificadores e isso reforçou esse ponto. Também escrevemos um programa de amostra que tinha uma variável chamada main
, além de um método. Ele criou uma refutação por escrito que incluiu a referência da documentação Java, o programa de teste e o professor a ignorou e diz que a resposta ainda está incorreta.
É main
um identificador válido?
java
language-lawyer
main
identifier
Gary Bak
fonte
fonte
Respostas:
Isso compila e, quando executado, emite esta saída:
A sequência de caracteres
main
é um identificador, não uma palavra-chave ou palavra reservada.A seção relevante do JLS é 3.8 :
A sequência de caracteres
main
se encaixa na descrição acima e não está na lista de palavras - chave na Seção 3.9 .(A sequência de caracteres
java1234
também é um identificador, pelos mesmos motivos.)fonte
main
bem;)main
é um identificador java válido e o professor está errado.A documentação relevante está na Especificação da linguagem Java, aqui:
Capítulo 3. "Estrutura Lexical", seção 3.8. "Identificadores":
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
Diz:
O que significa que você pode provar que é um identificador válido:
fonte
Como as outras respostas declaram
main
é um identificador Java válido , bem comojava1234
.Eu acho que a confusão vem do fato de que o
main(String[])
método é frequentemente usado como ponto de entrada pela JVM 1 . No entanto, isso não significa que omain
próprio token não possa ser usado como identificador 2 .As especificações dizem isso e as seguintes declarações também são válidas:
Um campo:
Uma variável local:
Um método:
Uma classe (embora um nome de classe que comece com minúsculas seja desencorajado):
Um pacote:
1: Conforme observado nos comentários, a própria especificação da JVM não exige nenhum método específico como ponto de entrada, mas a
java
ferramenta amplamente usada geralmente usa esse método como ponto de entrada.2: Eu geralmente evitaria criar um método principal diferente de
main(String[])
.fonte
main
não é o ponto de entrada para a JVM. É o ponto de entrada que ajava
ferramenta usa para executar aplicativos. Outras ferramentas (contêineres de servlet, por exemplo) usam outros pontos de entrada.java
ferramenta não requer ummain(String[])
método se a classe principal estender javafx.application.Application .Isso compila bem no Java 1.8 ...
... e quando executado produz a saída:
fonte
static main
método com parâmetros diferentes?package main;
!Joguei tudo o que pude e parece que funciona. Eu diria que main é um identificador válido.
fonte
public static void main(main...Main)
( faltando um espaço ) não pode funcionar, pode?Como
main
não pôde ser usado como identificador enquanto é usado como identificador para declarar o método "principal"?Para um idioma tão clássico:
main
não é uma palavra-chave e provavelmente nunca seria uma palavra-chave em Java por razões óbvias de compatibilidade retroativa.Sobre a pergunta, é
main
um bom identificador?Primeiro: válido para um compilador não significa necessariamente bom.
Por exemplo, a
java1234
opção proposta também é um identificador válido, mas que realmente deve ser evitado.main
tem um significado muito particular e importante: é usado como o método de ponto de entrada de classes e jarros executados pelajava
linha de comando.Usar
main
um nome de método que não preencha os critérios a serem usados pelajava
linha de comando seria enganoso, mas usá-lo como nome de variável ou nome de classe pode fazer sentido.Por exemplo, definir a classe que representa o ponto de entrada de um aplicativo como a
Main
classe do aplicativo é aceitável e, portanto, usá-lo também como nome de variável, como:De maneira geral, em Java, vários caracteres ou "palavras" são considerados identificadores válidos para o compilador, mas são fortemente desencorajados a serem usados no código do cliente (mas o código gerado pode fazer isso: classes aninhadas por exemplo) como não legíveis e / ou realmente enganoso.
Por exemplo, isso pode ser válido para o compilador:
Mas nós não queremos:
Object
nossa classe, conforme definido emjava.lang
(1).main()
se não preencher os critérios a serem usados pelajava
linha de comando (2).Object.toString()
método (3)._
,$
ou quaisquer caracteres surpreendentes / unmeaningful que vão contra as convenções de nomenclatura comum (4).fonte
main
poderia ser uma palavra-chave que só pode ser usada como um nome para um método estático com uma assinatura apropriada (ou qualquer outra coisa). Observe que as chamadas de superclasse usamsuper
de uma maneira que faz com que pareça um identificador:super(foo);
esuper.foo
, massuper
é uma palavra-chave (e antes da inclusão de genéricos, essa era a única maneira de usá-la (que eu me lembro)).main
como uma palavra-chave em uma nova versão do java, significa que qualquer código que use main como nome do método (ou qualquer nome de membro) não será mais compilado. O uso desuper
em genéricos não tem nenhum efeito colateral no código existente, pois os genéricos não existiam no momento.main
ainda é um identificador melhor do quejava1234
. Usá-lo para um método "regular" seria enganoso, mas não teria problemas em nomear uma variávelmain
, se ela for realmente a principal coisa no meu método.java1234
é simplesmente horrível, nomes deve ser descritivo ...main
olhada em uma variável chamada se a função que eu estava vendo fizesse algo com os dados principais da água. Eu ia vomitar se eu já vijava1234
no código de produção (e rezar não havia 1.233 outras variáveis com prefixojava
).É um identificador válido? Sim.
É um bom identificador? Não se você o estiver usando para algo diferente do método iniciado no lançamento da JVM.
Há outro identificador válido listado? Sim.
As instruções do teste disseram para escolher a melhor resposta?
fonte
main
é um identificador tolerável do que possojava1234
. Considere, por exemplo, uma base de código que trabalha com dados de fornecimento de água (rede de distribuição de água).main
é um identificador perfeitamente preciso em qualquer lugar fora do domínio restrito do aplicativo Java comum. Pode ser o nome de um campo em uma classe que representa um menu fixo. Ou uma<main>
seção de um documento em um construtor HTML.java1234
, por outro lado, é tão terrível quanto os identificadores.main
é perfeitamente válido porque, nos documentos :fonte
fonte
Esse professor cometeu um pequeno erro ao supor que main não é um identificador válido ou simplesmente colocar a pergunta errada. Ele possivelmente quis dizer "um bom identificador".
Mas ignorar os argumentos de seus filhos e, assim, desencorajar sua abordagem científica de verificar literatura relevante (especificação Java) e realizar um experimento (escrever um programa de amostra) é exatamente o oposto do que um professor deve fazer.
fonte
main
é muito mais frequentemente um identificador "bom" do quejava1234
seria. Então, mesmo lá, o professor está errado. ;)Ambos
main
ejava123
são identificadores válidos , main não é uma palavra-chave reservada, por isso é perfeitamente aceitável de usar; no que diz respeito ao teste, você deveria ter conseguido um ponto ou meio ponto pelo menos.fonte
Deve ser uma palavra. Ou seja, espaços não são permitidos.
Exemplo: o mangoprice é válido, mas o preço da manga não é válido.
Deve começar com uma letra (alfabeto) ou sublinhado ou $.
Exemplo: price, _price e $ price são identificadores válidos.
Não deve ser uma palavra-chave do Java, pois a palavra-chave carrega um significado especial para o compilador.
Exemplo: classe ou nulo etc.
Não deve começar com um dígito, mas o dígito pode estar no meio ou no final.
Exemplo: 5mangoescost não é válido e mango5cost e mangocost5 são válidos.
O comprimento de um identificador em Java pode ter 65.535 caracteres e todos são significativos. Identificadores diferenciam maiúsculas de minúsculas. Isso é manga e manga são tratadas de maneira diferente. Pode conter todas as letras maiúsculas ou minúsculas ou uma mistura.
IDENTIFICADOR : são nomes de classe, nomes de métodos, nomes de variáveis ...
Como main não é uma palavra reservada e, de acordo com a explicação acima para definir um identificador, main é um identificador válido e java1234 também. As opções restantes não são válidas devido à explicação acima.
fonte