a;#x27;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Character&l;/span&g; &l;span class=\&q;variable\&q;&g;c_3&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; (&l;span class=\&q;string\&q;&g;&a;#x27;简&a;#x27;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c_1.compareTo(&l;span class=\&q;string\&q;&g;&a;#x27;D&a;#x27;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// -3&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c_2.charValue()); &l;span class=\&q;comment\&q;&g;// l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c_3.isLetter(&l;span class=\&q;string\&q;&g;&a;#x27;简&a;#x27;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// true&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;常用方法:&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public char charValue() &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回 Character 对象所包含的 char值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public int compareTo(Character anotherChar) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;比较两个字符对象。如果该字符对象与参数字符对象相等,返回0;若小于参数字符,返回值小于0;若大于参数字符,则返回值大于0。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isDigit(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是数字。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isLetter(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是字母。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isLowerCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是小写字母。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isUpperCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是大写字母。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isWhiteSpace(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是空白字符。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static char toLowerCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数字符转换为小写字母返回。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static char toUpperCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数字符转换为大写字母返回。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isJavaIdentifierStart(char ch) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否允许作为 Java标识符的开头字符。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isJavaldentifierPart (char ch) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否允许作为 Java标识符的中间字符。&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;h3 id=\&q;boolean\&q;&g;Boolean&l;a title=\&q;#boolean\&q; href=\&q;#boolean\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;常用方法:&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Boolean(boolean value)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;用一个boolean型值创建一个Boolean对象。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Boolean(String s)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;用一个字符串创建Boolean对象。如果字符串 s不为 null 且其值为 “true”(不区分大小写)就创建一个true值,否则创建一个 false值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public boolean booleanValue()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回该Boolean 对象所封装的 boolean值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean parseBoolean(String s)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数s解析为一个 boolean 值。如果参数不为 null 且等于 “true”(不区分大小写),则返回true, 否则返回 false。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static Boolean valueOf(boolean b)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数b 的值转换为 Boolean 对象。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static Boolean valueOf(String s)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数s 的值转换为 Boolean对象。&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;boolean&l;/span&g; &l;span class=\&q;variable\&q;&g;b&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;literal\&q;&g;false&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Boolean&l;/span&g; &l;span class=\&q;variable\&q;&g;b_1&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;Boolean&l;/span&g;(b); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Boolean&l;/span&g; &l;span class=\&q;variable\&q;&g;b_2&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;Boolean&l;/span&g;(&l;span class=\&q;string\&q;&g;&a;quot;TruE&a;quot;&l;/span&g;); &l;span class=\&q;comment\&q;&g;// true , 这两个方法已经不支持, 将要移除&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(b_1);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(b_2);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(b_1.booleanValue()); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Boolean.parseBoolean(&l;span class=\&q;string\&q;&g;&a;quot;True&a;quot;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// true&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Boolean.valueOf(b).booleanValue()); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Boolean.valueOf(&l;span class=\&q;string\&q;&g;&a;quot;OK&a;quot;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;数值类对象\&q;&g;数值类对象&l;a title=\&q;#数值类对象\&q; href=\&q;#数值类对象\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;常用方法:&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Integer(int value) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;使用 int类型的值创建包装类型 Integer对象。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Integer(String s) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;使用字符串构造Integer对象,如果字符串不能转换成相应的数值,则抛出NumberFormatException异常&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static String toBinaryString(int i)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i用字符串表示的二进制序列。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static String toHexString(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i用字符串表示的十六进制序列。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static String toOctalString(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数 i用字符串表示的八进制序列。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int highestOneBit(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i的二进制补码的最高位1所表示的十进制数,如7(111)的最高位的1表示的值为4。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int lowestOneBit(int i)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数 i的二进制补码的最低位1所表示的十进制数,如10(1010)的最低位的1表示的值为2。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int reverse(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回将整数i的二进制序列反转后的整数值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int signum(inti)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i的符号。若 i大于0,返回1;若 i等于0,&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;返回0,若 i小于0则返回-1。&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;p&g;每种包装类型都覆盖了toString()方法和 equals()方法,因此使用 equals()方法比较包装类型的对象时是比较内容或所包装值.每种包装类型的对象中所包装的值是不可改变的,要改变对象中的值必须重新生成新的对象.&l;/p&g;\n&l;p&g;每个数值包装类都定义了 &l;code&g;SIZE、BYTES、MAX_VALUE、MIN_VALUE &l;/code&g;常量。&l;br&g;\nSIZE 表示每种类型的数据所占的位数&l;br&g;\nBYTES 表示数据所占的字节数&l;br&g;\nMAX_VALUE 表示对应基本类型数据的最大值.&l;br&g;\n对于Byte、Short、Integer和Long 来说,MIN_VALUE 表示类型的最小值。对 Float和 Double 来说,MIN_VALUE 最小正值。&l;br&g;\n除了上面的常量外,在 Float 和 Double 类中还分别定义了 POSITIVE_INFINITY、NEGATIVE INFINITY、NaN(not a number), 它们分别表示正、负无穷大和非数值。&l;/p&g;\n&l;h3 id=\&q;自动装箱与自动拆箱\&q;&g;自动装箱与自动拆箱&l;a title=\&q;#自动装箱与自动拆箱\&q; href=\&q;#自动装箱与自动拆箱\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;Java 5 版提供了一种新的功能,称为自动装箱和自动拆箱。自动装箱 (autoboxing) 是指基本类型的数据可以自动转换为包装类的实例,自动拆箱 (unboxing) 是指包装类的实例自动转换为基本类型的数据。&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Integer&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;300&l;/span&g;; &l;span class=\&q;comment\&q;&g;// auto boxing&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;i_1&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; i; &l;span class=\&q;comment\&q;&g;// auto unboxing&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(((Integer)i_1).toString()); &l;span class=\&q;comment\&q;&g;// 强制转换&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;字符串与基本数据类型转化\&q;&g;字符串与基本数据类型转化&l;a title=\&q;#字符串与基本数据类型转化\&q; href=\&q;#字符串与基本数据类型转化\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;&l;code&g;public static Type parse&a;#123;Type&a;#125;(String s)&l;/code&g;&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;s&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;String&l;/span&g;(&l;span class=\&q;string\&q;&g;&a;quot;123&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Integer.parseInt(s)); &l;span class=\&q;comment\&q;&g;// 字符串转基本类型&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Double.parseDouble(s));&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;100&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(String.valueOf(i) &l;span class=\&q;keyword\&q;&g;instanceof&l;/span&g; String); &l;span class=\&q;comment\&q;&g;// 基本类型转字符串&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(((Integer)i).toString()); &l;span class=\&q;comment\&q;&g;// 或者通过包装类的toString()方法&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;biginteger-bigdecimal\&q;&g;BigInteger BigDecimal&l;a title=\&q;#biginteger-bigdecimal\&q; href=\&q;#biginteger-bigdecimal\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;如果在计算中需要非常大的整数或非常高精度的浮点数,可以使用java.math 包中定义的BigInteger类和 BigDecimal类。这两个类都扩展了Number类并实现了Comparable 接口,它们的实例都是不可变的.&l;/p&g;\n&l;p&g;&l;a href=\&q;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigInteger.html\&q; target=\&q;_blank\&q;&g;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigInteger.html&l;/a&g;&l;/p&g;\n&l;h2 id=\&q;时间日期api\&q;&g;时间日期API&l;a title=\&q;#时间日期api\&q; href=\&q;#时间日期api\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;java.time&l;br&g;\n&l;a href=\&q;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/time/package-summary.html\&q; target=\&q;_blank\&q;&g;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/time/package-summary.html&l;/a&g;&l;/p&g;\n&l;h2 id=\&q;内部类\&q;&g;内部类&l;a title=\&q;#内部类\&q; href=\&q;#内部类\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;Java 语言允许在一个类的内部定义另一个类(接口、枚举或注解),这种类称为内部类 (inner class)或嵌套类 (nested class)&l;br&g;\n使用内部类的优点:对只在一处使用的类进行分组;提高封装性;增强代码的可读性和可维护性。&l;br&g;\n有多种类型的内部类,大致可分为&l;code&g;成员内部类、局部内部类、匿名内部类和静态内部类&l;/code&g;。&l;/p&g;\n&l;h3 id=\&q;内部成员类\&q;&g;内部成员类&l;a title=\&q;#内部成员类\&q; href=\&q;#内部成员类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;成员内部类没有用 static修饰且定义在外层类的类体中&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g; &a;#123; &l;span class=\&q;comment\&q;&g;// 内部类相当于成员, 可以访问外部内所有成员&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;y&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;title function_\&q;&g;add&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; x + y;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;2&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;OuterClass&l;/span&g; &l;span class=\&q;variable\&q;&g;o&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; OuterClass.&l;span class=\&q;type\&q;&g;InnerClass&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; o.&l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;(); &l;span class=\&q;comment\&q;&g;// 创建内部类&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; OuterClass.&l;span class=\&q;type\&q;&g;InnerClass&l;/span&g; &l;span class=\&q;variable\&q;&g;ii&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;().&l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;(); &l;span class=\&q;comment\&q;&g;// 或者&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(ii.add()); &l;span class=\&q;comment\&q;&g;// 3&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;使用成员内部类时需要注意下面几个问题:&l;/p&g;\n&l;ol&g;\n&l;li&g;成员内部类中不能定义 static变量和 static方法。&l;/li&g;\n&l;li&g;成员内部类也可以使用 abstract和 final修饰,其含义与其他类一样。&l;/li&g;\n&l;li&g;成员内部类还可以使用 private、public、protected或包可访问修饰符。&l;/li&g;\n&l;/ol&g;\n&l;h3 id=\&q;局部内部类\&q;&g;局部内部类&l;a title=\&q;#局部内部类\&q; href=\&q;#局部内部类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;可以在方法体或语句块内定义类。在方法体或语句块 (包括方法、构造方法、局部块、初始化块或静态初始化块)内部定义的类称为局部内部类 (local inner class)&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;makeInner&l;/span&g;&l;span class=\&q;params\&q;&g;(&l;span class=\&q;type\&q;&g;int&l;/span&g; p)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;s&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;string\&q;&g;&a;quot;local_variable&a;quot;&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;seekOuter&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(x);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(s);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(p);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125; &l;span class=\&q;comment\&q;&g;// 此局部类只在这个函数中有效&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;().seekOuter(); &l;span class=\&q;comment\&q;&g;// 创建对象调用方法&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;OuterClass&l;/span&g; &l;span class=\&q;variable\&q;&g;o&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; o.makeInner(&l;span class=\&q;number\&q;&g;2&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;//1&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;//local_variable&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;//2&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;匿名内部类\&q;&g;匿名内部类&l;a title=\&q;#匿名内部类\&q; href=\&q;#匿名内部类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;定义类最终目的是创建一个类的实例,但如果某个类的实例只使用一次,可以将类的定义和实例的创建在一起完成,或者说在定义类的同时就创建一个实例。以这种方式定义的没有名字的类称为匿名内部类 (anonymous inner class)。&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;abstract&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Person&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;name&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;string\&q;&g;&a;quot;slacr&a;quot;&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;abstract&l;/span&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; String &l;span class=\&q;title function_\&q;&g;work&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// 匿名对象继承 Person, 初始化同时定义&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Person&l;/span&g; &l;span class=\&q;variable\&q;&g;hero&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;Person&l;/span&g;()&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;meta\&q;&g;@Override&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; String &l;span class=\&q;title function_\&q;&g;work&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; &l;span class=\&q;string\&q;&g;&a;quot;punish evil-doers&a;quot;&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;Hero &a;quot;&l;/span&g; + hero.name + &l;span class=\&q;string\&q;&g;&a;quot;, I will &a;quot;&l;/span&g; + hero.work());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// Hero slacr, I will punish evil-doers&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;匿名内部类可以继承一个类或实现一个接口, 如果实现一个接口,该类是Object类的直接子类。匿名类继承一个类或&l;br&g;\n实现一个接口不需要使用 extends 或 implements 关键字。匿名内部类不能同时继承一个类和实现一个接口,也不能实现多个接口&l;br&g;\n匿名内部类的一个重要应用是编写 JavaFX 图形界面的事件处理程序。如为按钮对象button 注册事件处理器,就可以使用匿名内部类。&l;/p&g;\n&l;h3 id=\&q;静态内部类\&q;&g;静态内部类&l;a title=\&q;#静态内部类\&q; href=\&q;#静态内部类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;静态内部类使用 static修饰,静态内部类也称嵌套类 (nested class)&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;outer&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(&l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;().getClass().getSimpleName());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;y&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;2&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;test&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; outer();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(x); &l;span class=\&q;comment\&q;&g;// 可以访问外部静态成员方法和变量&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(y);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; OuterClass.&l;span class=\&q;type\&q;&g;InnerClass&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;.InnerClass();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// 不需要外层实例就可以直接创建一个静态内部实例&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; i.test();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;枚举类型\&q;&g;枚举类型&l;a title=\&q;#枚举类型\&q; href=\&q;#枚举类型\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;枚举类型是一种特殊的引用类型,它的声明和使用与类和接口有类似的地方。它可以作为顶层的类型声明,也可以像内部类一样在其他类的内部声明,但不能在方法内部声明枚举。&l;/p&g;\n&l;p&g;任何枚举类型都隐含地继承了java.lang.Enum抽象类,Enum类又是Object类的子类,同时实现了 Comparable 接口和 Serializable接口。每个枚举类型都包含了若干方法,下面是一些常用的&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static E[] values()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回一个包含所有枚举常量的数组,这些枚举常量在数组中是按照它们的声明顺序存储的。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static E valueOf(String name)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回指定名字的枚举常量。如果这个名字与任何一个枚举常量的名字都不能精确匹配,将抛出 IlegalArgumentException 异常。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final int compareTo(Eo)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回当前枚举对象与参数枚举对象的比较结果。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final Class&a;lt;E&a;gt; getDeclaringClass()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回对应该枚举常量的枚举类型的类对象。两个枚举常量 el、e2, 当且仅当 el.getDeclaringClass() == e2.getDeclaringClass()时,这两个枚举常量类型相同。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final String name()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回枚举常量名。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final int ordinal()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回枚举常量的顺序值,该值是基于常量声明的顺序的,第一个常量的顺序值是0,第二个常量的顺序值为1,依次类推。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public String toString()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回枚举常量名。&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Direction&l;/span&g; &l;span class=\&q;variable\&q;&g;left&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; Direction.W;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(left);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;for&l;/span&g; ( Direction d : Direction.values()) &a;#123; &l;span class=\&q;comment\&q;&g;// values() 是一个包含枚举常量的数组&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(d.name() + &l;span class=\&q;string\&q;&g;&a;quot; &a;quot;&l;/span&g; + d.ordinal());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// enum 配合 Switch&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Direction&l;/span&g; &l;span class=\&q;variable\&q;&g;d&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; Direction.values()[(&l;span class=\&q;type\&q;&g;int&l;/span&g;)(Math.random()*&l;span class=\&q;number\&q;&g;4&l;/span&g;)];&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;switch&l;/span&g; (d) &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; E -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;EAST&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; S -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;SOUTH&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; W -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;WEST&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; N -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;NORTH&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;default&l;/span&g; -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;error&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;23&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;24&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;25&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;26&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;27&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;enum&l;/span&g; &l;span class=\&q;title class_\&q;&g;Color&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; R(&l;span class=\&q;string\&q;&g;&a;quot;RED&a;quot;&l;/span&g;, &l;span class=\&q;number\&q;&g;1&l;/span&g;), G(&l;span class=\&q;string\&q;&g;&a;quot;GREEN&a;quot;&l;/span&g;, &l;span class=\&q;number\&q;&g;2&l;/span&g;) , B(&l;span class=\&q;string\&q;&g;&a;quot;BLUE&a;quot;&l;/span&g;, &l;span class=\&q;number\&q;&g;3&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; String name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; idx;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;title function_\&q;&g;Color&l;/span&g;&l;span class=\&q;params\&q;&g;(String name, &l;span class=\&q;type\&q;&g;int&l;/span&g; idx)&l;/span&g; &a;#123; &l;span class=\&q;comment\&q;&g;// 构造方法只能 private, 通过枚举具体的类型创建&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;built_in\&q;&g;this&l;/span&g;.name = name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;built_in\&q;&g;this&l;/span&g;.idx = idx;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; String &l;span class=\&q;title function_\&q;&g;getName&l;/span&g;&l;span class=\&q;params\&q;&g;(&l;span class=\&q;type\&q;&g;int&l;/span&g; idx)&l;/span&g; &a;#123; &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;for&l;/span&g; (Color c : Color.values())&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g;(c.idx ==idx ) &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; c.name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; &l;span class=\&q;literal\&q;&g;null&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;meta\&q;&g;@Override&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; String &l;span class=\&q;title function_\&q;&g;toString&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; idx + &l;span class=\&q;string\&q;&g;&a;quot; &a;quot;&l;/span&g; + name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Color&l;/span&g; &l;span class=\&q;variable\&q;&g;c&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; Color.G; &l;span class=\&q;comment\&q;&g;// 自动调用构造&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c.toString());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;注解类型\&q;&g;注解类型&l;a title=\&q;#注解类型\&q; href=\&q;#注解类型\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;注解类型 (annotation type) 是 Java 5 新增的功能。注解以结构化的方式为程序元素提供信息,这些信息能够被外部工具(编译器、解释器等)自动处理.&l;br&g;\n注解有许多用途,其中包括:&l;/p&g;\n&l;ol&g;\n&l;li&g;为编译器提供信息。编译器可以使用注解检测错误或阻止编译警告。&l;/li&g;\n&l;li&g;编译时或部署时处理。软件工具可以处理注解信息生成代码、 XML 文件等。&l;/li&g;\n&l;li&g;运行时处理。有些注解在运行时可以被检查。&l;br&g;\n像使用类一样,要使用注解必须先定义注解类型(也可以使用语言本身提供的注解)&l;/li&g;\n&l;/ol&g;\n&l;p&g;&l;code&g;注解 (annotation)和注解类型 (annotation type)&l;/code&g;。注解类型是一种特殊的接口类型,注解是注解类型的一个实例。就像接口一样,注解类型也有名称和成员。注解中包含的信息采用“键/值”对的形式,可以有零或多个“键/值”对,并且每个键有一个特定类型。没有“键/值”对的注解类型称作&l;code&g;标记注解类(marker annotation type)&l;/code&g;。如果注解只需要一个“键/值”对,则称为&l;code&g;单值注解类型&l;/code&g;。&l;/p&g;\n&l;h3 id=\&q;标准注解\&q;&g;标准注解&l;a title=\&q;#标准注解\&q; href=\&q;#标准注解\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;Java语言规范中定义了3个注解类型,它们是供编译器使用的。这3个注解类型定义在java.lang包中,分别为&l;code&g;@Override、@Deprecated 和 @SuppressWarnings&l;/code&g;。&l;/p&g;\n&l;p&g;&l;code&g;Override&l;/code&g; :&l;br&g;\n是一个标记注解类型, 告诉编译器此方法要覆盖父类方法.&l;/p&g;\n&l;p&g;&l;code&g;Deprecate&l;/code&g;:&l;br&g;\n是一个标记注解类型,可以应用于某个方法或某个类型,指明方法或类型已被弃用。标记已被弃用的方法或类型,是为了警告其代码用户,不应该使用或覆盖该方法,或不该使用或扩展该类型。一个方法或类型被标记弃用通常是因为有了更好的方法或类型。当前的软件版本中保留这个被弃用的方法或类型是为了向后兼容。&l;/p&g;\n&l;p&g;&l;code&g;SuppressWarnings&l;/code&g;:&l;br&g;\n注解指示编译器阻止某些类型的警告,具体的警告类型可以用初始化该注解的字符串来定义。该注解可应用于类型、构造方法、方法、成员变量、参数以及局部变量。它的用法是传递一个 String数组,其中包含需要阻止的警告。&l;/p&g;\n&l;p&g;常用有效参数:&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;unchecked &l;/code&g; 未检查的转换警告。&l;/li&g;\n&l;li&g;&l;code&g;deprecation&l;/code&g; 使用了不推荐使用方法的警告。&l;/li&g;\n&l;li&g;&l;code&g;serial &l;/code&g; 实现 Serializable 接口但没有定义 serialVersionUID 常量的警告。&l;/li&g;\n&l;li&g;&l;code&g;rawtypes &l;/code&g; 如果使用旧的语法创建泛型类对象时发出的警告。&l;/li&g;\n&l;li&g;&l;code&g;finally &l;/code&g; 任何 finally子句不能正常完成的警告。&l;/li&g;\n&l;li&g;&l;code&g;fallthrough&l;/code&g; switch块中某个 case 后没有 break 语句的警告。&l;/li&g;\n&l;/ul&g;\n&l;h3 id=\&q;标准元注解\&q;&g;标准元注解&l;a title=\&q;#标准元注解\&q; href=\&q;#标准元注解\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;元注解 (meta annotation) 是对注解进行标注的注解。在java.lang.annotation包中定义Documented、Inherited、Retention 和 Target 四个元注解类型。&l;/p&g;\n&l;ol&g;\n&l;li&g;&l;code&g;Documented&l;/code&g;&l;br&g;\nDocumented是一种标记注解类型,用于对一个注解类型的声明进行标注,使该注解类型的实例包含在用javadoc 工具产生的文档中。&l;/li&g;\n&l;li&g;&l;code&g;Inherited&l;/code&g;&l;br&g;\n用 Inherited标注的注解类型的任何实例都会被继承。如果 Inherited标注一个类,那么注解将会被这个被标注类的所有子类继承。&l;/li&g;\n&l;li&g;&l;code&g;Retension&l;/code&g;&l;br&g;\nRetension 注解指明被标注的注解保留多长时间。 Retension 注解的值为 RetensionPolicy枚举的一个成员:&l;/li&g;\n&l;/ol&g;\n&l;ul&g;\n&l;li&g;&l;code&g;SOURCE&l;/code&g; 表示注解仅存于源文件中,注解将被编译器丢弃。&l;/li&g;\n&l;li&g;&l;code&g;CLASS&l;/code&g; 表示注解将保存在类文件中,但不被JVM保存的注解,是默认值。&l;/li&g;\n&l;li&g;&l;code&g;RUNTIME&l;/code&g; 表示要被JVM保存的注解,在运行时可以利用反射机制查询&l;/li&g;\n&l;/ul&g;\n&l;ol start=\&q;4\&q;&g;\n&l;li&g;&l;code&g;Target&l;/code&g;&l;br&g;\nTarget注解用来指明哪个(些)程序元素可以利用被标注的注解类型进行标注。 Target的值为java.lang.annotation.ElementType枚举的一个成员:&l;/li&g;\n&l;/ol&g;\n&l;ul&g;\n&l;li&g;&l;code&g;ANNOTATION_TYPE&l;/code&g; 可以对注解类型标注。&l;/li&g;\n&l;li&g;&l;code&g;CONSTRUCTOR&l;/code&g; 可以对构造方法进行标注。&l;/li&g;\n&l;li&g;&l;code&g;FIELD&l;/code&g; 可以对成员的声明进行标注。&l;/li&g;\n&l;li&g;&l;code&g;LOCAL_VARIABLE&l;/code&g; 可以对局部变量进行标注。&l;/li&g;\n&l;li&g;&l;code&g;METHOD&l;/code&g; 可以对方法进行标注。&l;/li&g;\n&l;li&g;&l;code&g;PACKAGE&l;/code&g; 可以对包进行标注。&l;/li&g;\n&l;li&g;&l;code&g;PARAMETER&l;/code&g; 可以对参数声明进行标注。&l;/li&g;\n&l;li&g;&l;code&g;TYPE&l;/code&g; 可以对类型声明进行标注&l;/li&g;\n&l;/ul&g;\n&l;p&g;如Override 注解类型使用了 Target 注解标注,使得 Override 只适用于方法声明.&l;br&g;\nSuppressWarnings 注解类型的声明&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Target&l;/span&g; (value=&a;#123;TYPE,FIELD,METHOD,PARAMETER, CONSTRUCTOR,LOCAL_VARIABLE&a;#125;)&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Retention(value=SOURCE)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;meta\&q;&g;@interface&l;/span&g; SuppressWarnings&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;定义注解\&q;&g;定义注解&l;a title=\&q;#定义注解\&q; href=\&q;#定义注解\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;默认情况下,所有的注解类型都扩展了java.lang.annotation.Annotation接口。该接口定义一个返回Class对象的 annotationType()方法 &l;code&g;Class &a;lt;?extends Annotation&a;gt; annotationType()&l;/code&g;, 该接口还定义了equals()方法、hashCode()方法和toString()方法。&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;23&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Retention(RetentionPolicy.RUNTIME)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Target(ElementType.METHOD)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@interface&l;/span&g; MyAnnotation &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; String &l;span class=\&q;title function_\&q;&g;value&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;MyClass1&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;meta\&q;&g;@MyAnnotation(value = &a;quot;Hello, World!&a;quot;)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;myMethod&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// do something&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &l;span class=\&q;keyword\&q;&g;throws&l;/span&g; NoSuchMethodException &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;MyClass1&l;/span&g; &l;span class=\&q;variable\&q;&g;obj&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;MyClass1&l;/span&g;();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Method&l;/span&g; &l;span class=\&q;variable\&q;&g;method&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; obj.getClass().getMethod(&l;span class=\&q;string\&q;&g;&a;quot;myMethod&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;MyAnnotation&l;/span&g; &l;span class=\&q;variable\&q;&g;annotation&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; method.getAnnotation(MyAnnotation.class);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;value&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; annotation.value();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(value);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;在注解类型中声明的方法称为注解类型的元素,它的声明类似于接口中的方法声明,没有方法体,但有返回类型。元素的类型有一些限制,如只能是基本类型、String、枚举类型、其他注解类型等,并且元素不能声明任何参数。&l;br&g;\n实际上,注解类型的元素就像对象的域一样,所有应用该注解类型的程序元素都要对这些域实例化。这些域的值是在应用注解时由初始化器决定,或由元素的默认值决定。&l;br&g;\n在定义注解时可以使用 default 关键字为元素指定默认值。&l;/p&g;\n&l;p&g;javaxjws 包中定义了一些用来创建 Web 服务的注解类型,在 javax.xml.ws包和 javax.xml.bind.annotation 包中也定义了许多注解类型。注解类型在 Java Web 开发和Java EE 开发中被广泛使用.&l;/p&g;\n&l;p&g;&l;strong&g;参考&l;/strong&g;&l;/p&g;\n&l;ol&g;\n&l;li&g;《Java程序设计(第3版)》 IBSN 9787302485520&l;/li&g;\n&l;li&g;&l;a href=\&q;https://docs.oracle.com/en/java/javase/19/docs/api/index.html\&q; target=\&q;_blank\&q;&g;Java API 文档&l;/a&g;&l;/li&g;\n&l;li&g;&l;a href=\&q;https://blog.csdn.net/qq_52348926/article/details/129478117#:~:text=hashCode%20%28%29%E6%96%B9%E6%B3%95%E7%94%A8%E4%BA%8E%E8%AE%A1%E7%AE%97%E5%93%88%E5%B8%8C%E7%A0%81%E5%80%BC%EF%BC%8C%E8%80%8Cequals%20%28%29%E6%96%B9%E6%B3%95%E7%94%A8%E4%BA%8E%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%9B%B8%E7%AD%89%E6%80%A7%E3%80%82%20%E5%9C%A8Java%E4%B8%AD%EF%BC%8C%E5%A6%82%E6%9E%9C%20%E4%B8%A4%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%93%88%E5%B8%8C%E7%A0%81%E5%80%BC%E7%9B%B8%E5%90%8C,%EF%BC%8C%20%E4%B8%8D%E4%B8%80%E5%AE%9A%E6%84%8F%E5%91%B3%E7%9D%80%E5%AE%83%E4%BB%AC%E6%98%AF%E7%9B%B8%E7%AD%89%E7%9A%84%20%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%8F%AF%E8%83%BD%E5%AD%98%E5%9C%A8%20%E5%93%88%E5%B8%8C%E5%86%B2%E7%AA%81%20%EF%BC%8C%E5%8D%B3%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AF%B9%E8%B1%A1%E5%8F%AF%E8%83%BD%E7%94%9F%E6%88%90%E7%9B%B8%E5%90%8C%E7%9A%84%E5%93%88%E5%B8%8C%E7%A0%81%E5%80%BC%E3%80%82\&q; target=\&q;_blank\&q;&g;Hash值的理解,Java中hashCode()和equals究竟有什么用?&l;/a&g;&l;/li&g;\n&l;/ol&g;\n&q;,&q;prev&q;:{&q;title&q;:&q;[Java笔记]接口&a;Lambda表达式&q;,&q;link&q;:&q;2023/05/10/[Java笔记]接口&a;Lambda表达式&q;},&q;next&q;:{&q;title&q;:&q;[Java笔记]继承&a;多态&q;,&q;link&q;:&q;2023/05/09/[Java笔记]继承&a;多态&q;},&q;plink&q;:&q;https://www.slacr.site/2023/05/09/[Java笔记]常用核心类内部类枚举注解/&q;,&q;toc&q;:[{&q;id&q;:&q;object&q;,&q;title&q;:&q;Object&q;,&q;index&q;:&q;1&q;},{&q;id&q;:&q;math&q;,&q;title&q;:&q;Math&q;,&q;index&q;:&q;2&q;},{&q;id&q;:&q;基本类型包装类&q;,&q;title&q;:&q;基本类型包装类&q;,&q;index&q;:&q;3&q;,&q;children&q;:[{&q;id&q;:&q;character&q;,&q;title&q;:&q;Character&q;,&q;index&q;:&q;3.1&q;},{&q;id&q;:&q;boolean&q;,&q;title&q;:&q;Boolean&q;,&q;index&q;:&q;3.2&q;},{&q;id&q;:&q;数值类对象&q;,&q;title&q;:&q;数值类对象&q;,&q;index&q;:&q;3.3&q;},{&q;id&q;:&q;自动装箱与自动拆箱&q;,&q;title&q;:&q;自动装箱与自动拆箱&q;,&q;index&q;:&q;3.4&q;},{&q;id&q;:&q;字符串与基本数据类型转化&q;,&q;title&q;:&q;字符串与基本数据类型转化&q;,&q;index&q;:&q;3.5&q;}]},{&q;id&q;:&q;biginteger-bigdecimal&q;,&q;title&q;:&q;BigInteger BigDecimal&q;,&q;index&q;:&q;4&q;},{&q;id&q;:&q;时间日期api&q;,&q;title&q;:&q;时间日期API&q;,&q;index&q;:&q;5&q;},{&q;id&q;:&q;内部类&q;,&q;title&q;:&q;内部类&q;,&q;index&q;:&q;6&q;,&q;children&q;:[{&q;id&q;:&q;内部成员类&q;,&q;title&q;:&q;内部成员类&q;,&q;index&q;:&q;6.1&q;},{&q;id&q;:&q;局部内部类&q;,&q;title&q;:&q;局部内部类&q;,&q;index&q;:&q;6.2&q;},{&q;id&q;:&q;匿名内部类&q;,&q;title&q;:&q;匿名内部类&q;,&q;index&q;:&q;6.3&q;},{&q;id&q;:&q;静态内部类&q;,&q;title&q;:&q;静态内部类&q;,&q;index&q;:&q;6.4&q;}]},{&q;id&q;:&q;枚举类型&q;,&q;title&q;:&q;枚举类型&q;,&q;index&q;:&q;7&q;},{&q;id&q;:&q;注解类型&q;,&q;title&q;:&q;注解类型&q;,&q;index&q;:&q;8&q;,&q;children&q;:[{&q;id&q;:&q;标准注解&q;,&q;title&q;:&q;标准注解&q;,&q;index&q;:&q;8.1&q;},{&q;id&q;:&q;标准元注解&q;,&q;title&q;:&q;标准元注解&q;,&q;index&q;:&q;8.2&q;},{&q;id&q;:&q;定义注解&q;,&q;title&q;:&q;定义注解&q;,&q;index&q;:&q;8.3&q;}]}],&q;reward&q;:true,&q;copyright&q;:{&q;author&q;:&q;slacr_&q;,&q;license&q;:&q;&l;a href=\&q;https://creativecommons.org/licenses/by-nc-sa/4.0/\&q; target=\&q;_blank\&q;&g;&l;img src = \&q;/lib/cc-by-nc-sa.svg\&q;&g;&l;/a&g;&q;,&q;published&q;:&q;May 9, 2023&q;,&q;updated&q;:&q;May 9, 2023&q;},&q;reading_time&q;:&q;5144 words in 34 min&q;}}a;#x27;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Character&l;/span&g; &l;span class=\&q;variable\&q;&g;c_3&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; (&l;span class=\&q;string\&q;&g;&a;#x27;简&a;#x27;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c_1.compareTo(&l;span class=\&q;string\&q;&g;&a;#x27;D&a;#x27;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// -3&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c_2.charValue()); &l;span class=\&q;comment\&q;&g;// l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c_3.isLetter(&l;span class=\&q;string\&q;&g;&a;#x27;简&a;#x27;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// true&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;常用方法:&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public char charValue() &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回 Character 对象所包含的 char值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public int compareTo(Character anotherChar) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;比较两个字符对象。如果该字符对象与参数字符对象相等,返回0;若小于参数字符,返回值小于0;若大于参数字符,则返回值大于0。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isDigit(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是数字。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isLetter(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是字母。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isLowerCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是小写字母。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isUpperCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是大写字母。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isWhiteSpace(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否是空白字符。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static char toLowerCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数字符转换为小写字母返回。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static char toUpperCase(char ch)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数字符转换为大写字母返回。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isJavaIdentifierStart(char ch) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否允许作为 Java标识符的开头字符。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean isJavaldentifierPart (char ch) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回参数字符是否允许作为 Java标识符的中间字符。&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;h3 id=\&q;boolean\&q;&g;Boolean&l;a title=\&q;#boolean\&q; href=\&q;#boolean\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;常用方法:&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Boolean(boolean value)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;用一个boolean型值创建一个Boolean对象。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Boolean(String s)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;用一个字符串创建Boolean对象。如果字符串 s不为 null 且其值为 “true”(不区分大小写)就创建一个true值,否则创建一个 false值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public boolean booleanValue()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回该Boolean 对象所封装的 boolean值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static boolean parseBoolean(String s)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数s解析为一个 boolean 值。如果参数不为 null 且等于 “true”(不区分大小写),则返回true, 否则返回 false。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static Boolean valueOf(boolean b)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数b 的值转换为 Boolean 对象。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static Boolean valueOf(String s)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;将参数s 的值转换为 Boolean对象。&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;boolean&l;/span&g; &l;span class=\&q;variable\&q;&g;b&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;literal\&q;&g;false&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Boolean&l;/span&g; &l;span class=\&q;variable\&q;&g;b_1&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;Boolean&l;/span&g;(b); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Boolean&l;/span&g; &l;span class=\&q;variable\&q;&g;b_2&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;Boolean&l;/span&g;(&l;span class=\&q;string\&q;&g;&a;quot;TruE&a;quot;&l;/span&g;); &l;span class=\&q;comment\&q;&g;// true , 这两个方法已经不支持, 将要移除&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(b_1);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(b_2);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(b_1.booleanValue()); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Boolean.parseBoolean(&l;span class=\&q;string\&q;&g;&a;quot;True&a;quot;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// true&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Boolean.valueOf(b).booleanValue()); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Boolean.valueOf(&l;span class=\&q;string\&q;&g;&a;quot;OK&a;quot;&l;/span&g;)); &l;span class=\&q;comment\&q;&g;// false&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;数值类对象\&q;&g;数值类对象&l;a title=\&q;#数值类对象\&q; href=\&q;#数值类对象\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;常用方法:&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Integer(int value) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;使用 int类型的值创建包装类型 Integer对象。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public Integer(String s) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;使用字符串构造Integer对象,如果字符串不能转换成相应的数值,则抛出NumberFormatException异常&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static String toBinaryString(int i)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i用字符串表示的二进制序列。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static String toHexString(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i用字符串表示的十六进制序列。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static String toOctalString(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数 i用字符串表示的八进制序列。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int highestOneBit(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i的二进制补码的最高位1所表示的十进制数,如7(111)的最高位的1表示的值为4。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int lowestOneBit(int i)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数 i的二进制补码的最低位1所表示的十进制数,如10(1010)的最低位的1表示的值为2。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int reverse(int i) &l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回将整数i的二进制序列反转后的整数值。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static int signum(inti)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回整数i的符号。若 i大于0,返回1;若 i等于0,&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;返回0,若 i小于0则返回-1。&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;p&g;每种包装类型都覆盖了toString()方法和 equals()方法,因此使用 equals()方法比较包装类型的对象时是比较内容或所包装值.每种包装类型的对象中所包装的值是不可改变的,要改变对象中的值必须重新生成新的对象.&l;/p&g;\n&l;p&g;每个数值包装类都定义了 &l;code&g;SIZE、BYTES、MAX_VALUE、MIN_VALUE &l;/code&g;常量。&l;br&g;\nSIZE 表示每种类型的数据所占的位数&l;br&g;\nBYTES 表示数据所占的字节数&l;br&g;\nMAX_VALUE 表示对应基本类型数据的最大值.&l;br&g;\n对于Byte、Short、Integer和Long 来说,MIN_VALUE 表示类型的最小值。对 Float和 Double 来说,MIN_VALUE 最小正值。&l;br&g;\n除了上面的常量外,在 Float 和 Double 类中还分别定义了 POSITIVE_INFINITY、NEGATIVE INFINITY、NaN(not a number), 它们分别表示正、负无穷大和非数值。&l;/p&g;\n&l;h3 id=\&q;自动装箱与自动拆箱\&q;&g;自动装箱与自动拆箱&l;a title=\&q;#自动装箱与自动拆箱\&q; href=\&q;#自动装箱与自动拆箱\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;Java 5 版提供了一种新的功能,称为自动装箱和自动拆箱。自动装箱 (autoboxing) 是指基本类型的数据可以自动转换为包装类的实例,自动拆箱 (unboxing) 是指包装类的实例自动转换为基本类型的数据。&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Integer&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;300&l;/span&g;; &l;span class=\&q;comment\&q;&g;// auto boxing&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;i_1&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; i; &l;span class=\&q;comment\&q;&g;// auto unboxing&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(((Integer)i_1).toString()); &l;span class=\&q;comment\&q;&g;// 强制转换&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;字符串与基本数据类型转化\&q;&g;字符串与基本数据类型转化&l;a title=\&q;#字符串与基本数据类型转化\&q; href=\&q;#字符串与基本数据类型转化\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;&l;code&g;public static Type parse&a;#123;Type&a;#125;(String s)&l;/code&g;&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;s&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;String&l;/span&g;(&l;span class=\&q;string\&q;&g;&a;quot;123&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Integer.parseInt(s)); &l;span class=\&q;comment\&q;&g;// 字符串转基本类型&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(Double.parseDouble(s));&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;100&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(String.valueOf(i) &l;span class=\&q;keyword\&q;&g;instanceof&l;/span&g; String); &l;span class=\&q;comment\&q;&g;// 基本类型转字符串&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(((Integer)i).toString()); &l;span class=\&q;comment\&q;&g;// 或者通过包装类的toString()方法&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;biginteger-bigdecimal\&q;&g;BigInteger BigDecimal&l;a title=\&q;#biginteger-bigdecimal\&q; href=\&q;#biginteger-bigdecimal\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;如果在计算中需要非常大的整数或非常高精度的浮点数,可以使用java.math 包中定义的BigInteger类和 BigDecimal类。这两个类都扩展了Number类并实现了Comparable 接口,它们的实例都是不可变的.&l;/p&g;\n&l;p&g;&l;a href=\&q;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigInteger.html\&q; target=\&q;_blank\&q;&g;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigInteger.html&l;/a&g;&l;/p&g;\n&l;h2 id=\&q;时间日期api\&q;&g;时间日期API&l;a title=\&q;#时间日期api\&q; href=\&q;#时间日期api\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;java.time&l;br&g;\n&l;a href=\&q;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/time/package-summary.html\&q; target=\&q;_blank\&q;&g;https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/time/package-summary.html&l;/a&g;&l;/p&g;\n&l;h2 id=\&q;内部类\&q;&g;内部类&l;a title=\&q;#内部类\&q; href=\&q;#内部类\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;Java 语言允许在一个类的内部定义另一个类(接口、枚举或注解),这种类称为内部类 (inner class)或嵌套类 (nested class)&l;br&g;\n使用内部类的优点:对只在一处使用的类进行分组;提高封装性;增强代码的可读性和可维护性。&l;br&g;\n有多种类型的内部类,大致可分为&l;code&g;成员内部类、局部内部类、匿名内部类和静态内部类&l;/code&g;。&l;/p&g;\n&l;h3 id=\&q;内部成员类\&q;&g;内部成员类&l;a title=\&q;#内部成员类\&q; href=\&q;#内部成员类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;成员内部类没有用 static修饰且定义在外层类的类体中&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g; &a;#123; &l;span class=\&q;comment\&q;&g;// 内部类相当于成员, 可以访问外部内所有成员&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;y&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;title function_\&q;&g;add&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; x + y;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;2&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;OuterClass&l;/span&g; &l;span class=\&q;variable\&q;&g;o&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; OuterClass.&l;span class=\&q;type\&q;&g;InnerClass&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; o.&l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;(); &l;span class=\&q;comment\&q;&g;// 创建内部类&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; OuterClass.&l;span class=\&q;type\&q;&g;InnerClass&l;/span&g; &l;span class=\&q;variable\&q;&g;ii&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;().&l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;(); &l;span class=\&q;comment\&q;&g;// 或者&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(ii.add()); &l;span class=\&q;comment\&q;&g;// 3&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;使用成员内部类时需要注意下面几个问题:&l;/p&g;\n&l;ol&g;\n&l;li&g;成员内部类中不能定义 static变量和 static方法。&l;/li&g;\n&l;li&g;成员内部类也可以使用 abstract和 final修饰,其含义与其他类一样。&l;/li&g;\n&l;li&g;成员内部类还可以使用 private、public、protected或包可访问修饰符。&l;/li&g;\n&l;/ol&g;\n&l;h3 id=\&q;局部内部类\&q;&g;局部内部类&l;a title=\&q;#局部内部类\&q; href=\&q;#局部内部类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;可以在方法体或语句块内定义类。在方法体或语句块 (包括方法、构造方法、局部块、初始化块或静态初始化块)内部定义的类称为局部内部类 (local inner class)&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;makeInner&l;/span&g;&l;span class=\&q;params\&q;&g;(&l;span class=\&q;type\&q;&g;int&l;/span&g; p)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;s&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;string\&q;&g;&a;quot;local_variable&a;quot;&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;seekOuter&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(x);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(s);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(p);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125; &l;span class=\&q;comment\&q;&g;// 此局部类只在这个函数中有效&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;().seekOuter(); &l;span class=\&q;comment\&q;&g;// 创建对象调用方法&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;OuterClass&l;/span&g; &l;span class=\&q;variable\&q;&g;o&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; o.makeInner(&l;span class=\&q;number\&q;&g;2&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;//1&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;//local_variable&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;//2&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;匿名内部类\&q;&g;匿名内部类&l;a title=\&q;#匿名内部类\&q; href=\&q;#匿名内部类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;定义类最终目的是创建一个类的实例,但如果某个类的实例只使用一次,可以将类的定义和实例的创建在一起完成,或者说在定义类的同时就创建一个实例。以这种方式定义的没有名字的类称为匿名内部类 (anonymous inner class)。&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;abstract&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Person&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;name&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;string\&q;&g;&a;quot;slacr&a;quot;&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;abstract&l;/span&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; String &l;span class=\&q;title function_\&q;&g;work&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// 匿名对象继承 Person, 初始化同时定义&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Person&l;/span&g; &l;span class=\&q;variable\&q;&g;hero&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;Person&l;/span&g;()&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;meta\&q;&g;@Override&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; String &l;span class=\&q;title function_\&q;&g;work&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; &l;span class=\&q;string\&q;&g;&a;quot;punish evil-doers&a;quot;&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;Hero &a;quot;&l;/span&g; + hero.name + &l;span class=\&q;string\&q;&g;&a;quot;, I will &a;quot;&l;/span&g; + hero.work());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// Hero slacr, I will punish evil-doers&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;匿名内部类可以继承一个类或实现一个接口, 如果实现一个接口,该类是Object类的直接子类。匿名类继承一个类或&l;br&g;\n实现一个接口不需要使用 extends 或 implements 关键字。匿名内部类不能同时继承一个类和实现一个接口,也不能实现多个接口&l;br&g;\n匿名内部类的一个重要应用是编写 JavaFX 图形界面的事件处理程序。如为按钮对象button 注册事件处理器,就可以使用匿名内部类。&l;/p&g;\n&l;h3 id=\&q;静态内部类\&q;&g;静态内部类&l;a title=\&q;#静态内部类\&q; href=\&q;#静态内部类\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;静态内部类使用 static修饰,静态内部类也称嵌套类 (nested class)&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;x&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;1&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;outer&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(&l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;().getClass().getSimpleName());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;InnerClass&l;/span&g;&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; &l;span class=\&q;variable\&q;&g;y&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;number\&q;&g;2&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;test&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; outer();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(x); &l;span class=\&q;comment\&q;&g;// 可以访问外部静态成员方法和变量&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(y);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; OuterClass.&l;span class=\&q;type\&q;&g;InnerClass&l;/span&g; &l;span class=\&q;variable\&q;&g;i&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;OuterClass&l;/span&g;.InnerClass();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// 不需要外层实例就可以直接创建一个静态内部实例&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; i.test();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;枚举类型\&q;&g;枚举类型&l;a title=\&q;#枚举类型\&q; href=\&q;#枚举类型\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;枚举类型是一种特殊的引用类型,它的声明和使用与类和接口有类似的地方。它可以作为顶层的类型声明,也可以像内部类一样在其他类的内部声明,但不能在方法内部声明枚举。&l;/p&g;\n&l;p&g;任何枚举类型都隐含地继承了java.lang.Enum抽象类,Enum类又是Object类的子类,同时实现了 Comparable 接口和 Serializable接口。每个枚举类型都包含了若干方法,下面是一些常用的&l;/p&g;\n&l;div class=\&q;φbq\&q;&g;&l;div class=\&q;φbs\&q;&g;&l;table&g;&l;thead&g;\n&l;tr&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;th style=\&q;padding:0\&q;&g;&l;/th&g;\n&l;/tr&g;\n&l;/thead&g;\n&l;tbody&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static E[] values()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回一个包含所有枚举常量的数组,这些枚举常量在数组中是按照它们的声明顺序存储的。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public static E valueOf(String name)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回指定名字的枚举常量。如果这个名字与任何一个枚举常量的名字都不能精确匹配,将抛出 IlegalArgumentException 异常。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final int compareTo(Eo)&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回当前枚举对象与参数枚举对象的比较结果。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final Class&a;lt;E&a;gt; getDeclaringClass()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回对应该枚举常量的枚举类型的类对象。两个枚举常量 el、e2, 当且仅当 el.getDeclaringClass() == e2.getDeclaringClass()时,这两个枚举常量类型相同。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final String name()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回枚举常量名。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public final int ordinal()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回枚举常量的顺序值,该值是基于常量声明的顺序的,第一个常量的顺序值是0,第二个常量的顺序值为1,依次类推。&l;/td&g;\n&l;/tr&g;\n&l;tr&g;\n&l;td style=\&q;text-align:left\&q;&g;&l;code&g;public String toString()&l;/code&g;&l;/td&g;\n&l;td style=\&q;text-align:left\&q;&g;返回枚举常量名。&l;/td&g;\n&l;/tr&g;\n&l;/tbody&g;\n&l;/table&g;&l;/div&g;&l;/div&g;&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Direction&l;/span&g; &l;span class=\&q;variable\&q;&g;left&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; Direction.W;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(left);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;for&l;/span&g; ( Direction d : Direction.values()) &a;#123; &l;span class=\&q;comment\&q;&g;// values() 是一个包含枚举常量的数组&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(d.name() + &l;span class=\&q;string\&q;&g;&a;quot; &a;quot;&l;/span&g; + d.ordinal());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// enum 配合 Switch&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Direction&l;/span&g; &l;span class=\&q;variable\&q;&g;d&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; Direction.values()[(&l;span class=\&q;type\&q;&g;int&l;/span&g;)(Math.random()*&l;span class=\&q;number\&q;&g;4&l;/span&g;)];&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;switch&l;/span&g; (d) &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; E -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;EAST&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; S -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;SOUTH&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; W -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;WEST&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;case&l;/span&g; N -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;NORTH&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;default&l;/span&g; -&a;gt; System.out.println(&l;span class=\&q;string\&q;&g;&a;quot;error&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;23&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;24&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;25&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;26&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;27&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;enum&l;/span&g; &l;span class=\&q;title class_\&q;&g;Color&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; R(&l;span class=\&q;string\&q;&g;&a;quot;RED&a;quot;&l;/span&g;, &l;span class=\&q;number\&q;&g;1&l;/span&g;), G(&l;span class=\&q;string\&q;&g;&a;quot;GREEN&a;quot;&l;/span&g;, &l;span class=\&q;number\&q;&g;2&l;/span&g;) , B(&l;span class=\&q;string\&q;&g;&a;quot;BLUE&a;quot;&l;/span&g;, &l;span class=\&q;number\&q;&g;3&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; String name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;type\&q;&g;int&l;/span&g; idx;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;private&l;/span&g; &l;span class=\&q;title function_\&q;&g;Color&l;/span&g;&l;span class=\&q;params\&q;&g;(String name, &l;span class=\&q;type\&q;&g;int&l;/span&g; idx)&l;/span&g; &a;#123; &l;span class=\&q;comment\&q;&g;// 构造方法只能 private, 通过枚举具体的类型创建&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;built_in\&q;&g;this&l;/span&g;.name = name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;built_in\&q;&g;this&l;/span&g;.idx = idx;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; String &l;span class=\&q;title function_\&q;&g;getName&l;/span&g;&l;span class=\&q;params\&q;&g;(&l;span class=\&q;type\&q;&g;int&l;/span&g; idx)&l;/span&g; &a;#123; &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;for&l;/span&g; (Color c : Color.values())&a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g;(c.idx ==idx ) &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; c.name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; &l;span class=\&q;literal\&q;&g;null&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;meta\&q;&g;@Override&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; String &l;span class=\&q;title function_\&q;&g;toString&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;return&l;/span&g; idx + &l;span class=\&q;string\&q;&g;&a;quot; &a;quot;&l;/span&g; + name;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Color&l;/span&g; &l;span class=\&q;variable\&q;&g;c&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; Color.G; &l;span class=\&q;comment\&q;&g;// 自动调用构造&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(c.toString());&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;注解类型\&q;&g;注解类型&l;a title=\&q;#注解类型\&q; href=\&q;#注解类型\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;注解类型 (annotation type) 是 Java 5 新增的功能。注解以结构化的方式为程序元素提供信息,这些信息能够被外部工具(编译器、解释器等)自动处理.&l;br&g;\n注解有许多用途,其中包括:&l;/p&g;\n&l;ol&g;\n&l;li&g;为编译器提供信息。编译器可以使用注解检测错误或阻止编译警告。&l;/li&g;\n&l;li&g;编译时或部署时处理。软件工具可以处理注解信息生成代码、 XML 文件等。&l;/li&g;\n&l;li&g;运行时处理。有些注解在运行时可以被检查。&l;br&g;\n像使用类一样,要使用注解必须先定义注解类型(也可以使用语言本身提供的注解)&l;/li&g;\n&l;/ol&g;\n&l;p&g;&l;code&g;注解 (annotation)和注解类型 (annotation type)&l;/code&g;。注解类型是一种特殊的接口类型,注解是注解类型的一个实例。就像接口一样,注解类型也有名称和成员。注解中包含的信息采用“键/值”对的形式,可以有零或多个“键/值”对,并且每个键有一个特定类型。没有“键/值”对的注解类型称作&l;code&g;标记注解类(marker annotation type)&l;/code&g;。如果注解只需要一个“键/值”对,则称为&l;code&g;单值注解类型&l;/code&g;。&l;/p&g;\n&l;h3 id=\&q;标准注解\&q;&g;标准注解&l;a title=\&q;#标准注解\&q; href=\&q;#标准注解\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;Java语言规范中定义了3个注解类型,它们是供编译器使用的。这3个注解类型定义在java.lang包中,分别为&l;code&g;@Override、@Deprecated 和 @SuppressWarnings&l;/code&g;。&l;/p&g;\n&l;p&g;&l;code&g;Override&l;/code&g; :&l;br&g;\n是一个标记注解类型, 告诉编译器此方法要覆盖父类方法.&l;/p&g;\n&l;p&g;&l;code&g;Deprecate&l;/code&g;:&l;br&g;\n是一个标记注解类型,可以应用于某个方法或某个类型,指明方法或类型已被弃用。标记已被弃用的方法或类型,是为了警告其代码用户,不应该使用或覆盖该方法,或不该使用或扩展该类型。一个方法或类型被标记弃用通常是因为有了更好的方法或类型。当前的软件版本中保留这个被弃用的方法或类型是为了向后兼容。&l;/p&g;\n&l;p&g;&l;code&g;SuppressWarnings&l;/code&g;:&l;br&g;\n注解指示编译器阻止某些类型的警告,具体的警告类型可以用初始化该注解的字符串来定义。该注解可应用于类型、构造方法、方法、成员变量、参数以及局部变量。它的用法是传递一个 String数组,其中包含需要阻止的警告。&l;/p&g;\n&l;p&g;常用有效参数:&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;unchecked &l;/code&g; 未检查的转换警告。&l;/li&g;\n&l;li&g;&l;code&g;deprecation&l;/code&g; 使用了不推荐使用方法的警告。&l;/li&g;\n&l;li&g;&l;code&g;serial &l;/code&g; 实现 Serializable 接口但没有定义 serialVersionUID 常量的警告。&l;/li&g;\n&l;li&g;&l;code&g;rawtypes &l;/code&g; 如果使用旧的语法创建泛型类对象时发出的警告。&l;/li&g;\n&l;li&g;&l;code&g;finally &l;/code&g; 任何 finally子句不能正常完成的警告。&l;/li&g;\n&l;li&g;&l;code&g;fallthrough&l;/code&g; switch块中某个 case 后没有 break 语句的警告。&l;/li&g;\n&l;/ul&g;\n&l;h3 id=\&q;标准元注解\&q;&g;标准元注解&l;a title=\&q;#标准元注解\&q; href=\&q;#标准元注解\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;元注解 (meta annotation) 是对注解进行标注的注解。在java.lang.annotation包中定义Documented、Inherited、Retention 和 Target 四个元注解类型。&l;/p&g;\n&l;ol&g;\n&l;li&g;&l;code&g;Documented&l;/code&g;&l;br&g;\nDocumented是一种标记注解类型,用于对一个注解类型的声明进行标注,使该注解类型的实例包含在用javadoc 工具产生的文档中。&l;/li&g;\n&l;li&g;&l;code&g;Inherited&l;/code&g;&l;br&g;\n用 Inherited标注的注解类型的任何实例都会被继承。如果 Inherited标注一个类,那么注解将会被这个被标注类的所有子类继承。&l;/li&g;\n&l;li&g;&l;code&g;Retension&l;/code&g;&l;br&g;\nRetension 注解指明被标注的注解保留多长时间。 Retension 注解的值为 RetensionPolicy枚举的一个成员:&l;/li&g;\n&l;/ol&g;\n&l;ul&g;\n&l;li&g;&l;code&g;SOURCE&l;/code&g; 表示注解仅存于源文件中,注解将被编译器丢弃。&l;/li&g;\n&l;li&g;&l;code&g;CLASS&l;/code&g; 表示注解将保存在类文件中,但不被JVM保存的注解,是默认值。&l;/li&g;\n&l;li&g;&l;code&g;RUNTIME&l;/code&g; 表示要被JVM保存的注解,在运行时可以利用反射机制查询&l;/li&g;\n&l;/ul&g;\n&l;ol start=\&q;4\&q;&g;\n&l;li&g;&l;code&g;Target&l;/code&g;&l;br&g;\nTarget注解用来指明哪个(些)程序元素可以利用被标注的注解类型进行标注。 Target的值为java.lang.annotation.ElementType枚举的一个成员:&l;/li&g;\n&l;/ol&g;\n&l;ul&g;\n&l;li&g;&l;code&g;ANNOTATION_TYPE&l;/code&g; 可以对注解类型标注。&l;/li&g;\n&l;li&g;&l;code&g;CONSTRUCTOR&l;/code&g; 可以对构造方法进行标注。&l;/li&g;\n&l;li&g;&l;code&g;FIELD&l;/code&g; 可以对成员的声明进行标注。&l;/li&g;\n&l;li&g;&l;code&g;LOCAL_VARIABLE&l;/code&g; 可以对局部变量进行标注。&l;/li&g;\n&l;li&g;&l;code&g;METHOD&l;/code&g; 可以对方法进行标注。&l;/li&g;\n&l;li&g;&l;code&g;PACKAGE&l;/code&g; 可以对包进行标注。&l;/li&g;\n&l;li&g;&l;code&g;PARAMETER&l;/code&g; 可以对参数声明进行标注。&l;/li&g;\n&l;li&g;&l;code&g;TYPE&l;/code&g; 可以对类型声明进行标注&l;/li&g;\n&l;/ul&g;\n&l;p&g;如Override 注解类型使用了 Target 注解标注,使得 Override 只适用于方法声明.&l;br&g;\nSuppressWarnings 注解类型的声明&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Target&l;/span&g; (value=&a;#123;TYPE,FIELD,METHOD,PARAMETER, CONSTRUCTOR,LOCAL_VARIABLE&a;#125;)&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Retention(value=SOURCE)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;meta\&q;&g;@interface&l;/span&g; SuppressWarnings&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h3 id=\&q;定义注解\&q;&g;定义注解&l;a title=\&q;#定义注解\&q; href=\&q;#定义注解\&q;&g;&l;/a&g;&l;/h3&g;\n&l;p&g;默认情况下,所有的注解类型都扩展了java.lang.annotation.Annotation接口。该接口定义一个返回Class对象的 annotationType()方法 &l;code&g;Class &a;lt;?extends Annotation&a;gt; annotationType()&l;/code&g;, 该接口还定义了equals()方法、hashCode()方法和toString()方法。&l;/p&g;\n&l;figure class=\&q;highlight java\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;23&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Retention(RetentionPolicy.RUNTIME)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@Target(ElementType.METHOD)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;meta\&q;&g;@interface&l;/span&g; MyAnnotation &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; String &l;span class=\&q;title function_\&q;&g;value&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g;;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;MyClass1&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;meta\&q;&g;@MyAnnotation(value = &a;quot;Hello, World!&a;quot;)&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;myMethod&l;/span&g;&l;span class=\&q;params\&q;&g;()&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;// do something&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;class&l;/span&g; &l;span class=\&q;title class_\&q;&g;Main&l;/span&g; &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;public&l;/span&g; &l;span class=\&q;keyword\&q;&g;static&l;/span&g; &l;span class=\&q;keyword\&q;&g;void&l;/span&g; &l;span class=\&q;title function_\&q;&g;main&l;/span&g;&l;span class=\&q;params\&q;&g;(String[] args)&l;/span&g; &l;span class=\&q;keyword\&q;&g;throws&l;/span&g; NoSuchMethodException &a;#123;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;MyClass1&l;/span&g; &l;span class=\&q;variable\&q;&g;obj&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; &l;span class=\&q;keyword\&q;&g;new&l;/span&g; &l;span class=\&q;title class_\&q;&g;MyClass1&l;/span&g;();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;Method&l;/span&g; &l;span class=\&q;variable\&q;&g;method&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; obj.getClass().getMethod(&l;span class=\&q;string\&q;&g;&a;quot;myMethod&a;quot;&l;/span&g;);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;MyAnnotation&l;/span&g; &l;span class=\&q;variable\&q;&g;annotation&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; method.getAnnotation(MyAnnotation.class);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;type\&q;&g;String&l;/span&g; &l;span class=\&q;variable\&q;&g;value&l;/span&g; &l;span class=\&q;operator\&q;&g;=&l;/span&g; annotation.value();&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; System.out.println(value);&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&a;#125;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;在注解类型中声明的方法称为注解类型的元素,它的声明类似于接口中的方法声明,没有方法体,但有返回类型。元素的类型有一些限制,如只能是基本类型、String、枚举类型、其他注解类型等,并且元素不能声明任何参数。&l;br&g;\n实际上,注解类型的元素就像对象的域一样,所有应用该注解类型的程序元素都要对这些域实例化。这些域的值是在应用注解时由初始化器决定,或由元素的默认值决定。&l;br&g;\n在定义注解时可以使用 default 关键字为元素指定默认值。&l;/p&g;\n&l;p&g;javaxjws 包中定义了一些用来创建 Web 服务的注解类型,在 javax.xml.ws包和 javax.xml.bind.annotation 包中也定义了许多注解类型。注解类型在 Java Web 开发和Java EE 开发中被广泛使用.&l;/p&g;\n&l;p&g;&l;strong&g;参考&l;/strong&g;&l;/p&g;\n&l;ol&g;\n&l;li&g;《Java程序设计(第3版)》 IBSN 9787302485520&l;/li&g;\n&l;li&g;&l;a href=\&q;https://docs.oracle.com/en/java/javase/19/docs/api/index.html\&q; target=\&q;_blank\&q;&g;Java API 文档&l;/a&g;&l;/li&g;\n&l;li&g;&l;a href=\&q;https://blog.csdn.net/qq_52348926/article/details/129478117#:~:text=hashCode%20%28%29%E6%96%B9%E6%B3%95%E7%94%A8%E4%BA%8E%E8%AE%A1%E7%AE%97%E5%93%88%E5%B8%8C%E7%A0%81%E5%80%BC%EF%BC%8C%E8%80%8Cequals%20%28%29%E6%96%B9%E6%B3%95%E7%94%A8%E4%BA%8E%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%9B%B8%E7%AD%89%E6%80%A7%E3%80%82%20%E5%9C%A8Java%E4%B8%AD%EF%BC%8C%E5%A6%82%E6%9E%9C%20%E4%B8%A4%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%93%88%E5%B8%8C%E7%A0%81%E5%80%BC%E7%9B%B8%E5%90%8C,%EF%BC%8C%20%E4%B8%8D%E4%B8%80%E5%AE%9A%E6%84%8F%E5%91%B3%E7%9D%80%E5%AE%83%E4%BB%AC%E6%98%AF%E7%9B%B8%E7%AD%89%E7%9A%84%20%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%8F%AF%E8%83%BD%E5%AD%98%E5%9C%A8%20%E5%93%88%E5%B8%8C%E5%86%B2%E7%AA%81%20%EF%BC%8C%E5%8D%B3%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AF%B9%E8%B1%A1%E5%8F%AF%E8%83%BD%E7%94%9F%E6%88%90%E7%9B%B8%E5%90%8C%E7%9A%84%E5%93%88%E5%B8%8C%E7%A0%81%E5%80%BC%E3%80%82\&q; target=\&q;_blank\&q;&g;Hash值的理解,Java中hashCode()和equals究竟有什么用?&l;/a&g;&l;/li&g;\n&l;/ol&g;\n&q;,&q;prev&q;:{&q;title&q;:&q;[Java笔记]接口&a;Lambda表达式&q;,&q;link&q;:&q;2023/05/10/[Java笔记]接口&a;Lambda表达式&q;},&q;next&q;:{&q;title&q;:&q;[Java笔记]继承&a;多态&q;,&q;link&q;:&q;2023/05/09/[Java笔记]继承&a;多态&q;},&q;plink&q;:&q;https://www.slacr.site/2023/05/09/[Java笔记]常用核心类内部类枚举注解/&q;,&q;toc&q;:[{&q;id&q;:&q;object&q;,&q;title&q;:&q;Object&q;,&q;index&q;:&q;1&q;},{&q;id&q;:&q;math&q;,&q;title&q;:&q;Math&q;,&q;index&q;:&q;2&q;},{&q;id&q;:&q;基本类型包装类&q;,&q;title&q;:&q;基本类型包装类&q;,&q;index&q;:&q;3&q;,&q;children&q;:[{&q;id&q;:&q;character&q;,&q;title&q;:&q;Character&q;,&q;index&q;:&q;3.1&q;},{&q;id&q;:&q;boolean&q;,&q;title&q;:&q;Boolean&q;,&q;index&q;:&q;3.2&q;},{&q;id&q;:&q;数值类对象&q;,&q;title&q;:&q;数值类对象&q;,&q;index&q;:&q;3.3&q;},{&q;id&q;:&q;自动装箱与自动拆箱&q;,&q;title&q;:&q;自动装箱与自动拆箱&q;,&q;index&q;:&q;3.4&q;},{&q;id&q;:&q;字符串与基本数据类型转化&q;,&q;title&q;:&q;字符串与基本数据类型转化&q;,&q;index&q;:&q;3.5&q;}]},{&q;id&q;:&q;biginteger-bigdecimal&q;,&q;title&q;:&q;BigInteger BigDecimal&q;,&q;index&q;:&q;4&q;},{&q;id&q;:&q;时间日期api&q;,&q;title&q;:&q;时间日期API&q;,&q;index&q;:&q;5&q;},{&q;id&q;:&q;内部类&q;,&q;title&q;:&q;内部类&q;,&q;index&q;:&q;6&q;,&q;children&q;:[{&q;id&q;:&q;内部成员类&q;,&q;title&q;:&q;内部成员类&q;,&q;index&q;:&q;6.1&q;},{&q;id&q;:&q;局部内部类&q;,&q;title&q;:&q;局部内部类&q;,&q;index&q;:&q;6.2&q;},{&q;id&q;:&q;匿名内部类&q;,&q;title&q;:&q;匿名内部类&q;,&q;index&q;:&q;6.3&q;},{&q;id&q;:&q;静态内部类&q;,&q;title&q;:&q;静态内部类&q;,&q;index&q;:&q;6.4&q;}]},{&q;id&q;:&q;枚举类型&q;,&q;title&q;:&q;枚举类型&q;,&q;index&q;:&q;7&q;},{&q;id&q;:&q;注解类型&q;,&q;title&q;:&q;注解类型&q;,&q;index&q;:&q;8&q;,&q;children&q;:[{&q;id&q;:&q;标准注解&q;,&q;title&q;:&q;标准注解&q;,&q;index&q;:&q;8.1&q;},{&q;id&q;:&q;标准元注解&q;,&q;title&q;:&q;标准元注解&q;,&q;index&q;:&q;8.2&q;},{&q;id&q;:&q;定义注解&q;,&q;title&q;:&q;定义注解&q;,&q;index&q;:&q;8.3&q;}]}],&q;reward&q;:true,&q;copyright&q;:{&q;author&q;:&q;slacr_&q;,&q;license&q;:&q;&l;a href=\&q;https://creativecommons.org/licenses/by-nc-sa/4.0/\&q; target=\&q;_blank\&q;&g;&l;img src = \&q;/lib/cc-by-nc-sa.svg\&q;&g;&l;/a&g;&q;,&q;published&q;:&q;May 9, 2023&q;,&q;updated&q;:&q;May 9, 2023&q;},&q;reading_time&q;:&q;5144 words in 34 min&q;}}
slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[Java笔记]常用核心类内部类枚举注解

