Java快速入门
Java程序基础
程序基本结构
因为Java是面向对象的语言,一个程序的基本单位就是class,class是关键字
类名要求:类名习惯以大写字母开头,后接字母,数字和下划线的组合
Java入口程序规定的方法必须是静态方法,方法名必须为main,括号内的参数必须是String数组。方法名也有命名规则,命名和class一样,但是首字母小写。
注释方式://
/* */
/** */
变量和数据类型
变量定义需要指定变量类型 比如int x = 100;
基本数据类型:
整数类型:bytes、short、int、long
浮点数类型:float、double
字符类型:char
布尔类型:boolean
Java定义的这些基本数据类型有什么区别呢?
计算机中最小存储单位是字节(byte),一个字节8位(bit)。二进制范围0000000011111111,10进制0255,16进制范围00~ff整数类型(最高位表示符号位,1为负,0为正)
- bytes:-128~127
- short:-32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
浮点数类型(浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的)
- float:
float f1 = 3.14f;
,需要加f后缀,最大可表示3.14x10^38
- double:
double d = 1.79e308;
,最大表示1.79x10^308
- float:
布尔类型(boolean:true, false)
字符类型(char 使用单引号包裹,双引号是字符串类型,
char s = '中';
)常量(定义常量需添加final,
final double PI = 3.14;
定义后不可再次修改)var 关键字 (有些时候,类型名字太长可以用var代替,编译器会自动推断变量类型)
整数运算
- Java整数运算遵循四则运算规则,超出运算结果类型范围会导致溢出
- 自增自减(
++, --
) - 移位运算
- 向左移位(正数到最高位变为1后表示负数)
1
2
3int n = 7; // 00000000 00000000 00000000 00000111 = 7
int a = n << 1; // 00000000 00000000 00000000 00001110 = 14
int d = n << 29; // 11100000 00000000 00000000 00000000 = -536870912 - 向右移位(负数右移最高位不动,结果仍然是负数)
- 不带符号右移运算(
>>>
,符号位也会跟着动) - byte和short移位,首先会转化为int再移位(左移不断
x2
,右移不断/2
)
- 向左移位(正数到最高位变为1后表示负数)
- 位运算(与或非、异或)
- 运算优先级
注:在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int,强制转化为小范围类型会出错。
浮点数运算
- 浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。
- 由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数。
- 如果参与运算的两个数其中一个是整型,那么整型可以自动提升到浮点型。
- 整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值。
- 可以将浮点数强制转型为整数。在转型时,浮点数的小数部分会被丢掉。
布尔运算(关系运算)
- 短路运算(如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果)
- 如果没有短路运算,&&后面的表达式会由于除数为0而报错,但实际上该语句并未报错,原因在于与运算是短路运算符,提前计算出了结果false。
- 三元运算符(b?x:y)
字符和字符串
在Java中,字符和字符串是两个不同的类型。
字符
字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符。
1 | char c1 = 'A'; |
因为Java在内存中总是使用unicode编码,所以一个英文和一个中文都占用两字字节。
1 | int n1 = 'A'; // 字母“A”的Unicodde编码是65 |
字符串
字符串用String引用类型, 双引号包裹
多行字符串用三引号表示,多行字符串前面共同的空格会被去掉,即总是以最短的行首空格为基准
- 字符串不可变(变量的指向改变)
1
2
3
4String s = "hello";
System.out.println(s); // 显示 hello
s = "world";
System.out.println(s); // 显示 world - null(变量指向null,表示不指向任何对象,不和空字符串相同)
数组类型
- 定义数组类型变量,使用
类型[]
。数组初始化使用new int[5]
- Java数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false;数组一旦创建大小不可改变。
- 也可以在定义数组时直接指定初始化的元素,这样就不必写出数组大小
- 数组同字符串一样,都是引用类型,更改变量赋值都是改变指向
流程控制
流程控制中,break会跳出当前循环,也就是整个循环都不会执行了。而continue则是提前结束本次循环,直接继续执行下次循环。
01输入和输出
输出
System.out.println()
表示输出并换行System.out.print()
不换行
- 格式化输出`System.out.printf('%.2f\n', d); //显示两位小数`
- 详细的格式化参数请参考JDK文档java.util.Formatter
####输入
1 | Scanner s = new Scanner(System.in); |
02 if
1 | if {} |
==
表示引用相等,需要判断内容相等时用equals()
注意避免NullPointerExceptions1.equals(s2)
,"hello.equals(s)"
03 switch
1 | switch(options){ //可以匹配字符串 |
- Java12起,使用switch表达式可用模式匹配的方法,保证有一种路径执行,不需要break
- 可以接收返回值
1
2
3
4
5
6
7
8
9
10
11
12String name = switch (fruit){
case "apple" -> XXX;
case "pear" -> XXX;
case "mango" -> {
XX1;
xx2;
}
default ->{
XXX;
yield fruit;
}
} - yield 指定switch返回值
- 由于switch表达式是作为Java 13的预览特性(Preview Language Features)实现的,编译的时候,我们还需要给编译器加上参数:
javac --source 13 --enable-preview Main.java
04 while和do while
1 | while (条件表达式) { |
1 | do { |
05 for
1 | public class Main { |
- for循环还可以缺少初始化语句、循环条件和每次循环更新语句
1 | // 不设置结束条件: |
- foreach
1 | public class Main { |
数组结构
遍历数组
for、foreach不在叙述
- 打印数组内容
直接打印数组变量,得到JVM引用地址
要得到值,使用foreach打印遍历元素 - 快速打印数组内容
System.out.println(Arrays.toString(ns));
数组排序
排序算法:冒泡、快排、插入排序等
使用API,Arrays.sort()
- 对数组排序实际上修改了数组本身
多维数组
1 | int[][][] ns = { |
命令行参数
1 | public class Main { |