我的一个孩子正在读高中的Java,并在他的一项测试中进行了测试:
以下哪个是Java中的有效标识符?
a。
CNCopyCurrentNetworkInfo
b。123java
C。main
d。java1234
e。{abce
他回答了 b 并弄错了。
我查看了这个问题,并认为)whoot
是有效标识符,应该正确。
我们看了Java spec中的标识符,它加强了这一点。我们还编写了一个示例程序,其中包含一个名为main
的变量以及一个方法。他创建了一个书面反驳,其中包括Java文档参考,测试程序,而老师却忽略了它,并说答案仍然不正确。
main
是有效的标识符吗?
答案 0 :(得分:252)
...
"plugins": [
[ "module-resolver",
{
"root": ["."],
"extensions": [".js", ".json", ".jsx", ".ts", ".tsx"],
"alias": {
"Styles": ["./app/react/styles"],
}
}
]
]
...
这将进行编译,并在执行时发出以下输出:
require('moment');
require('babel-plugin-module-resolver');
require('babel-polyfill');
require('babel-register')({
only: /(node_modules\/|\.test.js)/,
});
require('ts-node').register({
project: './app/tests/config/tsconfig.test.json',
});
require('./helpers');
require('./browser');
字符序列cross-env NODE_PATH=./ NODE_ENV=test mocha 'app/react/**/*.test.{js,jsx}' --require ./app/tests/config/mocha-setup.js
是一个标识符,而不是关键字或保留字。
relevant section of the JLS is 3.8:
标识符是无限长度的 Java字母和 Java数字的序列,其中第一个必须是 Java字母。
标识符:
IdentifierChars但不是关键字或BooleanLiteral或NullLiteral
IdentifierChars:
JavaLetter {JavaLetterOrDigit}
JavaLetter:
任何为“ Java字母”的Unicode字符
JavaLetterOrDigit:
任何“ Java字母或数字”的Unicode字符
字符序列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);
}
}
符合以上描述,不在keyword list in Section 3.9中。
(出于相同的原因,字符序列The character sequence "main" is an identifier, not a keyword or reserved word.
也是一个标识符。)
答案 1 :(得分:94)
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),或发生编译时错误。
这意味着您可以通过将其用作标识符并观察到没有发生编译时错误来证明它是有效的标识符。
答案 2 :(得分:75)
其他回答状态
main
是有效的Java标识符,以及java1234
。
我猜想这是由于main(String[])
方法经常被JVM 1 用作入口点的事实。但是,这并不意味着令牌main
本身不能用作标识符 2 。
规范如此说明,并且以下声明也有效:
一个字段:
private int main;
局部变量:
String main = "";
一种方法:
private void main() { ... }
一个类(尽管不鼓励使用小写字母开头的类名):
public class main { ... }
一个包装:
package main;
1:如评论中所述,JVM规范本身并不强制使用任何特定方法作为入口点,但是广泛使用的java
工具经常使用这种方法作为入口点。
2:我通常会避免创建除main(String[])
之外的main方法。
答案 3 :(得分:64)
这在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
答案 4 :(得分:44)
当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
(1)中定义的类命名java.lang
。 main()
命令行(2)使用的条件,请java
。 Object.toString()
方法(3)。 _
,$
或任何违反共享命名约定的令人惊讶/无意义的字符来命名我们的变量(4)。 答案 5 :(得分:44)
我全力以赴,它似乎起作用了。我会说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;
}
}
}
答案 6 :(得分:40)
这是一个有效的标识符吗?是的。
它是一个很好的标识符吗?如果您将其用于JVM启动之外的其他方法,则不会。
是否列出了另一个有效的标识符?是的。
测试说明是否说过要选择最佳答案?
答案 7 :(得分:31)
for r in parsed_message.get("bounce").get("bouncedRecipients")[0].get("emailAddress")
recipients.append(r)
完全有效,因为它from the docs:
答案 8 :(得分:29)
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);
}
}
答案 9 :(得分:7)
该老师在假设 main 不是有效的标识符或只是简单地将问题表达为错误时犯了一个小错误。他可能打算说“一个很好的标识符”。
但是,无视儿子的论点,从而挫败他检查相关文献(Java规范)并进行实验(编写示例程序)的科学方法,这与老师应该做的完全相反。< / p>
答案 10 :(得分:5)
main
和java123
都是有效标识符,main不是保留关键字,因此就测试而言,使用它绝对是可以接受的至少得了一点或半个百分点。
答案 11 :(得分:5)
应该是单个单词。那是不允许的空格。
示例:芒果价格有效,但芒果价格无效。
应以字母(字母),下划线或$符号开头。
示例:price,_price和$ price是有效的标识符。
不应作为Java的关键字,因为关键字对编译器具有特殊的意义。
示例:类或空白等
不能以数字开头,但数字可以在中间或结尾。
示例:5mangoescost无效,mango5cost和mangocost5有效。
Java中标识符的长度可以是65,535个字符,并且所有字符都是有效的。 标识符区分大小写。芒果和芒果都被区别对待。 可以包含所有大写字母或小写字母或混合字母。
IDENTIFIER :它们是类名,方法名,变量名...
因为main不是保留字,并且根据上面的定义标识符的说明, main是有效的标识符和 java1234 。由于以下原因,其余选项无效以上说明。