May 9, 2023Java5144 words in 34 min

Java 笔记

Object

toString()
调用对象的 toString()方法可以返回对象的字符串表示toCast. 该方法在Object类中的定义是返回包名.类名@一个十六进制整数. 如 Father@4f3f5b24. 输出函数传入类的实例默认调用. Java 类库中,有许多类覆盖了 toString()方法,输出时能够得到可理解的结果.

equals()
比较两个对象是否相等, 比较的是对象的引用. 在Java类库中的许多类也覆盖了该方法,如String类。因此,对String对象使用equals()方法的比较是字符串的内容是否相等。
在子类中,使用签名equals(ClassName obj)覆盖 equals()方法是一个常见的错误,应该使用 equals (Object obj) 覆盖 equals()方法.

hashCode()
hashCode()方法返回一个对象的哈希码 (hash code) 值,它是一个整数,主要用来比较对象的大小。在Object类中hashCode()方法的实现是返回对象在计算机内部存储的十进制内存地址.
hashCode()方法和 equals()方法必须是兼容的,如果你为一个类覆盖了equals()方法,则也需要覆盖hashCode()方法,以兼容equals()方法
java.util.Objects类的 hash()方法的参数是可变参数,该方法计算每个参数的哈希码,并将它们组合起来。这个方法是空指针安全的。
如果类包含数组类型的实例变量,比较它们的哈希码时,首先使用静态方法Arrays.hashCode()计算数组的每个元素哈希码组成的哈希码,然后将结果传给 Objects 的hash()方法.

