Java基础(一)
1、常量
Java 中的 final 关键字可以用于声明属性(常量),方法和类。当 final 修饰属性时,代表该属性一旦被分配内存空间就必须初始化,它的含义是“这是无法改变的”或者“终态的”。在变量前面添加关键字 final 即可声明一个常量。在 Java 编码规范中,要求常量名必须大写。
final 数据类型 常量名 = 值;
final double PI = 3.14;
常量也可以先声明,再进行赋值,但只能赋值一次,比如:
final int FINAL_VARIABLE;
FINAL_VARIABLE = 100;
2、变量
(通常变量命名以小写开头,例如 photoName)
2.1、成员变量(在类中声明的变量)
成员变量是定义在类中,方法体之外的变量。成员变量可以不初始化直接使用,初值根据类型来,可以时0或者0.0
2.2、局部变量(在方法中声明的变量)
在方法、构造方法或者语句块中定义的变量被称为局部变量,使用前必须先初始化赋值。
2.3、类变量
也叫静态变量,类变量也声明在类中,方法体之外,但必须声明为 static 类型。
数据类型 | 默认值 | 存储格式 | 数据范围 | 包装类型 |
---|---|---|---|---|
short | 0 | 2 个字节 | -32,768 到 32,767 | Short |
int | 0 | 4 个字节 | -2,147,483,648 到 2,147,483,647 | Integer |
byte | 0 | 1 个字节 | -128 到 127 | Byte |
char | 空 | 2 个字节 | Unicode 的字符范围:\u0000(即为 0)到 \uffff(即为 65,535) | Character |
long | 0L 或 0l | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | Long |
float | 0.0F 或 0.0f | 4 个字节 | 32 位 IEEEE-754 单精度范围 | Float |
double | 0.0 或 0.0D(d) | 8 个字节 | 64 位 | IEEE-754 双精度范围 |
boolean | false | 1 位 | true 或 false | Boolean |
需要注意的是 float 类型的数值后面需要加上 F 或者 f,否则会被当成 double 类型处理。double 类型的数值可以加上 D 或 d,也可以不加。boolean类型的话只能用true或者false,不支持0和非0,且不能和其他数据类型转换。
3、字符串
3.1、计算字符串长度 length() 方法;字符串比较equals() 、equalsIgnoreCase() 方法;字符串连接 “+” 或者 concat() 方法;charAt() 方法;
charAt() 方法的作用是按照索引值(规定字符串中第一个字符的索引值是 0,第二个字符的索引值是 1,依次类推),获得字符串中的指定字符。
String s = “abc”;
char c = s.charAt(1);
则变量 c 的值是 ‘b’
int len1 = s1.length(); //计算s1的长度
String s = new String("Java");
String m = "java";
System.out.println("用equals()比较,java和Java结果为"+s.equals(m)); //equals
System.out.println("用equalsIgnoreCase()比较,java和Java结果为"+s.equalsIgnoreCase(m)); //比较字符串,但是会忽视大小写。
String s1 = "abc";
String s2 = new String("abc");
boolean b = (s1 == s2); //结果为 false
String s0 = new String("Hello ");
String s1 = "World" + "!"; //+号连接
String s2 = s0.concat(s1); //concat()方法连接
-
结论1.基本类型没有 equals() 方法,只有 “==” 比较,比较的是值。
-
结论2.所有对象的 “==” 比较都是内存地址的比较。
-
结论3:自定义对象的equals比较方式取决于equals方法;如果没有重写,比较的就是引用;如果进行了重写,那么比较规则取决于equals体。
3.2、字符串常用的提取方法
String是个常量,从一出生就注定不可变
类型 | 方法 | 作用 |
---|---|---|
基本操作 | int length() | 获取字符串的长度 |
基本操作 | int indexOf(String str) | 返回指定字符在此字符串中第一次出现的索引 |
基本操作 | int lastIndexOf(String str) | 返回指定字符在此字符串中最后一次出现的索引 |
基本操作 | int charAt(int index) | 返回字符串中index位置上的字符,其中index的取值范围式:0~(字符串长度-1) |
转换操作 | char[] toCharArray() | 将此字符串转换为一个字符数组 |
转换操作 | toString() | 转换为字符串类型 |
转换操作 | String valueOf(int num) | 将int类型的数转换为字符串 |
转换操作 | String toLowerCase() | 将String中的所有字符都转换为小写 |
转换操作 | String toUpperCase() | 将String中的所有字符都转换为大写 |
替换与去除 | String replace(char oldChar,char newChar) | 用newChar替换所有oldChar的字符得到一个新的字符串 |
替换与去除 | String replaceAll(String regex,String replacement) | |
替换与去除 | String trim() | 去除源字符串中首尾的空格 |
截取和分割 | String[] split(String regex) | 根据参数regex将原来的字符串分割成为若干个字符串 |
截取和分割 | String substring(int beginIndex) | 截取从索引beginIndex后的所有字符,包不包括beginIndex? |
截取和分割 | String substring(int beginIndex,int endIndex) | 截取从beginIndex到endIndex索引之间的字符,边界包括谁? |
判断操作 | boolean equals(Object anObject) | 与指定字符串比较是否相等 |
判断操作 | boolean startWith(String prefix) | 判断此字符串是否以指定的字符串开始 |
判断操作 | boolean endWith(String prefix) | 判断此字符串是否以指定的字符串结束 |
判断操作 | boolean contains(CharSequence s) | 判断此此字符串是否包含指定的字符序列 |
判断操作 | boolean isEmpty() | 判断当前字符串的长度是否为0 |
方法 | 返回值 | 功能描述 |
---|---|---|
indexOf(char ch) | int | 搜索字符 ch 第一次出现的索引 |
indexOf(String value) | int | 搜索字符串 value 第一次出现的索引 |
lastIndexOf(char ch) | int | 搜索字符 ch 最后一次出现的索引 |
lastIndexOf(String value) | int | 搜索字符串 value 最后一次出现的索引 |
substring(int index) | String | 提取从位置索引开始到结束的字符串 |
substring(int beginindex, int endindex) | String | 提取 beginindex 和 endindex 之间的字符串部分 |
trim() | String | 返回一个前后不含任何空格的调用字符串的副本 |
说明:在字符串中,第一个字符的索引为 0,子字符串包含 beginindex 的字符,但不包含 endindex 的字符。
String s = "abcdefabc";
System.out.println("字符a第一次出现的位置为"+s.indexOf('a'));
System.out.println("字符串bc第一次出现的位置为"+s.indexOf("bc"));
System.out.println("字符a最后一次出现的位置为"+s.lastIndexOf('a'));
System.out.println("从位置3开始到结束的字符串"+s.substring(3));
System.out.println("从位置3开始到6之间的字符串"+s.substring(3,6));
字符a第一次出现的位置为0
字符串bc第一次出现的位置为1
字符a最后一次出现的位置为6
从位置3开始到结束的字符串defabc
从位置3开始到6之间的字符串def
4、运算符
4.1、算术运算符
表格中的例子中,变量 a 的值为 5,变量 b 的值为 3,变量 i 的值为 1
算术运算符 | 名称 | 描述 | 类型 | 举例 |
---|---|---|---|---|
+ | 加法 | 相加运算符两侧的值 | 双目运算符 | a + b 等于 8 |
- | 减法 | 左操作数减去右操作数 | 双目运算符 | a - b 等于 2 |
* | 乘法 | 相乘操作符两侧的值 | 双目运算符 | a * b 等于 15 |
/ | 除法 | 左操作数除以右操作数 | 双目运算符 | a / b 等于 1 |
% | 取余 | 左操作数除右操作数的余数 | 双目运算符 | a % b 等于 2 |
++ | 自增 | 操作数的值增加 1 | 单目运算符 | ++i(或 i++) 等于 2 |
– | 自减 | 操作数的值减少 1 | 单目运算符 | –i(或 i–) 等于 0 |
int a = 5;
System.out.println("a++ = " + (a++));
System.out.println("++a = " + (++a));
a++ = 5
++a = 7
4.2、位运算符
位运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
& | 按位与 | 如果相对应位都是 1,则结果为 1,否则为 0 | (a&b),得到 12,即 0000 1100 |
丨 | 按位或 | 如果相对应位都是 0,则结果为 0,否则为 1 | ( a 丨 b )得到 61,即 0011 1101 |
^ | 按位异或 | 如果相对应位值相同,则结果为 0,否则为 1 | (a^b)得到 49,即 0011 0001 |
~ | 按位补 | 翻转操作数的每一位,即 0 变成 1,1 变成 0 | (〜a)得到 -61,即 1100 0011 |
<< | 按位左移 | 左操作数按位左移右操作数指定的位数 | a<<2 得到 240,即 1111 0000 |
>> | 按位右移 | 左操作数按位右移右操作数指定的位数 | a>>2 得到 15 即 1111 |
>>> | 按位右移补零 | 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 | a>>>2 得到 15 即 0000 111 |
int a = 60;
int b = 13;
System.out.println("a & b = " + (a & b));
System.out.println("a | b = " + (a | b));
System.out.println("a ^ b = " + (a ^ b));
System.out.println("~a = " + (~a));
System.out.println("a << 2 = " + (a << 2));
System.out.println("a >> 2 = " + (a >> 2));
System.out.println("a >>> 2 = " + (a >>> 2));
a & b = 12
a | b = 61
a ^ b = 49
~a = -61
a << 2 = 240
a >> 2 = 15
a >>> 2 = 15
4.3、逻辑运算符
逻辑运算符 | 名称 | 描述 | 类型 | 举例 |
---|---|---|---|---|
&& 或 & | 与 | 当且仅当两个操作数都为真,条件才为真 | 双目运算符 | (a && b) 或 (a & b) 为假 |
|| 或 | | 或 | 两个操作数任何一个为真,条件为真 | 双目运算符 | (a |
! | 非 | 用来反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将得到假 | 单目运算符 | (!a)为假 |
^ | 异或 | 如果两个操作数逻辑相同,则结果为假,否则为真 | 双目运算符 | (a ^ b) 为真 |
" && " 与 " || "是具有短路性质,而 “&” 没有,当按优先级顺序计算到当前表达式时,表达式的结果可以确定整个表达式的结果时,便不会继续向后进行判断和计算,而直接返回结果。
4.4、关系运算符 (生成值为布尔类型)
比较运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
== | 等于 | 判断两个操作数的值是否相等,如果相等则条件为真 | (a == b) 为 false |
!= | 不等于 | 判断两个操作数的值是否相等,如果值不相等则条件为真 | (a != b) 为 true |
> | 大于 | 判断左操作数的值是否大于右操作数的值,如果是那么条件为真 | (a > b) 为 false |
< | 小于 | 判断左操作数的值是否小于右操作数的值,如果是那么条件为真 | (a < b) 为 true |
>= | 大于等于 | 判断左操作数的值是否大于或等于右操作数的值,如果是那么条件为真 | (a >= b) 为 false |
<= | 小于等于 | 判断左操作数的值是否小于或等于右操作数的值,如果是那么条件为真 | (a <= b) 为 tr |
三目运算符:
布尔表达式 ?表达式 1 : 表达式 2;
int a = 3;
int b = 5;
System.out.println("a > b ? a : b = " + (a > b ? a : b));
a > b ? a : b = 5
5、java方法
5.1、类方法(静态方法,用static修饰)
类方法可以被类创建的对象调用,也可以直接通过类名调用。
5.1.1、工厂方法
静态方法还有另外一种常见的用途。类似 LocalDate和 NumberFormat的类使用静态工厂方法( factory method)来构造对象。你已经见过工厂方法 LocalDate.now和 LocalDate.of。NumberFormat类如下生成不同风格的格式化对象:
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter = NumberFormat.getPercentInstance();double x = 0.1;
System.out.println(currencyFormatter.format(x));// prints $0.10
System.out.println(percentFormatter.format(x));// prints 10%
为什么NumberFormat类不利用构造器完成这些操作呢?这主要有两个原因:
- 无法命名构造器。构造器的名字必须与类名相同。但是,这里希望有两个不同的名字,分别得到货币实例和百分比实例。
- 使用构造器时,无法改变所构造对象的类型。而工厂方法实际上将返回DecimalFormat类的对象,这是NumberFormat的一一个子类(有关继承的更多详细内容请参看第5章)。
5.2、实例方法
实例方法只能由对象来调用。