到头来还是逃不开Java - Java13程序基础
java程序基础
没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删
引言
兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来。所以奉劝大家,面向对象还是要掌握一门,虽然Python好写舒服,但是毕竟不能完全面向对象,也没有那么多的应用场景,所以,奉劝看到本文的各位,还是提前学好C#或者Java。
Java程序的基本结构
-
每个Java程序只能有一个public修饰的类,并且该类的名字要和该Java程序文件同名。
-
Java入口程序规定的方法必须是静态方法,方法名必须为
main
,括号内的参数必须是String数组。
public static void main(String[] args) { // 方法名是main
// 方法代码...
} // 方法定义结束
-
类名首字母大写,方法名首字母小写。
-
Java的每一行语句必须以分号结束。
-
特殊的多行注释需要写在类和方法的定义处,可以用于自动创建文档。
/**
* 可以用来自动创建文档的注释
*
* @auther liaoxuefeng
*/
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
- Eclipse IDE提供了快捷键
Ctrl+Shift+F
(macOS是⌘+⇧+F
)帮助我们快速格式化代码的功能。
变量和数据类型
-
Java中,变量分为两种:基本类型的变量和引用类型的变量。
-
在Java中,变量必须先定义后使用,在定义变量的时候,可以给它一个初始值。
-
不写初始值,就相当于给它指定了默认值。默认值总是
0
。 -
不同的数据类型占用的字节数不一样,
byte
恰好就是一个字节,而long
和double
需要8个字节。
┌───┐
byte │ │
└───┘
┌───┬───┐
short │ │ │
└───┴───┘
┌───┬───┬───┬───┐
int │ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
long │ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┬───┬───┐
float │ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
double │ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┐
char │ │ │
└───┴───┘
-
在Java中的整形,和他们的取值范围
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
public class Main {
public static void main(String[] args) {
int i = 2147483647;
int i2 = -2147483648;
int i3 = 2_000_000_000; // 加下划线更容易识别,而且不会有错
int i4 = 0xff0000; // 十六进制表示的16711680
int i5 = 0b1000000000; // 二进制表示的512
long l = 9000000000000000000L; // long型的结尾需要加L
System.out.println(i3);
}
}
- 浮点型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的
float f1 = 3.14f;
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
double d = 1.79e308;
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科学计数法表示的4.9x10^-324
-
布尔类型
boolean
只有true
和false
两个值,布尔类型总是关系运算的计算结果- Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把
boolean
表示为4字节整数。
- Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把
-
字符类型
char
表示一个字符。Java的char
类型除可表示标准的ASCII外,还可以表示一个Unicode字符。- 注意
char
类型使用单引号'
,且仅有一个字符,要和双引号"
的字符串类型区分开。
- 注意
-
定义变量的时候,如果加上
final
修饰符,这个变量就变成了常量:
final double PI = 3.14; // PI是一个常量
double r = 5.0;
double area = PI * r * r;
PI = 300; // compile error!
-
常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。
-
var关键字
StringBuilder sb = new StringBuilder();
var sb = new StringBuilder();//类型的名字太长了
-
变量的作用范围
- 而在语句块中定义的变量,它有一个作用域,就是从定义处开始,到语句块结束。
整数运算
-
遵循四则运算规则,可以使用任意嵌套的小括号
-
整数的数值表示不但是精确的,而且整数运算永远是精确的,即使是除法也是精确的,因为两个整数相除只能得到结果的整数部分:
-
求余运算使用
%
-
整数的除法对于除数为0时运行时将报错,但编译不会报错。
-
整数由于存在范围限制,如果计算结果超出了范围,就会产生
溢出
,而溢出不会出错,却会得到一个奇怪的结果。 -
自增/自减
- Java还提供了
++
运算和--
运算,它们可以对一个整数进行加1和减1的操作:
- Java还提供了
-
如果对一个负数进行右移,最高位的
1
不动,结果仍然是一个负数: -
还有一种不带符号的右移运算,使用
>>>
,它的特点是符号位跟着动,因此,对一个负数进行>>>
右移,它会变成正数,原因是最高位的1
变成了0
。 -
对
byte
和short
类型进行移位时,会首先转换为int
再进行位移。仔细观察可发现,左移实际上就是不断地×2,右移实际上就是不断地÷2。
-
位运算是按位进行与、或、非和异或的运算。
-
运算优先级
在Java的计算表达式中,运算优先级从高到低依次是:
()
! ~ ++ --
* / %
+ -
<< >> >>>
&
|
+= -= *= /=
-
类型自动提升与强制转型
- 强制转型使用
(类型)
- 超出范围的强制转型会得到错误的结果,原因是转型时,
int
的两个高位字节直接被扔掉,仅保留了低位的两个字节。 - 强制转型的结果很可能是错的。
- 应该选择合适范围的整型(
int
或long
),没有必要为了节省内存而使用byte
和short
进行整数运算。
- 强制转型使用
浮点数运算
-
浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。
-
由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数:
-
整数运算在除数为
0
时会报错,而浮点数运算在除数为0
时,不会报错,但会返回几个特殊值:NaN
表示Not a NumberInfinity
表示无穷大-Infinity
表示负无穷大
double d1 = 0.0 / 0; // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity
可以将浮点数强制转型为整数。在转型时,浮点数的小数部分会被丢掉。如果转型后超过了整型能表示的最大范围,将返回整型的最大值。
如果要进行四舍五入,可以对浮点数加上0.5再强制转型。
整型和浮点型运算时,整型会自动提升为浮点型。
布尔运算
- 布尔运算是一种关系运算,包括以下几类:
-
- 比较运算符:
>
,>=
,<
,<=
,==
,!=
- 与运算
&&
- 或运算
||
- 非运算
!
- 与运算
- 比较运算符:
- 优先级从高到低依次是:
!
>
,>=
,<
,<=
==
,!=
&&
||
- 短路运算
- 布尔运算的一个重要的特点是短路运算,如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。
- 三元符运算
b ? x : y
,它根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果。
字符和字符串
-
在Java中,字符和字符串是两个不同的类型。
- 基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;
-
字符类型
- char类型是基本的数据类型
- 一个
char
保存一个Unicode字符 - 转义字符
\u
+Unicode编码来表示一个字符 - 因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个
char
类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,将char
类型直接赋值给int
类型即即可。
char c1 = 'a'
char c2 = '中'
int n1 = 'a'//65
int n2 = '中'//20013
// 注意是十六进制:
char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013
-
字符串类型
- String字符串类型是引用类型
- 常见的转义字符包括:
\"
表示字符"
\'
表示字符'
\\
表示字符\
\n
表示换行符\r
表示回车符\t
表示Tab\u####
表示一个Unicode编码的字符
-
字符串连接
- 使用
+
连接任意字符串和其他数据类型- 如果使用
+
连接字符串和其他类型,Java会自动将其他类型转换为字符串类型,再连接。
- 如果使用
- 使用
-
多行字符串
- 从Java13开始,字符串可以用
"""..."""
表示多行字符串
- 从Java13开始,字符串可以用
-
不可变特性
- 字符串
s
变了吗?其实变的不是字符串,而是变量s
的“指向” - 原来的
s
还在,只是我们不能再通过s
访问
- 字符串
-
空值null
String s1 = null; // s1是null
String s2; // 没有赋初值值,s2也是null
String s3 = s1; // s3也是null
String s4 = ""; // s4指向空字符串,不是null
数组类型
-
Java的数组有几个特点:
- 数组所有元素初始化为默认值,整型都是
0
,浮点型是0.0
,布尔型是false
; - 数组一旦创建后,大小就不可改变。
- 数组是
引用类型
- 数组元素可以是值类型(如int)或
引用类型
(如String),但数组本身是引用类型
;
- 数组所有元素初始化为默认值,整型都是
-
用
数组变量.length
获取数组大小
int[] ns = new int[] { 68, 79, 91, 85, 62 };//这样可以不声明数组的大小
int[] ns = { 68, 79, 91, 85, 62 };//还可以进一步简化为这样
-
字符串数组
- 数组本身是引用类型,其中的元素也是引用类型的字符串类型。