clone()
使用 Object类的 clone()方法可以克隆一个对象,即创建一个对象的副本。要使类的对象能够克隆,类必须实现Cloneable接口.
使用 Object类继承的 clone()方法克隆对象只是做了浅拷贝。它简单地从原对象中复制所有实例变量到目标对象中。如果实例变量是基本类型或不变对象(如String), 将没有问题;否则,原对象和克隆对象将共享可变的状态。

finalize()
每个对象都有一个 finalize()方法。在对象被销毁之前,垃圾回收器允许对象调用该方法进行清理工作,这个过程称为对象终结 (finalization)。 格式为 protected void finalize() throws Throwable

Math

基本类型包装类

Character

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
Character c_1 = ('A');
Character c_2 = ('$');
Character c_3 = ('简');
System.out.println(c_1.compareTo('D')); // -3
System.out.println(c_2.charValue()); // $
System.out.println(c_3.isLetter('简')); // true
}
}

常用方法:

public char charValue() 返回 Character 对象所包含的 char值。
public int compareTo(Character anotherChar) 比较两个字符对象。如果该字符对象与参数字符对象相等,返回0;若小于参数字符,返回值小于0;若大于参数字符,则返回值大于0。
public static boolean isDigit(char ch) 返回参数字符是否是数字。
public static boolean isLetter(char ch) 返回参数字符是否是字母。
public static boolean isLowerCase(char ch) 返回参数字符是否是小写字母。
public static boolean isUpperCase(char ch) 返回参数字符是否是大写字母。
public static boolean isWhiteSpace(char ch) 返回参数字符是否是空白字符。
public static char toLowerCase(char ch) 将参数字符转换为小写字母返回。
public static char toUpperCase(char ch) 将参数字符转换为大写字母返回。
public static boolean isJavaIdentifierStart(char ch) 返回参数字符是否允许作为 Java标识符的开头字符。
public static boolean isJavaldentifierPart (char ch) 返回参数字符是否允许作为 Java标识符的中间字符。

