廖雪峰Java教程学习笔记(一)——Java程序基础
(一)Java程序基本结构
Java是面向对象的语言,一个程序的基本单位就是class。在class内部,可定义若干方法。
类名要求:
- 类名必须以英文字母开头,后接字母,数字和下划线的组合
- 习惯以大写字母开头
方法名要求:
- 方法名必须以英文字母开头,后接字母,数字和下划线的组合
- 习惯以小写字母开头
(二)变量和数据类型
在Java中,变量分为基本类型的变量和引用类型的变量。
例如:int x = 1; //定义了一个整型int类型的变量,名为x,初始值为1
变量的一个特点是可以重新赋值,也可以赋值给其他变量。值得注意的是,在第一次定义变量时需要指定变量类型,而第二次重新赋值时,该变量已经存在了,不用再指定变量类型。
基本数据类型
- 整数类型:byte, short, int, long
- 浮点数类型:float, double
- 字符类型:char
- 布尔类型:boolean
计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit,字节的二进制表示范围为00000000~11111111,换算成二进制是0~255,换算成十六进制是00~ff。
Java基本数据类型占用的字节数
类型 | byte | short | int | long | float | double | char |
字节 | 1 | 2 | 4 | 8 | 4 | 8 | 2 |
定义基本数据类型时的注意事项
- 整型最高位的bit表示符号位(0表示正数,1表示负数)
- long型的结尾需要加L(int l = 9000000000000000000L;)
- float型的结尾需要加f(float f = 3.14f;)
- char类型使用单引号‘ ’,且仅有一个字符,字符串使用双引号“ ”
引用类型
- 常量:定义变量的时候,如果加上final修饰符,这个变量就变成了常量。常量名通常全部大写
- var关键字:省略变量类型可使用var关键字
(三)整数运算
Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。
溢出
整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,但溢出不会出错,需特别注意
自增/自减
- ++n表示先加1再引用n
- n++表示先引用n再加1
移位运算
左移实际上就是不断地乘2,右移实际上就是不断地除以2
例如:对整数7左移一位得到整数14 int n = 7; int a = n << 1;
对整数-28右移一位得到整数-14 int n = -28; int a = n >> 1;
值得注意的是
- >>>为无符号的右移运算,它的特点是不管符号位,因此对一个负数进行>>>右移,它会变成正数
- 对byte和short类型进行移位时,会首先转换为int再进行位移。
位运算
位运算就是按位进行与、或、非和异或的运算。
- 与运算(&):必须两个数同时为1,结果才为1
- 或运算(|):只要任意一个为1,结果就为1
- 非运算(~):0和1互换
- 异或运算(^):如果两个数不同,结果为1,否则为0
类型自动提升与强制转型
在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。
也可以将结果强制转型,即将大范围的整数转型为小范围的整数,例如int i = 12345; short s = (short) i;但超出范围的强制转型会得到错误的结果。
(四)浮点数运算
浮点数只能进行加减乘除这些数值运算,不能做位运算和移位运算。
虽然浮点数表示的范围大,但浮点数无法精确表示,所以浮点数运算通常会产生误差。因此在比较两个浮点数是否相等时,正确的比较方法是判断两个浮点数之差是否小于一个很小的数。
类型提升
如果参与运算的两个数其中一个是整型,那么整型可以自动提升到浮点型
溢出
整数运算在除数为0时会报错,而浮点数运算在除数为0时不会报错,但会返回几个特殊值:
- NaN表示Not a Number
- Infinity表示无穷大
- -Infinity表示负无穷大
强制转型
可以将浮点数强制转型为整数,在转型时,浮点数的小数部分会被丢掉,如果转型后超过了整数能表示的最大范围,将返回整型的最大值。如果要进行四舍五入,可以对浮点数加上0.5再强制转型。
(五)布尔运算
对于布尔类型boolean,永远只有true和false两个值。
布尔运算包括以下几类:
- 比较运算符:>, >=, <, <=, ==, !=
- 与运算:&&
- 或运算:||
- 非运算:!
短路运算
如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。因为false && x的结果总是false;对于true运算,只要确定第一个值为true,直接返回true
三元运算符
b?x:y,首先计算b,如果b为true,则只计算x,否则只计算y。且x和y的类型必须相同,因为返回值是x和y之一。
(六)字符和字符串
字符类型
字符类型char是基本数据类型,一个char保存一个Unicode字符,占两个字节。
要显示一个字符的Unicode编码,只需要将char类型直接赋值给int类型即可。
字符串类型
字符串类型String是引用类型,用双引号“ ”来表示字符串,一个字符串可存储0个到任意个字符。
常见的转义字符包括:
- \"表示字符"
- \'表示字符'
- \\表示字符\
- \n表示换行符
- \r表示回车符
- \t表示Tab
- \u####表示一个Unicode编码的字符
字符串连接
可以使用+连接任意字符串和其他类型数据,如果用+连接字符串和其他类型数据,会将其他类型数据先自动转型为字符串,再连接。
多行字符串
用"""..."""表示多行字符串,例如:
String s = """
aaa
bbbbbbbb
cc""";
不可变特性
字符串不可变,但变量名称可改变指向。
空值null
空值null表示不存在,即该变量不指向任何对象;
空字符串" "是一个有效的字符串对象,不等于null。
(七)数组类型
定义一个数组类型的变量,采用类型[]方式,例如int[ ]。但数组遍历初始化必须初始化大小,例如int[ ] ns = new int[5],必须使用new int[5]创建一个可容纳5个int元素的数组。
Java数组特点:
- 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false
- 数组一旦创建后,大小就不可改变。
值得注意的是,
- 可以通过数组索引访问数组中的某个元素,5个元素的数组,索引范围是0~4,如果索引超出范围运行时将报错;
- 可以修改数组中的某一个元素,使用赋值语句,例如ns[1] = 79;
- 可以用数组变量.length获取数组大小;
- 可以在定义数组时直接指定初始化元素,这样就不必写出数组大小,例如int[ ] ns = new int[ ]{68,79,91,85,62};也可以简写成int[ ] ns = {68,79,91,85,62};
- 数组元素也可以不是数据类型,而是引用类型,比如字符串数组。