重新学习Java语言(一)--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;
            }
        }
    }
}              //假设传参获得的实例是 CharacterData00 的 那么接下来就有

    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》
   


相关文章
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
545 1
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
301 1
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
941 0
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
678 18
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
1089 8
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
582 4
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
218 5
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
305 5
|
Java C++ Python
Java 的关键字 final 和 static
Java 中最经典 final 修饰的类就是 String 了,它无法被任何类继承,不仅仅是为了保证 String 的不变性,同时在早期的 Java 版本中会将 final 修饰的方法转化为内嵌调用,提高程序性能(后来的 Java 会自动进行优化,不需要显式地用 final 修饰)。不过要注意的一点是,final 修饰的引用变量,其指向的对象的内容是可以被改变的。final 修饰符可以用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
486 0
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
1254 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!