Boolean

常用方法:

public Boolean(boolean value) 用一个boolean型值创建一个Boolean对象。
public Boolean(String s) 用一个字符串创建Boolean对象。如果字符串 s不为 null 且其值为 “true”(不区分大小写)就创建一个true值,否则创建一个 false值。
public boolean booleanValue() 返回该Boolean 对象所封装的 boolean值。
public static boolean parseBoolean(String s) 将参数s解析为一个 boolean 值。如果参数不为 null 且等于 “true”(不区分大小写),则返回true, 否则返回 false。
public static Boolean valueOf(boolean b) 将参数b 的值转换为 Boolean 对象。
public static Boolean valueOf(String s) 将参数s 的值转换为 Boolean对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
boolean b = false;
Boolean b_1 = new Boolean(b); // false
Boolean b_2 = new Boolean("TruE"); // true , 这两个方法已经不支持, 将要移除
System.out.println(b_1);
System.out.println(b_2);
System.out.println(b_1.booleanValue()); // false
System.out.println(Boolean.parseBoolean("True")); // true
System.out.println(Boolean.valueOf(b).booleanValue()); // false
System.out.println(Boolean.valueOf("OK")); // false
}
}

数值类对象

常用方法:

public Integer(int value) 使用 int类型的值创建包装类型 Integer对象。
public Integer(String s) 使用字符串构造Integer对象,如果字符串不能转换成相应的数值,则抛出NumberFormatException异常
public static String toBinaryString(int i) 返回整数i用字符串表示的二进制序列。
public static String toHexString(int i) 返回整数i用字符串表示的十六进制序列。
public static String toOctalString(int i) 返回整数 i用字符串表示的八进制序列。
public static int highestOneBit(int i) 返回整数i的二进制补码的最高位1所表示的十进制数,如7(111)的最高位的1表示的值为4。
public static int lowestOneBit(int i) 返回整数 i的二进制补码的最低位1所表示的十进制数,如10(1010)的最低位的1表示的值为2。
public static int reverse(int i) 返回将整数i的二进制序列反转后的整数值。
public static int signum(inti) 返回整数i的符号。若 i大于0,返回1;若 i等于0,
返回0,若 i小于0则返回-1。

