# Java_learning **Repository Path**: Ethanyan/Java_learning ## Basic Information - **Project Name**: Java_learning - **Description**: some demo and note - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-10-03 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Java 基础

作者:小闫同学

公众号:全栈技术精选 学习一门语言,第一件事当然是输出 `Hello Wrold`,下面使用 `Java` 编写一个最简单的应用程序: ```java public class FirstSample { public static void main(String[] args) { System.out.println("Hello Wrold!"); } } ``` **注意事项:** 1.Java 对大小写敏感。 2.`public` 为访问修饰符,此处简单理解为它用于控制程序的其他部分对这段代码的访问级别。 3.`class` 为类,表明 Java 程序中的全部内容都包含在类中。 4.关键字 `class` 后面紧跟类名。 > 类名定义规则:名字以字母开头,后面可以跟字母和数字的任意组合,每个单词首字母大写。长度不受限制。同 Python,起名不能使用 Java 的保留字,如 public 等。(凡事讲究先来后到) > > 如果你有一些编程基础,那么可以理解为它符合驼峰命名规则。 5.在文件中书写完上述代码后,文件需命名为 `FirstSample.java` > **源代码的文件名必须与公共类的名字相同,且大小写一定要注意!!!** 6.Java 中代码块都是以大括号包裹起来的。 ## 1.输出 上面已经有了最简单的输出方式: ```java System.out.println(); ``` 它使用了 `System.out` 对象的 `println` 方法。类似于 Python 中的 `print()` > 如果你想输出语句后,不执行换行的效果,可以使用 `System.out` 对象的 `print`方法。类比 Python 中如下代码: > > ```python > print("xxx", end="") > ``` 下面测试一下: ```java public class HelloDemo { public static void main(String[] args) { // 尝试 println 方法 System.out.println("hello world"); System.out.println("Ethan"); // 尝试 print 方法 System.out.print("hello world"); System.out.print("Ethan"); } } ``` 最后输出结果为: ```java hello world Ethan hello worldEthan ``` > 可看出 println 自带换行效果,print 则无此效果。 ## 2.注释 注释为了让日后自己还能看懂自己的代码,或者让别人接盘。下面看一下 Java 中是如何书写注释的: ### 2.1 单行注释 单行注释使用符号 `//`,其注释内容从 `//` 开始到本行结束,例: ```java // 我是单行注释 ``` ### 2.2 多行注释 多行注释使用符号 `/**` 开始,符号 `*/` 结束。例如: ```java /** * 这是多行注释 * 为了表明多行,这是第2行 * 这是第3行 */ ``` > 也许你会好奇,为什么每一行注释前还有一个 `*` 号,这是使用编辑器 `IDEA` 时输入 `/**` 后按回车键自动生成的效果。 ## 3.数据类型 Java 是一种强类型语言,即在使用变量前需声明其类型。在 Java 中共有 8 中基本数据类型,其中 4 种整型、2种浮点类型、1种用于表示 Unicode 编码的字符单元的字符类型 char 和一种用于表示真值的布尔类型 boolean。 ### 3.1 整型 #### long 类型 long 类型同样有正负,存储时占用 8 字节,其取值范围为 `-2^63` 到 `2^63-1` ```java long l = 100000L long l1 = -100000L ``` > "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。 > 这种类型主要使用在需要比较大整数的系统上 #### int 类型 int 是我们最熟悉的整数,可表示正负。存储时占用 4 字节。取值范围为 `-2^31` 到 `2^31-1 ` ```java int a = 100000 int a1 = -520000 ``` > 一般地整型变量默认为 int 类型 #### short 类型 short 也有正负之分,存储时占用 2 字节,其取值范围为 `-2^15` 到 `2^15-1` ```java short s = 100 short s1 = -1000 ``` > short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一 #### byte 类型 byte 类型可表示正负,存储时占用 1 字节,其取值范围为 `-2^7` 到 `2^7-1` ```java byte b = 50 byte b = -50 ``` > byte 类型用在大型数组中节约空间,主要代替整数,因为byte 变量占用的空间只有 int 类型的四分之一; ### 3.2 浮点类型 #### float 类型 float 类型表示单精度小数,存储时占用 4 字节。它在存储大型浮点数组时可节省内存空间,但是其**不能用来表示精确的值**。 ```java float f1 = 234.5f ``` #### double 类型 double 数据类型是双精度小数,存储时占用 8 字节。浮点数默认类型便是 double 类型,同样,它也**不能用来表示精确的值**,如货币。 ```java double d1 = 123.4b ``` > 因为 double 是默认类型,所以数字末尾的 `b ` 写不写均可 ### 3.3 char 类型 char 类型用来表示单个字符,如 `'A'` 是编码 65 对应的字符常量。注意它不是字符串。Unicode 编码单元可以表示为十六进制值,其范围为 `\u0000` 到 `\Uffff`。 > 通常用来表示字符常量。 ### 3.4 布尔类型 布尔类型只有两个值,便是 `True` 和 `False` > **注意:**Java 中与 Python 中不同。Python 中与 C++ 中类似,数值 0 可以代替 `False` ,非 0 表示 `True` 而 Java中不可以! ## 4.变量 与 Python 中不同,Java 在使用变量时需要先声明,然后再进行初始化。可以是如下方式: ```java float nice; nice = 0.1f; ``` 也可以是如下方式: ```java int a = 1; ``` ### 4.1 变量类型 1.**类变量**:位于类内,方法外。使用 `static` 修饰 > 类变量也被称为静态变量。 > > 一个类无论创建了多少个对象,类都只拥有类变量的一份拷贝。 > > 类变量在第一次被访问的时候创建,程序执行完毕后销毁。 > > 类变量可以通过 `类名.变量名` 的方式访问。 > > 类变量被声明为 public、static、final 类型的时候,名称使用大写字母。 > > 类变量有默认值,如果是数值默认为0,如果是布尔默认为false,引用类型则默认为null。 > > 类变量的值既可以在声明的时候指定,也可以在方法中指定。 2.**实例变量**:位于类内,方法外,但是没有 `static` 修饰 > **生命周期**:在创建对象的时候创建,在对象销毁时随之销毁。 > > 实例变量必须至少被一个方法引用,使得调用者能够获取实例变量的值。 > > 实例变量可以被访问修饰符修饰。 > > 实例变量可以声明再使用前,也可以声明再使用后。 > > 实例变量可以通过变量名访问,但在静态方法或者其他类中就需要使用其对象获取变量名进行访问。 > > 实例变量一般设为私有如 `private String name`,表示其仅在该类可见。 > > 实例变量有默认值,如果是数值默认为0,如果是布尔默认为false,引用类型则默认为null。 > > 实例变量的值既可以在声明的时候指定,也可以在方法中指定。 3.**局部变量**:位于类的方法内。 > **生命周期**:在变量所在方法被执行时创建,执行完毕后死亡。 > > 局部变量没有默认值,必须经过声明和初始化才可被使用。 ```java public class Variable{ static float fl=0.1f; // 类变量 int i =3; // 实例变量 public void func(){ String str="Ethan"; // 局部变量 } } ``` ## 5.常量 Java 中设置常量有些特殊,并不像 Python 中直接赋值即可,需要利用关键字 final 指示。如下: ```java final double CONSTANT = 2.65 ``` **注意:**使用关键字 final 修饰的常量不能被修改,只能用一次。而且常量名一般全使用大写。 与变量一致,常量也可以设置类常量,将其定义在 `main` 方法的外部,可以供类内所有方法使用。形式如下: ```java public static final double CONSTANT = 2.65 ``` > const 是 Java 保留的关键字,因此自己不可使用。 ## 6.Java 修饰符 Java 的修饰符是用来定义类、方法或者变量的关键字,通常放在语句的最前端。主要分为两类,一类是访问修饰符,一类是非访问修饰符。 ### 6.1 访问控制修饰符 **default**:此修饰符为**默认访问修饰符**(不使用修饰符的情况下,默认为此修饰符)。使用默认访问修饰符声明的变量和方法,对在同一个包内的类是可以使用访问的。同时,此接口中的变量都默认声明为`public static final`,方法则默认权限为 `public`。 ```java String version = "1.1.0"; boolean processOrder() { return true; } ``` **private:**此修饰符为**私有访问修饰符**。它声明的方法、构造方法和变量都只能被所在的类内访问。声明为私有访问类型的变量只能通过类中公共的 `getter` 方法被外部类访问,而且类和接口不能声明为 `private` 。 > 私有访问修饰符是为了安全起见,保护私有内容不被访问,从而泄漏代码。 **public:**此修饰符为**共有访问修饰符**。被它声明的类、方法、构造方法和接口都能被其他任何类访问。如果需要使用其他包内的类,那么就需要导入了。还有一点,类所有的公有方法,都如同 Python 一样,可以被其子类继承。 > Java 中的 main() 方法必须设置成共有的,否则解释器不能运行。 **protected:**此修饰符为**受保护的访问修饰符**。此修饰符需分两种情况来分析说明:第一种是子类和基类在同一个包中时,包中的类可以访问任何声明为 protected 的方法、构造器和变量等;第二种是子类和基类不在同一包中时,子类实例对象可以访问其从基类继承的被声明为 protected 方法,而不能访问基类实例对象的 protected 方法。有点绕,好好理解一下。 protected 可以修饰数据成员、构造方法和方法,但是不能修饰类,当然,内部类不算。接口和接口的成员变量以及成员方法不能声明为 protected。 > 详解可看文章https://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html #### 访问控制和继承 1.父类中声明为 public 的方法在子类中也必须为 public。 2.父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。 3.父类中声明为 private 的方法,不能够被继承。 ### 6.2 非访问修饰符 1.`static` 修饰符,用来修饰类方法和类变量。 2.`final` 修饰符,用来修饰类、方法和变量。final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。 > final 修饰符通常和 static 修饰符一起使用来创建类常量。 3.`abstract` 修饰符,用来创建抽象类和抽象方法。 > 一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。 4.`synchronized` 和 `volatile` 修饰符,主要用于线程的编程。 > synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。 > > 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。 > > volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 #### 抽象类和抽象方法 **抽象类**顾名思义,是抽象的,不能创建实例对象。它存活的唯一理由就是为了将来对该类进行扩充。抽象类中可以包含抽象方法也可以包含非抽象方法。如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。 **抽象方法**就是没有实现,只是有这么个方法,具体实现在子类中书写。抽象方法不能被声明成 final 和 static。任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。抽象方法的声明以分号结尾,例如: ```java public abstract sample(); ``` ## 7.Java 运算符 ### 7.1算术运算符 加减乘除与 Python 中一致,分别为 `+-*/`。取余为 `%`。不同的有以下两种,分别为自增和自减。 自增为`++`,自减为`--`。即一个数字加1或者减1。 ```java public class HelloDemo { public static void main(String[] args) { // 运算符 int i1 = 10; int i2 = 22; int i3 = 25; int i4 = 66; System.out.println("i1 + i2 = " + (i1 + i2)); System.out.println("i3 - i2 = " + (i3 - i2)); System.out.println("i4 * i1 = " + (i4 - i1)); System.out.println("i2 / i1 = " + (i2 / i1)); // 自增自减 ++i1; System.out.println(i1); --i1; System.out.println(i1); } } ``` **详解自增/自减:** ```java int b = ++a; ``` > 上述过程其实为两步,第一步为加 1 后重新赋值,第二步为将新值 a 赋值给 b。 ```java int b = a++ ``` > 此过程与之前不同,它是先将 a 赋值给 b,然后 a 自增操作。 **自减同理** ### 7.2 关系运算符 关系运算符即比较两个数值之间的关系,如大小等。与 Python 中相同的为 `==` 表示相等;`!=` 表示不相等;`>` 表示大于;`<` 表示小于;`>=` 表示大于等于;`<=` 表示小于等于。 ```java public class HelloDemo { public static void main(String[] args) { int s = 10; int n = 20; System.out.println("s == n = " + (s == n) ); System.out.println("s != n = " + (s != n) ); System.out.println("s > n = " + (s > n) ); System.out.println("s < n = " + (s < n) ); System.out.println("n >= s = " + (n >= s) ); System.out.println("n <= s = " + (n <= s) ); } } ``` ### 7.3 位运算符 位运算符即将十进制等数字转换为二进制数字后,对每一个位置上字符进行操作。如下示例,大家可以理解一下: ```java A = 0011 1100 B = 0000 1101 ----------------- A&B = 0000 1100 A | B = 0011 1101 A ^ B = 0011 0001 ~A= 1100 0011 ``` | 操作符 | 描述 | | :----- | :----------------------------------------------------------- | | & | 如果相对应位都是1,则结果为1,否则为0 | | \| | 如果相对应位都是 0,则结果为 0,否则为 1 | | ^ | 如果相对应位值相同,则结果为0,否则为1 | | 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | | << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | | >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | | >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | ### 7.4 逻辑运算符 逻辑运算符即与或非关系。与 Python 不同,`&&` 表示与关系;`||` 表示或关系;`!` 表示非关系。 ### 7.5 赋值运算符 下面列出 Java 中的赋值运算符: | 操作符 | 描述 | | :----- | :----------------------------------------------------------- | | = | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | | + = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | | - = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | | * = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | | / = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | | (%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | | << = | 左移位赋值运算符 | | >> = | 右移位赋值运算符 | | &= | 按位与赋值运算符 | | ^ = | 按位异或赋值操作符 | | \| = | 按位或赋值操作符 | ### 7.6 三元运算符 Java 中三元运算符与 Python 中大不一样,其表示为: ```java 类型 变量 = 表达式 ? 如果条件为真时的操作 : 条件为假时的操作 ``` **关键在于符号 `?:`** ### 7.7 instanceof 运算符 它是用来判断某个变量是否为某类型或者某个对象是否为某类或者接口的一个对象。如果是为真。例如: ```java String name = "Ethan"; boolean result = name instanceof String; class Vehicle {} public class Car extends Vehicle { public static void main(String[] args){ Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println( result); } } ``` ### 7.8 运算符优先级 运算符优先级是如果代码中包含多种运算符,那么优先执行谁的问题。其如数学,有括号先括号(小括号优先于中括号),乘除优先于加减等等。 下面附网上一个表格,具有最高优先级的运算符在表的最上面,最低优先级的在表的底部,以供大家忘记时进行查看: | 类别 | 操作符 | 关联性 | | :------- | :----------------------------------------- | :------- | | 后缀 | () [] . (点操作符) | 左到右 | | 一元 | + + - !〜 | 从右到左 | | 乘性 | * /% | 左到右 | | 加性 | + - | 左到右 | | 移位 | >> >>> << | 左到右 | | 关系 | >> = << = | 左到右 | | 相等 | == != | 左到右 | | 按位与 | & | 左到右 | | 按位异或 | ^ | 左到右 | | 按位或 | \| | 左到右 | | 逻辑与 | && | 左到右 | | 逻辑或 | \| \| | 左到右 | | 条件 | ?: | 从右到左 | | 赋值 | = + = - = * = / =%= >> = << =&= ^ = \| = | 从右到左 | | 逗号 | , | 左到右 | ## 8.循环 循环即将相同的逻辑多次执行。与 Python 相同,它也有 while 循环和 for 循环,但是其比 Python 多了一种 `do...while` 循环。下面即详细看看。 ### 8.1 while 循环 先来看其基本语法,即布尔表达式为 True 时循环一直执行。 ```java while( 布尔表达式 ) { // 循环执行逻辑 } ``` 示例如下: ```java public class Test { public static void main(String args[]) { // while 循环 int int1 = 10; while (int1 > 0) { System.out.println(int1); int1--; } } } ``` ### 8.2 for 循环 for 循环如同 Python 中的 for 循环一样,生来就是简化代码操作的。 ```java for(初始化; 布尔表达式; 更新) { // 代码语句 } ``` 大家看到上述语法也许有些懵逼,我们类比 Python 中的 for 循环进行解读。Python 中: ```python for i in range(3): print(i) ``` 要想达到同样的效果,Java 中代码如下: ```java public class Test{ public static void main(String args[]) { // for 循环 for (int x = 0; x < 3; x = x + 1){ System.out.println(x); } } } ``` 即在 for 后的括号中,先填写一个控制循环的变量,再填写一个判断条件,最后更新变量值已达到控制循环的目的。 > 从上述代码可以看出 Java 确实代码量比 Python 多一点。 **增强 for 循环:** 大家想起 Python 中有如下操作: ```python namelist = ['Ethan', 'yan', 'liang'] for name in list: print(name, end=",") ``` 可以循环遍历姓名列表并且打印输出,那么 Java 中呢?Java 从 Java5 的时候引入了一种方式,称为增强操作,写为如下: ```java public class Test { public static void main(String args[]){ // 增强for循环 String [] namelist = {"Ethan", "yan", "liang"}; for (String name: namelist) { System.out.print(name); System.out.print(","); } } } ``` **注意:**其中列表并不是中括号,而是大括号。`print()` 函数打印输出后不会执行换行操作。 ### 8.3 do... while 循环 此循环与 while 循环类似,不同点在于 `do...while` 循环至少执行一次。(如判断条件不满足,while 循环不会执行,但是 do...while 循环会执行一次)先来看起语法: ```java do { // 代码语句 }while( 布尔表达式 ) ``` 其实从代码中即可分析出原因,因为代码块先执行,条件表达式后执行。 ```java public class Test { public static void main(String args[]) { int a = 10; do { System.out.println(a); a--; }while (a<0); } } ``` 上例中 while 的判断条件不满足,如果是 while 循环的话则不会执行;而上述例子大家可以进行验证,会返回 10。 ### 8.4 终止循环 与 Python 中相同,Java 中也有两个关键字用来终止循环,一个为 break,一个为 continue。 **break:**终止当前循环。 **continue:**终止本次循环。(比如循环输出1到10,在7的时候遇到了语句 continue,那么7不会输出,而8、9等正常输出) ## 9.条件语句 ### 9.1 if 我们来看一下最简单的 if 语句如何书写: ```java if( 布尔表达式 ) { // 布尔表达式为true时执行的语句 } ``` 示例如下: ```java public class Test{ public static void main(String args[]){ // if ... else int i = 1; if(i==1){ System.out.println("值为1"); } } } ``` > Java 中字符串用双引号包裹。 ### 9.2 if...else 语法为: ```java if(布尔表达式){ //如果布尔表达式的值为true }else{ //如果布尔表达式的值为false } ``` 过于简单,不再示例。 ### 9.3 if...else if...else 此为多条件判断情况,语法如下: ```java if(布尔表达式 1){ //如果布尔表达式 1的值为true执行代码 }else if(布尔表达式 2){ //如果布尔表达式 2的值为true执行代码 }else if(布尔表达式 3){ //如果布尔表达式 3的值为true执行代码 }else { //如果以上布尔表达式都不为true执行代码 } ``` 类比于 Python 中的语法: ```python if 条件: 条件为真时执行 elif 条件2: 条件为真时执行 else 条件3: 条件都不满足时执行 ``` 其实 `elif` 就是 `else if` 的缩写。 当然,Java 中的条件语句也**支持嵌套操作**。 ## 10.Java switch case 语句 接下来要看一个全新的语句,那便是 `switch case` 。它的功能是你传入一个变量,然后这个变量会与一系列的值进行比较,每一个值都是一个分支,它与条件判断语句类似。首先来看一下语法: ```java switch(变量){ case 值 : // 执行逻辑 break; // 此语句可选 case 值 : // 执行逻辑 break; // 此语句可选 default : // 可选 // 语句 } ``` 咋看有些恐怖,很复杂,其实不然,我们结合一个实例来理解其功能。 ```java public class Test { public static void main(String args[]){ // swith 语句 String monthly_income = "5000~7000"; switch (monthly_income){ case "1000~3000": System.out.println("哥们儿你过得水深火热啊~"); break; case "3000~5000": System.out.println("哥们儿奔小康了~"); break; case "5000~7000": System.out.println("哥们儿你的生活美滋滋~"); break; default: System.out.println("哥们儿这么有钱的吗?"); } } } ``` 首先定义了一个人的月收入为 `5000~7000`,那么根据上述程序会输出什么呢?看看吧: ```java 哥们儿你的生活美滋滋~ ``` 借此我们来看一下语句是如何运行的。 首先需要一个变量,这个变量的类型可以是 `byte`、`short`、`int` 或者是 `char`。但是从 JavaSE7 开始呢,添加了一个字符串 String 类型。然后这个变量会挨个与 case 后方的值进行比较,直到相等(变量类型需相同,而且必须是常量或者字面常量) > 字母常量是类型为简单类型、String类型和空类型的值在源程序中的表现。 如果都不相等,那么会输出 default 中的语句。在每个 case 语句中如果遇到 `break` 会终止执行,否则继续比较,但是 default 分支是不需要 break 语句的。 此语句与条件判断语句类似,但仅仅表示相等的情况。 ## 11.Number 和 Math 类 Java 中有两个常用的类,那便是 Number 和 Math 类。官方封装这两个类并不是吃饱了撑的,而是考虑到实际开发过程中,经常需要对象,所以为内置数据类型提供其包装类。它们有 Integer、Long、Byte、Double、Float 以及 Short。 > Number 类属于 java.lang 包。 它可以如同内置数据类型直接用来声明变量: ```java Integer num = 10; ``` 那么 **Math** 类呢? Math 类顾名思义,包含大量的数学运算的方法以及属性等。常见的对数、三角函数等都有。 ## 12.Character 类 Character 类其实就是对基本数据类型 char 的包装,为了更好的面向对象,并为此类创建的对象提供了一系列非常方便的方法。我们向来回忆一下之前 char 类型的值如何声明定义: ```java char c = 'a'; ``` 再来看使用 Character 类的效果: ```java Character c = new Character('a'); ``` 上面是通过创建对象的方式,下面还有简化版: ```java Character c = 'a'; ``` 这样是不是同基本数据类型差不多了呢?上述的方式还有个名字,称为**装箱**。 > 装箱:自动的将基本数据类型转化为包装器类型。 > > 拆箱:自动的将包装器类型转换为基本数据类型。 ```java // 装箱 Character c = 'a'; // 拆箱 char ch = c; ``` ### 12.1 转移字符 同 Python 中类似,转移字符即前方带有反斜杠`\`的字符。比如 `\"` 代表 `"` 本身,而非字符串的含义。另外一些常用的转移序列有: 1.tab 键:`\t` 2.删除键:`\b` 3.换行符:`\n` 4.回车键:`\r` 5.单引号:`\'` 6.双引号:`\"` 7.反斜杠:`\\` ### 12.2 Character 方法 下面列举一些常用的 Character 方法: `isLetter()`看其是否为一个字母;`isDigit()` 看其是否为一个数字字符;`isWhitespace()`看其是否为一个空白字符;`isUpperCase()` 看其是否为大写字母;`isLowerCase()` 看其是否为小写字母;`toUpperCase()` 指定字母的大写形式;`toLowerCase()` 指定字母的小写形式;`toString()` 返回字符的字符串形式,字符串的长度为 1。