1 一个简单的Java应用程序
public class FirstSample{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
- Java区分大小写,如果出现了大小写拼写错误,程序将无法运行
- 关键字public称为访问修饰符,用于控制程序的其他代码对这段代码的访问级别
- 关键字class后面紧跟类名,类名必须以字母开头,后面可以跟字母和数字的任意结合,长度基本上没有限制。但是不能使用Java保留字 (如public或class)作为类名
- 标准的命名规范为:类名是以大写字母开头的单词,若名字由多个单词组成,应使用骆驼命名法(又称驼峰命名法)命名。
- 源代码的文件名必须与源代码的类名相同,并且使用“ .java ”作为扩展名
- 运行已编译的程序时,Java虚拟机将从指定类中的main方法开始执行,因此在类的源文件中必须包含一个main方法。
- Java中任何方法的代码都用“{”开始,用“}”结束
2 注释
- 三种注释方法:
1) // (一般使用于单行注释)
2) 以 / * 开头,以 * / 结尾 (一般用于长篇注释)
3) 以 / ** 开头,以 * / 结尾 (用于自动地生成文档) - 在Java中,/ * * /注释不能嵌套
3 数据类型
- Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。
- Java中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型
3.1 整型
-整型用于表示没有小数部分的数值,它允许是负数。
- Java的四种整型:
类型 | 储存需求 | 取值范围 |
---|---|---|
int | 4字节 | -2147483648 ~ 2147483647 (正好超过20亿) |
short | 2字节 | -32768 ~ 32767 |
long | 8字节 | -9223372036854775808 ~ -9223372036854775807 |
byte | 1字节 | -128 - 127 |
3.2 浮点类型
- Java的两种浮点类型
类型 | 储存需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约±3.40282347E+38F (有效位数为6~7) |
double | 8字节 | 大约±1.79769313486231570E+308 (有效位数为15位) |
- double表示这种类型的精度是float类型的两倍
- float类型的数值有一个后缀F或f(如3.14F)
- 没有后缀F的浮点数值(如3.14)默认为double类型
- 用于表示溢出和出错情况的三个特殊的浮点数值:正无穷大,负无穷大,NaN(不是一个数字)、
3.3 char类型
- char类型的字面量值需要用单括号括起来
3.4 Unicode和char类型
- 码点:与一个编码表中的某个字符的代码值
3.5 boolean类型
- boolean类型有两个值:false 和 true,用来判定逻辑条件
- 整型值和布尔值之间不能进行互相转换
4 变量
- 在Java中,每个变量都有一个类型。在声明变量时,变量的类型位于变量名之前。
- 变量名必须是一个以字母开头并由字母或数字构成的序列。
- 变量名中所有的字符都是有意义的,并且大小写敏感
- 变量名的长度基本没有限制
- 不能使用Java保留字作为变量名
- 可以在一行中声明多个变量,但不提倡使用这种风格。逐一声明每一个变量可以提高程序的可读性。
4.1 变量初始化
- 声明一个变量之后,必须用赋值语句对变量进行显式初始化。
- 千万不要使用未初始化的变量
- 想要对变量进行赋值,就需要将变量名放在等号左侧,相应取值的Java表达式放在等号的右侧。
int vacationDays;
vacationDays = 12;
也可以将变量的声明和初始化放在同一行中。
int vacationDays=12;
- 变量的声明尽可能地靠近变量第一次使用的地方,这是一种良好的程序编写风格。
4.2 常量
- 使用关键字final指示常量
- 关键字final表示这个常量只能赋值一次,一旦赋值之后就不能修改了
- 常量名使用全大写
- 例子:
public class Constants{
public static void main(String[] args){
final double CM_PER_INCH = 2.54;
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters:"
+ paperWidth * CM_PER_INCH + "by" +
paperHeight * CM_PER_INCH);
}
}
- 当希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。
public class Constants2{
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args){
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters:"
+ paperWidth * CM_PER_INCH + "by" + paperHeight * CM_PER_INCH);
}
}
5 运算符
- 加、减、乘、除:+、-、*、/
- 取余:%
5.1 数学函数与常量
- 求平方根:Math.sqrt(x)
- 求幂:Math.pow(x)
5.2 数值类型之间的转换
- 如果两个操作数有一个是double类型,另一个操作数就会转换为double类型
- 否则,如果其中一个操作数是float类型,另一个操作数就会转换为float
- 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型
- 否则,两个操作数都会被转换为int类型
5.3 强制类型转换
- 在Java中,允许进行这种数值之间的类型转换
- 当然,有可能会丢失一些信息,在这种情况下,需要通过强制类型转换(cast)实现这个操作。
- 如果将一个数值从一种类型强制转换为另一种类型,而又超过了目标类型的表示范围,结果就会截断成一个完全不同的值
5.4 结合赋值和运算符
- 可以在赋值中使用二元运算符
x += 4
等价于
x = x + 4
5.5 自增与自减运算符
- 后缀模式: n++ 或 n--
后缀模式在表达式中会使用变量原来的值 - 前缀模式: ++n 或 --n
前缀模式在表达式中会先完成加1
int m = 7;
int n = 7;
int a = 2 * ++m; //此时a=16,m=8
int b = 2 * n++; //此时b=14,n=8
5.6 关系和boolean运算符
- == , !=
- < , > , <= , >=
- && , &
- ? :
条件表达式 ? 表达式1 :表达式2
如果条件为true,则条件表达式的值为表达式1的值;同理当条件为false是值为表达式2的值
x < y? x : y
会返回x和y中较小的一个
5.7 位运算符
- & , | , ∧ (异或) , ~
5.8 括号与运算符级别
运算符 | 结合性 |
---|---|
[] . () | 从左到右 |
! ~ ++ -- + - () (强制类型转换) new |
从右到左 |
* / % | 从左到右 |
+ - | 从左到右 |
<< >> >>> | 从左到右 |
< <= > >= instanceof | 从左到右 |
= = != | 从左到右 |
& | 从左到右 |
∧ | 从左到右 |
&& | 从左到右 |
?: | 从右到左 |
= += -= *= /= %= &= <<= >>= >>>= ∧ = |
从右到左 |
6 字符串
- 从概念上将,Java字符串就是Unicode字符序列
- 每个用双引号括起来的字符串都是String类的一个实例
6.1 子串
- String 类的substring方法可以从一个较大的字符串提取出一个子串
- substring 方法的第二个参数是不想复制的第一个位置
- substring的工作方式有一个优点:容易计算子串的长度。
- 例子:s.substring(a,b)
6.2 拼接
- Java 允许使用 + 号连接(拼接)两个字符串
- 当将一个字符串和非字符串的值进行拼接是,后者会被转换成字符串
- 如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态的join方法
6.3 不可变字符串
- String 类没有提供用于修改字符串的方法
- 不可变字符串有一个优点:编译器可以让字符串共享
6.4 检测字符串是否相等
- 可以使用equals方法检测两个字符串是否相等:s.equals(t)
如果字符串s与字符串t相等,则返回true,否则为false - 不要使用==运算符检测两个字符串是否相等,这个运算符只能确定两个字符串是否放在同一个位置上,如果字符串在同一个位置上,那么它们必然相等;但是,当内容相同的字符串放在了不同的位置上时则不相等
6.5 空串 与 null串
- 空串"" 是长度为0的字符串,是一个Java对象,有自己的串长度(0)和内容(空)
- String变量可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联
6.6 码点与代码单元
- Java字符串由char值序列组成
6.7 String Api
- Java 中的String类包含了50多个方法
6.8 阅读联机API文档
- 文档地址: docs/api/index.html
6.9 构建字符串
- 使用StringBuilder类可以避免每次都构建一个String对象的问题
- 当每次需要添加一部分内容时,就调用append方法
- 在需要构建字符串就调用toString方法
7 输入输出
7.1 读取输入
- 需要通过控制台进行输入,首先需要构建一个Scanner对象,并与标准输入流System.in关联
Scanner in = new Scanner(System.in);
- nextLine方法将输入一行
- 要读取一个整数,可以调用nextInt方法
7.2 格式化输出
- 用于printf的转换符:
转换符 | 类型 | 举例 |
---|---|---|
d | 十进制整数 | 159 |
x | 十六进制整数 | 9f |
o | 八进制整数 | 237 |
f | 定点浮点数 | 15.9 |
e | 指数浮点数 | 1.59e+01 |
g | 通用浮点数 | —— |
a | 十六进制浮点数 | 0x1.fccdp3 |
s | 字符串 | Hello |
c | 字符 | H |
b | 布尔 | True |
h | 散列码 | 42628b2 |
tx或Tx | 日期时间(T强制大写) | 已经过时,应当改为使用java.time类 |
% | 百分号 | % |
n | 与品台有关的行分隔符 | —— 、 |
7.3 文件输入与输出
- 想要对文件进行读取,就需要用一个File对象构造一个Scanner对象
- 如果文件名中包含反斜杠号,就要在每个反斜杠号前在添加一个反斜杠号
- 要想写入文件,就需要构造一个PrintWriter对象
- 不能使用一个不存在的文件构造一个Scanner,不能使用一个不能被创建的文件名构造一个PrintWriter,否则会发生异常,Java编译器认为这些异常比“被零除”异常更严重
8 控制流程
8.1 块作用域
- 块(即复合语句)是由一对大括号括起来的若干条简单的Java语句。
- 块确定了变量的作用域
- 一个块可以潜逃在另一个块中
- 不能在嵌套的两个块中声明同名的变量
8.2 条件语句
- Java条件语句的格式
if(condition) statement
或
if(condition) statement1 else statement2
或if(condition) statement1 else if(condition) statement2 else statement3
这里的条件(condition)必须用括号括起来
- 使用块可以在Java程序结构中原本只能放置一条语句的地方放置多条语句
8.3 循环
- 一般格式:
while(condition) statement
- 当条件为true是,while循环执行一条语句(也可以是一个语句块)
- 如果开始循环条件的值就为false,则while循环体一次也不执行
- do/while:
do statement while(condition);
这种循环语句先执行语句(通常是一个语句块),在检测循环条件,然后再重复语句,再检测条件,以此类推。
8.4 确定循环
- for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或者类似的变量来控制迭代次数。
- for语句第一部分通常用于对计数器的初始化,第二部分给出每次新一轮执行前要检测循环条件,第三部分指示如何更新计数器
8.5 多重选择:switch语句
switch(choice)
{
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
case 4:
...
break;
defult:
...
break;
}
- switch语句将从与选项值相匹配的case标签处开始执行直到遇到break语句,或者执行到switch语句的结束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句。
- 注意:如果在case分支语句末尾没有break语句,那么就会接着执行下一个case分支语句
- case标签可以是:
1) 类型为char、byte、short或int的常量表达式
2) 枚举常量
3) 从JavaSE 7开始,case标签还可以是字符串字面量
8.6 中断控制流程语句
- 使用不带标签break跳出循环语句
- 使用带标签的break跳出多重嵌套的循环语句
9 大数值
- 如果基本的整数和浮点数精度不能满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal,这两个类可以处理包含任何长度数字序列的数值
- BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算
- 当时用这两个方法时,不能使用常用的算术运算符(如+和*),而需要使用大数量值类中的add和multiply方法
10 数组
- 数组是一种数据结构,用来存储同一类型的值的集合
- 声明数据变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字
例如:
int[] a;
- 数组的两种形式:
int[] a;
或
int a[];
- 一旦创建了数组,就不能再改变它的大小(尽管可以改变每一个数组元素)
10.1 for each循环
- for each循环可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心
- for each循环语句格式
for(variable : collection) statement
-for each循环语句的循环变量将会遍历数组中的每个元素,而不需要下标值
10.2 数组初始化以及匿名数组
- 在Java中,提供了一种创建数组对象并同时赋予初始值的简写书写方式:
如:
int[] smallPrimes = {2,3,5,7,11,13}
请注意,在使用这种语句时,不需要调用new
- 甚至还可以初始化一个匿名的数组:
new int[] {17,19,23,29,31,37}
这种表示法将创建一个新数组并利用括号提供的值进行初始化,数组的大小就是初始值的个数
10.3 数组拷贝
- 在Java中,允许将一个变量拷贝给另一个数组变量,两个变量将引用同一个数组
- 如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,那么将赋值为false。相反,如果长度小于原始数组的长度,则只拷贝最前面数组元素。
10.4 命令行参数
- Java应用中的String args[] 参数的main方法表明main方法将接收一个字符串数组,也就是命令行参数
10.5 数组排序
- 要想对数值型数组进行排序,可以使用Arrays类中的sort方法:
如:
int [] a = new int[10000];
...
Arrays.sort(a);
10.6 多维数组
- 多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排序形式
- 一个简单的例子:
double[][] balances;
- 在调用new对多维数组进行初始化前不能使用它