内容简介:重新学习Java语言(一)--Java语言的标识符和关键字
一、标识符
1、 什么是标识符?
Java语言中,对于变量, 常量 ,函数,语句块也有名字,我们统统称之为 Java 标识符.
标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
2、 标识符的构成
标识符是没有长度限制的由Java字母和数字构成的序列,其中首字母必须是Java字母
"Java字母" 是作为参数调用Character.isJavaIdentifierStart(int)方法时返回true的字符
"Java字母或数字" 是作为参数调用 Character.isJavaIdentifierPart(int)方法时返回true的字符
"Java字母"包括大写和小写的ASCII拉丁字母A~Z ( \u0041 ~ \u005a )和 a~z (\u0061 ~ \u007a ),并且由于历史原因还包括下划线 (_ 或 \u005f)
和美元符号( $ 或 \u0024 )。$符号应该仅出现在机器生成的源代码中,或者用于另一种函件的情况,即访问遗留系统中已有的名字。
"Java数字"包括ASCII数字0~9(\u0030 ~ \u0039)
例子:
package com.yy.test; /** * Created by anyang on 2018/1/4. */ public class Class_2018_01_04_01 { public static void 挖到(){ System.out.println("我是汉字"); } public static void Á(){ //注意:这是两个字符,是希腊字母A和一个无空格上提号 复制下来退格就能清楚的看到了(非空格标记) System.out.println("我是字母A和无空格间隙的上提号组合"); } public static void Á(){ System.out.println("我是希腊字母"); } public enum test{ 我是DJ, 我不是DJ, 我到底是不是DJ } public static void main(String[] args) { 挖到(); System.out.println(Character.isJavaIdentifierPart(97)); System.out.println("代码点值是: "+(int)'_'); } }
如上例,看似完全相同的 Á和 Á 却有着天壤之别。
3、 使用标识符应该注意
标识符的拼写不能与关键字、布尔字面常量、空字面常量或编译时发生的错误的拼写相同
两个标识符只有在拼写完全相同,即每个对应的Unicode字母或者数字都相同的时候才会被认为是相同的标识符。具有相同外观的标识符仍旧有可能是不同的。
二、关键字
1、关键字都有哪些
Java保留了50个关键字,他们都是由ASCII字母构成的字符序列,并且不能当做标识符使用,他们包括:
abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
2、其他注意事项
尽管现在已经不再使用关键字const和goto了,但仍旧保留了。这使得当这些C++关键字在程序中使用不当时,Java编译器能够产生更有用的错误消息
尽管true和false看起来应该被当做关键字,但从技术上讲,他们仅仅只是布尔字面常量。与此类似null看起来也应该被当做关键字,但他也仅仅只是空字面常量。
三、关于 Character.isJavaIdentifierPart(int)
/** * Determines if the character (Unicode code point) may be part of a Java * identifier as other than the first character. * <p> * A character may be part of a Java identifier if any of the following * are true: * <ul> * <li> it is a letter 字母组合(单词) * <li> it is a currency symbol (such as {@code '$'}) 货币符号如:美元符号 * <li> it is a connecting punctuation character (such as {@code '_'}) 连接标点字符如:下划线 * <li> it is a digit 数字 * <li> it is a numeric letter (such as a Roman numeral character) 数字字母如:罗马数字等 * <li> it is a combining mark 结合字符(举例说明) * <li> it is a non-spacing mark 非空格标记(举例说明) * <li> {@link #isIdentifierIgnorable(int) * isIdentifierIgnorable(codePoint)} returns {@code true} for * the character * </ul> * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character may be part of a * Java identifier; {@code false} otherwise. * @see Character#isIdentifierIgnorable(int) * @see Character#isJavaIdentifierStart(int) * @see Character#isLetterOrDigit(int) * @see Character#isUnicodeIdentifierPart(int) * @see javax.lang.model.SourceVersion#isIdentifier(CharSequence) * @since 1.5 */ public static boolean isJavaIdentifierPart(int codePoint) { return CharacterData.of(codePoint).isJavaIdentifierPart(codePoint); }
package java.lang; abstract class CharacterData { abstract int getProperties(int ch); abstract int getType(int ch); abstract boolean isWhitespace(int ch); abstract boolean isMirrored(int ch); abstract boolean isJavaIdentifierStart(int ch); abstract boolean isJavaIdentifierPart(int ch); abstract boolean isUnicodeIdentifierStart(int ch); abstract boolean isUnicodeIdentifierPart(int ch); abstract boolean isIdentifierIgnorable(int ch); abstract int toLowerCase(int ch); abstract int toUpperCase(int ch); abstract int toTitleCase(int ch); abstract int digit(int ch, int radix); abstract int getNumericValue(int ch); abstract byte getDirectionality(int ch); //need to implement for JSR204 int toUpperCaseEx(int ch) { return toUpperCase(ch); } char[] toUpperCaseCharArray(int ch) { return null; } boolean isOtherLowercase(int ch) { return false; } boolean isOtherUppercase(int ch) { return false; } boolean isOtherAlphabetic(int ch) { return false; } boolean isIdeographic(int ch) { return false; } // Character <= 0xff (basic latin) is handled by internal fast-path // to avoid initializing large tables. // Note: performance of this "fast-path" code may be sub-optimal // in negative cases for some accessors due to complicated ranges. // Should revisit after optimization of table initialization. static final CharacterData of(int ch) { if (ch >>> 8 == 0) { // fast-path return CharacterDataLatin1.instance; } else { switch(ch >>> 16) { //plane 00-16 case(0): return CharacterData00.instance; case(1): return CharacterData01.instance; case(2): return CharacterData02.instance; case(14): return CharacterData0E.instance; case(15): // Private Use case(16): // Private Use return CharacterDataPrivateUse.instance; default: return CharacterDataUndefined.instance; } } } } //假设传参获得的实例是
boolean isJavaIdentifierPart(int ch) { int props = getProperties(ch); return ((props & 0x00003000) != 0); } int getProperties(int ch) { char offset = (char)ch; int props = A[Y[X[offset>>5]|((offset>>1)&0xF)]|(offset&0x1)]; return props; }参考资料:http://blog.csdn.net/mazhimazh/article/details/17708001
https://www.zhihu.com/question/20552606
https://baike.baidu.com/item/java%E6%A0%87%E8%AF%86%E7%AC%A6/11010420?fr=aladdin
http://utf8.supfree.net/
说明:本文大部分引用自《Java语言规范-基于Java SE 8》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ORA-12154: TNS: 无法解析指定的连接标识符解决
- Mozilla 发起请愿书,希望 Apple 每月重置用户广告标识符
- Python-Iocextract:高级入侵威胁标识符IoC提取工具
- 乐字节Java变量与数据结构之一:Java编程规范、关键字和标识符
- Oracle报存储过程中调用DBLink同义词出现错误:PLS-00201: 必须声明标识符
- 编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
XML、JSON 在线转换
在线XML、JSON转换工具
XML 在线格式化
在线 XML 格式化压缩工具