每种包装类型都覆盖了toString()方法和 equals()方法,因此使用 equals()方法比较包装类型的对象时是比较内容或所包装值.每种包装类型的对象中所包装的值是不可改变的,要改变对象中的值必须重新生成新的对象.

每个数值包装类都定义了 SIZE、BYTES、MAX_VALUE、MIN_VALUE 常量。
SIZE 表示每种类型的数据所占的位数
BYTES 表示数据所占的字节数
MAX_VALUE 表示对应基本类型数据的最大值.
对于Byte、Short、Integer和Long 来说,MIN_VALUE 表示类型的最小值。对 Float和 Double 来说,MIN_VALUE 最小正值。
除了上面的常量外,在 Float 和 Double 类中还分别定义了 POSITIVE_INFINITY、NEGATIVE INFINITY、NaN(not a number), 它们分别表示正、负无穷大和非数值。

自动装箱与自动拆箱

Java 5 版提供了一种新的功能,称为自动装箱和自动拆箱。自动装箱 (autoboxing) 是指基本类型的数据可以自动转换为包装类的实例,自动拆箱 (unboxing) 是指包装类的实例自动转换为基本类型的数据。

1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Integer i = 300; // auto boxing
int i_1 = i; // auto unboxing
System.out.println(((Integer)i_1).toString()); // 强制转换
}
}

