Uno de mis hijos está tomando Java en la escuela secundaria y tuvo esto en una de sus pruebas:
¿Cuál de los siguientes es un identificador válido en Java?
a.
123java
si.main
C.java1234
re.{abce
mi.)whoot
Él respondió b y se equivocó.
Miré la pregunta y sostuve que main
es un identificador válido y que debería haber sido correcto.
Echamos un vistazo a la especificación Java para identificadores y reforzó ese punto. También escribimos un programa de muestra que tenía una variable llamada main
, así como un método. Creó una refutación escrita que incluía la referencia de documentación de Java, el programa de prueba y el maestro la ignoró y dice que la respuesta sigue siendo incorrecta.
¿Es main
un identificador válido?
java
language-lawyer
main
identifier
Gary Bak
fuente
fuente
Respuestas:
Esto compila, y cuando se ejecuta, emite esta salida:
La secuencia de caracteres
main
es un identificador, no una palabra clave o una palabra reservada.La sección relevante de la JLS es 3.8 :
La secuencia de caracteres se
main
ajusta a la descripción anterior y no está en la lista de palabras clave en la Sección 3.9 .(La secuencia de caracteres
java1234
también es un identificador, por las mismas razones).fuente
main
main
es un identificador válido de Java, y el maestro está equivocado.La documentación relevante está en la Especificación del lenguaje Java, aquí:
Capítulo 3. "Estructura léxica", sección 3.8. "Identificadores":
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
Dice:
Lo que significa que puede probar que es un identificador válido ya sea:
fuente
Como dicen las otras respuestas
main
es un identificador de Java válido , así comojava1234
.Supongo que lo confuso proviene del hecho de que
main(String[])
la JVM usa el método como punto de entrada 1 a . Sin embargo, eso no significa que el token enmain
sí mismo no pueda usarse como identificador 2 .Las especificaciones lo dicen, y las siguientes declaraciones también son válidas:
Un campo:
Una variable local:
Un método:
Una clase (aunque se desaconseja un nombre de clase que comience con minúsculas):
Un paquete:
1: Como se señaló en los comentarios, la especificación JVM en sí misma no exige ningún método en particular como punto de entrada, pero la
java
herramienta ampliamente utilizada a menudo usa dicho método como punto de entrada.2: generalmente evitaría crear un método principal que no sea
main(String[])
.fuente
main
no es el punto de entrada para la JVM. Es el punto de entrada que lajava
herramienta utiliza para ejecutar aplicaciones. Otras herramientas (contenedores de servlets, por ejemplo) usan otros puntos de entrada.java
herramienta no requiere unmain(String[])
método si la clase principal extiende javafx.application.Application .Esto compila bien en Java 1.8 ...
... y cuando se ejecuta produce la salida:
fuente
static main
método con diferentes parámetros?package main;
!Tiré todo lo que pude, y parece funcionar. Yo diría que main es un identificador válido.
fuente
public static void main(main...Main)
( falta un espacio ) no puede funcionar, ¿verdad?¿Cómo
main
no podría usarse como identificador mientras se usa como identificador para declarar el método "principal"?Para un idioma tan clásico:
main
no es una palabra clave y probablemente nunca sería una palabra clave en Java por obvias razones de compatibilidad retro.Sobre la pregunta, ¿es
main
un buen identificador?Primero: válido para un compilador no significa necesariamente bueno.
Por ejemplo, la
java1234
opción que se propone también es un identificador válido, pero eso realmente debería evitarse.main
tiene un significado muy particular e importante: se utiliza como método de punto de entrada de clases y jarras ejecutadas por lajava
línea de comando.Usar
main
un nombre de método que no cumpla con los criterios que usará lajava
línea de comando sería engañoso mientras lo usa como nombre de variable o un nombre de clase podría tener sentido.Por ejemplo, definir la clase que representa el punto de entrada de una aplicación como la
Main
clase de la aplicación es aceptable y usarla también como nombre de variable, como por ejemplo:De manera general, en Java, varios caracteres o "palabras" se consideran identificadores válidos para el compilador, pero se desaconseja su uso en el código del cliente (pero el código generado puede hacer eso: clases anidadas, por ejemplo) como no legibles y / o realmente engañoso.
Por ejemplo, esto podría ser válido para el compilador:
Pero no queremos:
Object
nuestra clase como se define enjava.lang
(1).main()
si no cumple los criterios que utilizará eljava
línea de comando (2).Object.toString()
método (3)._
,$
o cualquier personaje sorprendente / poco significativo que vaya en contra de las convenciones de nomenclatura compartidas (4).fuente
main
podría ser una palabra clave que solo se puede usar como nombre para un método estático con una firma apropiada (o lo que sea). Tenga en cuenta que las llamadas de superclase se usansuper
de una manera que lo hace ver como un identificador:super(foo);
ysuper.foo
, perosuper
ES una palabra clave (y antes de que se agregaran los genéricos, esta era la única forma de usarlo (que puedo recordar)).main
como una palabra clave en una nueva versión de Java, significa que cualquier código que use main como nombre de método (o cualquier nombre de miembro) ya no se compilará. El uso desuper
genéricos no tiene ningún efecto secundario en el código existente ya que los genéricos no existían en este momento.main
todavía es un mejor identificador quejava1234
. Usarlo para un método "regular" sería engañoso, pero no tendría ningún problema para nombrar una variablemain
, si en realidad es lo principal en mi método.java1234
es horrible, los nombres deben ser descriptivos ...main
si la función que estaba mirando hizo algo con los datos principales del agua. Vomitaría si alguna vez vierajava1234
en el código de producción (y rezara para que no hubiera 1233 otras variables con el prefijojava
).¿Es un identificador válido? Si.
¿Es un buen identificador? No, si lo está utilizando para otra cosa que no sea el método que comienza en el lanzamiento de JVM.
¿Hay otro identificador válido en la lista? Si.
¿Las instrucciones del examen decían elegir la mejor respuesta?
fuente
main
es un identificador tolerable de lo que puedo en lo quejava1234
sería. Considere, por ejemplo, una base de código que trabaje con datos de suministro de agua (red de agua).main
es un identificador perfectamente fino en cualquier lugar fuera del dominio estrecho de la aplicación Java simple. Podría ser el nombre de un campo en una clase que representa un menú fijo. O una<main>
sección de un documento en un generador de HTML.java1234
, por otro lado, es casi tan terrible como los identificadores.main
es perfectamente válido porque, desde los documentos :fuente
fuente
Ese maestro cometió un pequeño error al asumir que main no es un identificador válido o simplemente formular la pregunta incorrectamente. Posiblemente quiso decir "un buen identificador".
Pero ignorar los argumentos de sus hijos y, por lo tanto, desalentar su enfoque científico de verificar la literatura relevante (especificación Java) y realizar un experimento (escribir un programa de muestra) es exactamente lo contrario de lo que se supone que debe hacer un maestro.
fuente
main
es mucho más frecuente que un identificador "bueno" dejava1234
lo que sería. Entonces, incluso allí, el maestro está equivocado. ;)Ambos
main
yjava123
son identificadores válidos , main no es una palabra clave reservada, por lo que es perfectamente aceptable de usar, en lo que respecta a la prueba, debería haber obtenido un punto o medio punto como mínimo.fuente
Debería ser una sola palabra. Es decir, los espacios no están permitidos.
Ejemplo: el precio del mango es válido pero el precio del mango no es válido.
Debe comenzar con una letra (alfabeto) o guión bajo o símbolo $.
Ejemplo: price, _price y $ price son identificadores válidos.
No debe ser una palabra clave de Java, ya que la palabra clave tiene un significado especial para el compilador.
Ejemplo: clase o vacío, etc.
No debe comenzar con un dígito, pero el dígito puede estar en el medio o al final.
Ejemplo: 5mangoescost no es válido y mango5cost y mangocost5 son válidos.
La longitud de un identificador en Java puede ser de 65.535 caracteres y todos son significativos. Los identificadores distinguen entre mayúsculas y minúsculas. Es decir, tanto el mango como el mango se tratan de manera diferente. Puede contener todas las letras mayúsculas o minúsculas o una mezcla.
IDENTIFICADOR : son nombres de clases, nombres de métodos, nombres de variables ...
Como main no es una palabra reservada y de acuerdo con la explicación anterior para definir un identificador main es un identificador válido y java1234 también. Las opciones restantes no son válidas debido a la explicación anterior.
fuente