传统 Java 语法
阅读 1997 年的 Java 代码约定文档,我在 P16 上关于变量命名约定的示例中看到了这一点:
int i;
char *cp;
float myWidth;
第二个声明很有趣 - 对我来说,它看起来很像你在C中声明指针的方式。在 Java 8 下编译时,它会给出语法错误。
只是出于好奇:这是有效的语法吗?如果是这样,这意味着什么?
阅读 1997 年的 Java 代码约定文档,我在 P16 上关于变量命名约定的示例中看到了这一点:
int i;
char *cp;
float myWidth;
第二个声明很有趣 - 对我来说,它看起来很像你在C中声明指针的方式。在 Java 8 下编译时,它会给出语法错误。
只是出于好奇:这是有效的语法吗?如果是这样,这意味着什么?
我想这是一个复制粘贴错误。
从 JLS 1(这真的不是那么容易找到!),关于局部变量声明的部分指出,这样的声明本质上是一个类型,后跟一个标识符。请注意,没有关于 的特别引用,但有关于(对于数组)的特殊引用。*
[]
char
是我们的类型,所以剩下的唯一可能性是它是一个标识符。“标识符”部分指出*cp
标识符是无限长度的 Java 字母和 Java 数字序列,其中第一个必须是 Java 字母。
...
Java 字母是字符.isJavaLetter (§20.5.17) 方法返回 true 的字符
该方法的 JavaDoc 指出:
当且仅当字符是字母 (§20.5.15) 或美元符号字符“$”() 或下划线(“低线”)字符“_”() 时,才被视为 Java 字母。
\u0024
\u005F
所以,很好,但从来没有有效。foo
_foo
$foo
*foo
如果你想要一个更新的Java风格指南,谷歌的风格指南可以说是最常被引用的。
这似乎是一个通用的编码样式文档,用于类似C语言,并添加了一些特定于Java的内容。例如,另请参阅下一页:
不要在容易与相等运算符混淆的地方使用赋值运算符。例:
if (c++ = d++) { // AVOID! Java disallows. … }
告诉程序员避免语法错误是没有意义的,所以我们能从中得出的唯一结论是,该文档不是100%特定于Java的。
另一种可能性是,它是整个Java系统的编码风格,包括JRE和JDK的C++部分。
请注意,Sun甚至在Oracle进入公司之前很久就放弃了编码风格文档。他们克制自己去指定语言是什么,而不是如何使用它。