字符串与基本数据类型转化

public static Type parse{Type}(String s)

1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) {
String s = new String("123");
System.out.println(Integer.parseInt(s)); // 字符串转基本类型
System.out.println(Double.parseDouble(s));

int i = 100;
System.out.println(String.valueOf(i) instanceof String); // 基本类型转字符串
System.out.println(((Integer)i).toString()); // 或者通过包装类的toString()方法
}
}

BigInteger BigDecimal

如果在计算中需要非常大的整数或非常高精度的浮点数,可以使用java.math 包中定义的BigInteger类和 BigDecimal类。这两个类都扩展了Number类并实现了Comparable 接口,它们的实例都是不可变的.

https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigInteger.html

时间日期API

java.time
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/time/package-summary.html

内部类

Java 语言允许在一个类的内部定义另一个类(接口、枚举或注解),这种类称为内部类 (inner class)或嵌套类 (nested class)
使用内部类的优点:对只在一处使用的类进行分组;提高封装性;增强代码的可读性和可维护性。
有多种类型的内部类,大致可分为成员内部类、局部内部类、匿名内部类和静态内部类

内部成员类

成员内部类没有用 static修饰且定义在外层类的类体中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class OuterClass {
public class InnerClass { // 内部类相当于成员, 可以访问外部内所有成员
public int y = 1;
public int add() {
return x + y;
}
}
private int x = 2;
public static void main(String[] args) {
OuterClass o = new OuterClass();
OuterClass.InnerClass i = o.new InnerClass(); // 创建内部类

OuterClass.InnerClass ii = new OuterClass().new InnerClass(); // 或者

System.out.println(ii.add()); // 3
}
}

