main是有效的Java标识符吗?

我的一个孩子在高中学习Java,他的一次考试是这样的:

下列哪个在Java中是有效的标识符?

< p >。123java < br / > b. main
c. java1234
d. {abce
e。)whoot < / p >

他答了b,答错了。

我看了这个问题,并认为main 是一个有效的标识符,它应该是正确的。

我们看了一下Java 规范中的标识符,它加强了这一点。我们还编写了一个示例程序,其中包含一个名为main的变量和一个方法。他写了一份书面反驳,包括Java文档参考,测试程序和老师忽略了它,说答案仍然是错误的。

main是有效的标识符吗?

18029 次浏览

main是一个有效的java标识符,而老师是错误的。

相关文档在Java语言规范中,就在这里:

第三章。词汇结构,第3.8节。“标识符”:

https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8

它说:

标识符是Java字母和Java数字的无限长度序列,其中第一个必须是Java字母…标识符不能与关键字(§3.9)、布尔字(§3.10.3)或空字(§3.10.7)具有相同的拼写(Unicode字符序列),否则会发生编译时错误。

这意味着你可以通过以下方法证明它是一个有效的标识符:

  • 在Java关键字列表中查找它(提示:您在那里找不到它!)或简单地通过
  • 使用它作为标识符,并观察是否发生编译时错误。

main完全有效,因为它,来自文档:

  1. 是“Java字母和Java数字的序列,其中第一个是Java字母”
  2. 不是关键字
  3. 不是布尔文字,即。“正确”或“错误”
  4. 不是空的文字
public class J {
public static void main(String[] args)
{
String main = "The character sequence \"main\" is an identifier, not a keyword or reserved word.";
System.out.println(main);
}
}

编译后执行,输出如下:

The character sequence "main" is an identifier, not a keyword or reserved word.

字符序列main是一个标识符,而不是关键字或保留字。

JLS的相关章节是3.8:

标识符是由Java的信Java的数字组成的无限长度序列,其中第一个必须是Java的信

标识符:

IdentifierChars,但不是关键字或BooleanLiteral或NullLiteral

IdentifierChars:

JavaLetter {JavaLetterOrDigit}

JavaLetter:

任何“Java字母”的Unicode字符;

JavaLetterOrDigit:

任何“Java字母或数字”的Unicode字符;

字符序列main符合上述描述,并且不在关键字列表中。

(出于同样的原因,字符序列java1234也是一个标识符。)

正如其他答案所说

main是一个有效的Java标识符,以及java1234

我猜这种困惑来自于main(String[])方法经常被JVM1用作入口点的事实。然而,这并不意味着令牌main本身不能用作标识符__abc3。

规范是这么说的,下面的声明也是有效的:

  • < p >字段:

    private int main;
    
  • 一个局部变量:

    String main = "";
    
  • < p >方法:

    void main() { ... }
    
  • 类或接口(尽管不鼓励类或接口名称以小写开头):

    class main { ... }
    
  • < p >一个包:

    package main;
    

< p > 1:正如评论中提到的,JVM规范本身并没有强制要求任何特定的方法作为入口点,但是广泛使用的java工具经常使用这样的方法作为入口点。
2:我通常会避免创建除main(String[])之外的主方法


我不觉得这是咆哮的地方,但这里是我的correct humble意见:标识符__ABC0和java1234一样有效,所以两者必须被同等对待有效或错误。否则是不能容忍的。 > < /晚餐

main被用作声明“main”方法的标识符时,它如何不能用作标识符?

对于这样一个经典的习语:

public class Foo{
public static void main(String[] args){
}
}

main不是关键字,而且由于明显的复古兼容性原因,它可能永远不会成为Java中的关键字。


关于这个问题,main是一个好的标识符吗?

首先:对编译器有效并不意味着一定是好的 例如,提出的java1234选项也是一个有效的标识符,但应该避免。< / p > main有一个非常特别和重要的含义:它被用作java命令行执行的类和jar的入口点方法 使用main作为不满足java命令行所使用的条件的方法名将只是误导,而使用它作为变量名或类名是有意义的 例如,将表示应用程序入口点的类定义为应用程序的Main类是可以接受的,因此也可以将其用作变量名,例如:

public class Main {


public static void main(String args[]){
Main main = new Main();
// ...
}


}

一般来说,在Java中,多个字符或“单词”被认为是编译器的有效标识符,但强烈不鼓励在客户端代码中使用(但生成的代码可能会这样做:例如嵌套类),因为它们不可读和/或真正具有误导性。

例如,这对于编译器来说是有效的:

public class Object { // 1
public void foo() {
...
}
}


public class BadChosenIdentifier {


public static void main() { // 2
new BadChosenIdentifier().toString(new Object());
}


public void toString(Object java1234) { // 3, 4
String _result$ = java1234 + " -> to avoid"; // 4
System.out.println(_result$);
}
}

但我们不想:

  • Object命名为我们的类,因为它在java.lang(1)中定义。
  • 如果不满足java命令行使用的条件,则命名方法main()(2)。
  • 重载Object.toString()方法(3)。
  • 使用_$或任何违背共享命名约定的令人惊讶/毫无意义的字符来命名变量(4)。
public class Main {
private static String main;
public static void main(String[] main) {
Main.main = main[0];
new Main().main(Main.main);
}
private void main(String main) {
System.out.println(main);
}
}

这在Java 1.8上编译很好…

public class main {


public String main = "main";


public void main(String main) {
System.out.println("This object is an instance of the class " + this.getClass().getCanonicalName());
System.out.println("The value of the argument \"main\" for this call to the method \"main(String main)\" is " + main);
System.out.println("The value of the field \"main\" is " + this.main);
}


public static void main(String[] args) {
main main = new main();
main.main(main.main + main.main);
}
}

...执行时产生输出:

This object is an instance of the class main
The value of the argument "main" for this call to the method "main(String main)" is mainmain
The value of the field "main" is main

它是一个有效的标识符吗?是的。

它是一个好的标识符吗?如果您将它用于JVM启动时启动的方法以外的任何事情,则不会。

是否列出了其他有效标识符?是的。

考试说明上说要选最佳答案了吗?

我用尽了一切办法,似乎奏效了。我认为main是一个有效的标识符。

package main;


public class main {


static main main;
String Main;


main(String main) {
Main = main;
}


main(main main) {
System.out.println(main.Main);
}


main main(main main) {
return new main(main);
}


public static void main(main...Main) {
main:
for (main main : Main) {
main = (main instanceof Main) ? new main(main): main.main(main);
break main;
}
}


public static void main(String[] args) {
main = new main("main");
main.main(main, main);
main = main.new Main(main) {
main main(main main) {
return ((Main)main).main();
}
};
main.main(main);
main.main(main,main);
}


abstract class Main extends main {
Main(main main) {
super("main");
}


main main() {
main.Main = "Main";
return main;
}
}
}

mainjava123都是有效的标识符,main不是保留关键字,所以使用它是完全可以接受的,就测试而言,你至少应该得到一分或半分。

那个老师犯了一个小错误,要么认为主要不是一个有效的标识符,要么只是回答问题的方式错误。他可能是想说“一个很好的标识符”。< br > 但是忽略你儿子的论点,从而阻碍他检查相关文献(Java规范)和执行实验(编写示例程序)的科学方法,这是教师应该做的完全相反的
  1. 应该是单个单词。也就是说空格是不允许的。

    例如:芒果价格无效,芒果价格无效。 < / p >

  2. 应以字母(字母表)或下划线或$符号开头。

    例如:price, _price和$price是有效的标识符。 < / p >

  3. 不应该是Java的关键字,因为关键字对编译器有特殊的意义。

    示例:class或void等。 < / p >

  4. 不应该以数字开头,但数字可以在中间或结尾。

    例如:5mangoescost无效,mango5cost和mangocost5有效。 < / p >

  5. Java中标识符的长度可以是65,535个字符,并且都是有效字符。 标识符区分大小写。那就是芒果和芒果都被区别对待。

标识符:它们是类名、方法名、变量名……

As main不是保留字,根据上面定义标识符的解释,Main是有效的标识符java1234也是。由于上述解释,其余选项无效。