main是一个有效的Java标识符



我的一个孩子在高中学习Java,在他的一次测试中得到了这个:

以下哪项是Java中的有效标识符?

a。123java
b。main
c。java1234
d。{abce
e。)whoot

他答错了b

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

我们查看了Java的标识符规范,它强化了这一点。我们还编写了一个示例程序,该程序有一个名为main的变量和一个方法。他创建了一份书面反驳,其中包括Java文档参考、测试程序,而老师忽略了它,并表示答案仍然不正确。

main是有效的标识符吗?

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但不是Keyword或BooleanLiteral或NullLiteral

标识符字符:

JavaLetter{JavaLetterOrDigit}

JavaLetter:

任何Unicode字符;Java字母";

Java字母或数字:

任何Unicode字符;Java字母或数字";

字符序列main符合上述描述,不在第3.9节的关键字列表中。

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

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

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

第3章。"词汇结构",第3.8节。"标识符":

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

上面写着:

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

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

  • 在java关键字列表中查找它(提示:在那里找不到它!)
  • 使用它作为标识符,并观察到没有发生编译时错误

当其他答案处于状态时

mainjava1234都是有效的Java标识符

我想令人困惑的原因是main(String[])方法经常被JVM用作入口点1。然而,这并不意味着令牌main本身不能用作标识符2

规范是这样说的,以下声明也是有效的:

  • 字段:

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

    String main = "";
    
  • 一种方法:

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

    class main { ... }
    
  • 包装:

    package main;
    

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


附录:我觉得这里不是咆哮的地方,但这是我的正确谦逊观点:标识符mainjava1234一样有效,因此必须将两者视为同等有效或错误。否则是不能容忍的

这在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

我尽我所能,它似乎起了作用。我认为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;
}
}
}

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

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

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

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


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

第一:对编译器有效并不意味着一定好
例如,建议的java1234选项也是一个有效的标识符,但确实应该避免。

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)中定义
  • 如果没有填写要由CCD_ 33命令行使用的标准,则将方法命名为CCD_
  • 以使CCD_ 34方法(3)过载
  • _$或任何违反共享命名约定的令人惊讶/毫无意义的字符来命名我们的变量(4)

它是有效的标识符吗?对

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

是否列出了另一个有效的标识符?对

测试说明上有没有说要选择最佳答案

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

  1. 是一个"Java字母和Java数字的序列,其中第一个是Java字母">
  2. 不是关键字
  3. 不是布尔文字,即"true"或"false">
  4. 不是null文字
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);
}
}

那个老师犯了一个小错误,要么认为main不是有效的标识符,要么只是把问题用错了措辞。他可能是想说"一个好的标识符">
但是,忽视你儿子的论点,从而阻碍他检查相关文献(Java规范)和进行实验(编写示例程序)的科学方法,这与老师应该做的恰恰相反

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

  1. 应该是一个单词。也就是说,空格是不允许的。

    示例:芒果价格有效,但芒果价格无效

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

    示例:price、_price和$price是有效的标识符

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

    示例:class或void等

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

    示例:5mangoecost无效,mango5cost和mangocost 5有效

  5. Java中标识符的长度可以是65535个字符,并且所有字符都是有效的。标识符区分大小写。这就是芒果和芒果的区别对待。可以包含所有大写字母、小写字母或混合字母。

IDENTIFIER:它们是类名、方法名、变量名。。。

由于main不是一个保留字,并且根据上面定义标识符的解释,main是一个有效的标识符java1234。由于上述原因,其余选项无效。

相关内容

  • 没有找到相关文章

最新更新