使用成员内部类时需要注意下面几个问题:

  1. 成员内部类中不能定义 static变量和 static方法。
  2. 成员内部类也可以使用 abstract和 final修饰,其含义与其他类一样。
  3. 成员内部类还可以使用 private、public、protected或包可访问修饰符。

局部内部类

可以在方法体或语句块内定义类。在方法体或语句块 (包括方法、构造方法、局部块、初始化块或静态初始化块)内部定义的类称为局部内部类 (local inner class)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OuterClass {
private int x = 1;
public void makeInner(int p) {
String s = "local_variable";
class InnerClass{
public void seekOuter() {
System.out.println(x);
System.out.println(s);
System.out.println(p);
}
} // 此局部类只在这个函数中有效
new InnerClass().seekOuter(); // 创建对象调用方法
}

public static void main(String[] args) {
OuterClass o = new OuterClass();
o.makeInner(2);
//1
//local_variable
//2
}
}

匿名内部类

定义类最终目的是创建一个类的实例,但如果某个类的实例只使用一次,可以将类的定义和实例的创建在一起完成,或者说在定义类的同时就创建一个实例。以这种方式定义的没有名字的类称为匿名内部类 (anonymous inner class)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstract class Person {
public String name = "slacr";
abstract public String work();
}
public class OuterClass {
private int x = 1;

public static void main(String[] args) {
// 匿名对象继承 Person, 初始化同时定义
Person hero = new Person(){
@Override
public String work() {
return "punish evil-doers";
}
};
System.out.println("Hero " + hero.name + ", I will " + hero.work());
// Hero slacr, I will punish evil-doers
}
}

匿名内部类可以继承一个类或实现一个接口, 如果实现一个接口,该类是Object类的直接子类。匿名类继承一个类或
实现一个接口不需要使用 extends 或 implements 关键字。匿名内部类不能同时继承一个类和实现一个接口,也不能实现多个接口
匿名内部类的一个重要应用是编写 JavaFX 图形界面的事件处理程序。如为按钮对象button 注册事件处理器,就可以使用匿名内部类。

静态内部类

静态内部类使用 static修饰,静态内部类也称嵌套类 (nested class)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class OuterClass {
private static int x = 1;
private static void outer() {
System.out.println(new OuterClass().getClass().getSimpleName());
}
public static class InnerClass{
private int y = 2;
public void test() {
outer();
System.out.println(x); // 可以访问外部静态成员方法和变量
System.out.println(y);
}
}

public static void main(String[] args) {
OuterClass.InnerClass i = new OuterClass.InnerClass();
// 不需要外层实例就可以直接创建一个静态内部实例
i.test();
}
}

枚举类型

枚举类型是一种特殊的引用类型,它的声明和使用与类和接口有类似的地方。它可以作为顶层的类型声明,也可以像内部类一样在其他类的内部声明,但不能在方法内部声明枚举。

任何枚举类型都隐含地继承了java.lang.Enum抽象类,Enum类又是Object类的子类,同时实现了 Comparable 接口和 Serializable接口。每个枚举类型都包含了若干方法,下面是一些常用的

public static E[] values() 返回一个包含所有枚举常量的数组,这些枚举常量在数组中是按照它们的声明顺序存储的。
public static E valueOf(String name) 返回指定名字的枚举常量。如果这个名字与任何一个枚举常量的名字都不能精确匹配,将抛出 IlegalArgumentException 异常。
public final int compareTo(Eo) 返回当前枚举对象与参数枚举对象的比较结果。
public final Class<E> getDeclaringClass() 返回对应该枚举常量的枚举类型的类对象。两个枚举常量 el、e2, 当且仅当 el.getDeclaringClass() == e2.getDeclaringClass()时,这两个枚举常量类型相同。
public final String name() 返回枚举常量名。
public final int ordinal() 返回枚举常量的顺序值,该值是基于常量声明的顺序的,第一个常量的顺序值是0,第二个常量的顺序值为1,依次类推。
public String toString() 返回枚举常量名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {
public static void main(String[] args) {
Direction left = Direction.W;
System.out.println(left);
for ( Direction d : Direction.values()) { // values() 是一个包含枚举常量的数组
System.out.println(d.name() + " " + d.ordinal());
}

// enum 配合 Switch
Direction d = Direction.values()[(int)(Math.random()*4)];
switch (d) {
case E -> System.out.println("EAST");
case S -> System.out.println("SOUTH");
case W -> System.out.println("WEST");
case N -> System.out.println("NORTH");
default -> System.out.println("error");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
enum Color {
R("RED", 1), G("GREEN", 2) , B("BLUE", 3);
private String name;
private int idx;
private Color(String name, int idx) { // 构造方法只能 private, 通过枚举具体的类型创建
this.name = name;
this.idx = idx;
}
public static String getName(int idx) {
for (Color c : Color.values()){
if(c.idx ==idx ) {
return c.name;
}
}
return null;
}
@Override
public String toString() {
return idx + " " + name;
}
}
public class Main {
public static void main(String[] args) {
Color c = Color.G; // 自动调用构造
System.out.println(c.toString());
}
}

注解类型

注解类型 (annotation type) 是 Java 5 新增的功能。注解以结构化的方式为程序元素提供信息,这些信息能够被外部工具(编译器、解释器等)自动处理.
注解有许多用途,其中包括:

  1. 为编译器提供信息。编译器可以使用注解检测错误或阻止编译警告。
  2. 编译时或部署时处理。软件工具可以处理注解信息生成代码、 XML 文件等。
  3. 运行时处理。有些注解在运行时可以被检查。
    像使用类一样,要使用注解必须先定义注解类型(也可以使用语言本身提供的注解)

注解 (annotation)和注解类型 (annotation type)。注解类型是一种特殊的接口类型,注解是注解类型的一个实例。就像接口一样,注解类型也有名称和成员。注解中包含的信息采用“键/值”对的形式,可以有零或多个“键/值”对,并且每个键有一个特定类型。没有“键/值”对的注解类型称作标记注解类(marker annotation type)。如果注解只需要一个“键/值”对,则称为单值注解类型

标准注解

Java语言规范中定义了3个注解类型,它们是供编译器使用的。这3个注解类型定义在java.lang包中,分别为@Override、@Deprecated 和 @SuppressWarnings

Override :
是一个标记注解类型, 告诉编译器此方法要覆盖父类方法.

Deprecate:
是一个标记注解类型,可以应用于某个方法或某个类型,指明方法或类型已被弃用。标记已被弃用的方法或类型,是为了警告其代码用户,不应该使用或覆盖该方法,或不该使用或扩展该类型。一个方法或类型被标记弃用通常是因为有了更好的方法或类型。当前的软件版本中保留这个被弃用的方法或类型是为了向后兼容。

SuppressWarnings:
注解指示编译器阻止某些类型的警告,具体的警告类型可以用初始化该注解的字符串来定义。该注解可应用于类型、构造方法、方法、成员变量、参数以及局部变量。它的用法是传递一个 String数组,其中包含需要阻止的警告。

常用有效参数:

  • unchecked 未检查的转换警告。
  • deprecation 使用了不推荐使用方法的警告。
  • serial 实现 Serializable 接口但没有定义 serialVersionUID 常量的警告。
  • rawtypes 如果使用旧的语法创建泛型类对象时发出的警告。
  • finally 任何 finally子句不能正常完成的警告。
  • fallthrough switch块中某个 case 后没有 break 语句的警告。

标准元注解

元注解 (meta annotation) 是对注解进行标注的注解。在java.lang.annotation包中定义Documented、Inherited、Retention 和 Target 四个元注解类型。

  1. Documented
    Documented是一种标记注解类型,用于对一个注解类型的声明进行标注,使该注解类型的实例包含在用javadoc 工具产生的文档中。
  2. Inherited
    用 Inherited标注的注解类型的任何实例都会被继承。如果 Inherited标注一个类,那么注解将会被这个被标注类的所有子类继承。
  3. Retension
    Retension 注解指明被标注的注解保留多长时间。 Retension 注解的值为 RetensionPolicy枚举的一个成员:
  • SOURCE 表示注解仅存于源文件中,注解将被编译器丢弃。
  • CLASS 表示注解将保存在类文件中,但不被JVM保存的注解,是默认值。
  • RUNTIME 表示要被JVM保存的注解,在运行时可以利用反射机制查询
  1. Target
    Target注解用来指明哪个(些)程序元素可以利用被标注的注解类型进行标注。 Target的值为java.lang.annotation.ElementType枚举的一个成员:
  • ANNOTATION_TYPE 可以对注解类型标注。
  • CONSTRUCTOR 可以对构造方法进行标注。
  • FIELD 可以对成员的声明进行标注。
  • LOCAL_VARIABLE 可以对局部变量进行标注。
  • METHOD 可以对方法进行标注。
  • PACKAGE 可以对包进行标注。
  • PARAMETER 可以对参数声明进行标注。
  • TYPE 可以对类型声明进行标注

如Override 注解类型使用了 Target 注解标注,使得 Override 只适用于方法声明.
SuppressWarnings 注解类型的声明

1
2
3
@Target (value={TYPE,FIELD,METHOD,PARAMETER, CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(value=SOURCE)
public @interface SuppressWarnings

定义注解

默认情况下,所有的注解类型都扩展了java.lang.annotation.Annotation接口。该接口定义一个返回Class对象的 annotationType()方法 Class <?extends Annotation> annotationType(), 该接口还定义了equals()方法、hashCode()方法和toString()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
String value();
}
class MyClass1 {
@MyAnnotation(value = "Hello, World!")
public void myMethod() {
// do something
}
}

public class Main {

public static void main(String[] args) throws NoSuchMethodException {
MyClass1 obj = new MyClass1();
Method method = obj.getClass().getMethod("myMethod");
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String value = annotation.value();
System.out.println(value);
}
}

在注解类型中声明的方法称为注解类型的元素,它的声明类似于接口中的方法声明,没有方法体,但有返回类型。元素的类型有一些限制,如只能是基本类型、String、枚举类型、其他注解类型等,并且元素不能声明任何参数。
实际上,注解类型的元素就像对象的域一样,所有应用该注解类型的程序元素都要对这些域实例化。这些域的值是在应用注解时由初始化器决定,或由元素的默认值决定。
在定义注解时可以使用 default 关键字为元素指定默认值。

javaxjws 包中定义了一些用来创建 Web 服务的注解类型,在 javax.xml.ws包和 javax.xml.bind.annotation 包中也定义了许多注解类型。注解类型在 Java Web 开发和Java EE 开发中被广泛使用.

参考

  1. 《Java程序设计(第3版)》 IBSN 9787302485520
  2. Java API 文档
  3. Hash值的理解,Java中hashCode()和equals究竟有什么用?
  • Author:

    slacr_

  • Copyright:

  • Published:

    May 9, 2023

  • Updated:

    May 9, 2023

Buy me a cup of coffee ☕.

1000000