第二章:Java 的基本语法

包名

作用

将编写好的类分目录存放,便于管理。

使用

声明包

需要在源代码开头使用如以下语句声明包名称:

1
2
// 包名可以换成其他名称
package com.example.packagename;

此时,存放源码的文件夹路径就应为 /com/example/packagename​​。

包名在命名时最好遵循命名规范,只包含小写字母和英文句点,通常仅有三层结构。

第一层(所有者类型声明) 第二层(所有者名称声明) 第三层(具体的包名)
com(企业项目) 任意名称
任意名称
indi(公共项目)
pers(个人项目)
priv(私有项目)

如果没有声明,则创建的类会处于默认包下,在日常开发中是不应该出现的。

导入包

可以使用以下语句:

1
import 包名.类名;

如果要导入包下的所有类,类名可以用 *(通配符)代替。

注释

行级注释

例子:

1
2
3
4
...
// 这是一个行级注释
System.out.print("例子"); // 也可以写在代码后面
...

多行注释

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
这是
一条
多行
注释
*/
...
/* 这样也行 */
...
/* // 可以嵌套行级注释 */
...
// 错误示范:
/* /* */ */

多行注释不能嵌套,第一个 /* 只会与第一个 */ 配对。

文档注释

可用于对一个类或方法进行系统性的解释说明,便于其他开发者了解如何使用你程序中的 API。使用 JDK 工具包的 javadoc​ 工具可以将文档注释从源代码中提取出来,生成开发者文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* Title: HelloWorld 类
* @author 作者
* @version 1.0
*/
public class HelloWorld {
/**
* 这是一个 main() 方法入口
* @param args 参数名
*/
public static void main(String[] args) {
System.out.println("你好,世界!");
}
}

语句的分号

Java 语句分为结构定义语句和功能执行语句,每条功能执行语句最后要使用一个英文半角分号(;)表示一个语句的结束,这一点与 C/C++ 类似。

代码风格

严格说来,在单词或符号之间空行或添加空格不会导致程序出错,例如,HelloWorld 的代码也可以写为:

1
2
3
4
5
6
7
8
9
public 
class HelloWorld
{
public static void main
(String[]
args) {
System.out.println("你好,世界!");
}
}

这样子也能运行。但是代码的易读性明显下降了,所以,在编码时我们需要保持一定的标准,各层级之间用 Tab(输入制表符)或空格进行缩进,这样做以后代码的运行逻辑更为清晰,易于维护。

但是一段字符串就不能出现在多行之中,例如:

1
2
3
4
5
6
7
8
9
10
public
class HelloWorld
{
public static void main
(String[]
args) {
System.out.println("你好
,世界!");
}
}

字符串的连接应用 “+” 号进行:

1
2
3
4
5
6
7
8
9
class HelloWorld
{
public static void main
(String[]
args) {
System.out.println("你好"
+"世界!");
}
}

标识符

大小写的区分

Java 是一门严格区分大小写的语言,在定义标识符 PC 时还可以定义 pc,但这两者是完全不同的符号,不能通用。

命名规范

在命名时,不得与保留字、关键字重复。标识符可以由英文大小写字母(A ~ Z,a ~ z)、数字(0 ~ 9)、下划线(_)以及美元符号($)组成,但不能是数字开头。标识符不能包含空格。

包名 常量名 类名和接口名 变量和方法名
字符
全部字母小写,用 .​ 隔开单词
全部字母大写,用 _​ 分开单词
每个单词的首字母都要大写 开头的单词首字母小写,之后的单词首字母大写
例子 com.example.testcom.learner.class01 MY_TOKENDAY_OF_MONTH HelloWorldArrayList myNameuserEmailpassword

变量

作用

变量可以存储在程序运行时需要的数据并且可以在运行时进行变更。

基本数据类型

数据单位基本认识

1 byte=8 bit 即 1 字节等于 8 比特位的数据

1 kilo byte=1000 bit 即 1KB=1000B

1 kilo binary(2 进制)byte=1024 bit 即 1KiB=1024B

现在,计算机行业中 1KB 也多指 1024B。

更大的单位还有 MB、GB、TB、PB 等,相邻两个单位的进率为 1024。

另外,还有 Mb、Mbps 之类的单位。小写的 b 指的是 bit,要转换为 byte 的单位需要除以 8;ps 即 per second,指的是每秒。例如,1 Mb= 100,0000 b = 12,5000 B ~= 122 KB,200 兆宽带即 200 Mbps = 25 MB/s。

数值型

整数类型

名称 字节型 短整型 整型 长整型
大小 1 字节(8 位) 2 字节(16 位) 4 字节(32 位) 8 字节(64 位)
范围 -2^7^ ~ 2^7^-1 (-128 ~ 127) -2^15 ​^~ 2^15^-1 -2^31 ​^~ 2^31^-1 -2^63 ​^~ 2^63^-1
英文名 byte short int long

浮点类型(小数)

名称 单精度浮点数 双精度浮点数
大小 4 字节(32 位) 8 字节(64 位)
英文名 float double

字符类型(char)

只能存储单一字符,占地 2 字节(16 位),字符用英文单引号包起来,也可以用 0 ~ 65535 范围内整数表示一个字符。

1
2
char a ='a';
char a2 =97;

布尔类型(boolean)

用于存储布尔型的值,内容只能是 true​ 或 false​。

1
2
boolean flag =true;
flag =false;

声明变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
变量类型 变量名 [=初始值];
// ==========
int a =1;
int b =2,c;
c =b+1;
结果:a=1,b=2,c=3
// ==========
long d=22222222222222222L(或 l);
long e=192l
long f=192
提示:在给 long 类型的变量赋值时如果数值未超出 int 的范围就不用在数字后加 l(或 L),否则需要。
// ==========
float g=3.14159f
double h=3.1415926535d
double i=1.146377589
提示:小数默认是 double 双精度浮点数类型,给 float 类型变量赋值时需要加 f 或 F,double 的可加可不加。

变量类型转换

自动类型转换

  1. 当一种范围较小的变量类型转换为范围更大的变量类型时,Java 会自动完成类型的转换,这样不会造成数据的丢失。

    1
    2
    3
    short a =-1;
    int b =a;
    double c =b;
  2. 在表达式的运算中,byte、short、char 类型的变量相加时,它们自身都会被临时提升为 int 类型再参与运算,出来的结果也就是 int 类型的值,值和变量的类型不同,就不能赋值。这一点需要注意一下。

    1
    2
    3
    4
    5
    byte a =1;
    char b =1;
    short c =1;
    byte d = (byte) (a+b+c);
    System.out.println("d=" +d) // 这里用到了字符串连接

强制类型转换

当一种范围更大的变量类型或不相兼容的变量类型需要赋值到一种精度更低的变量上时,需要进行强制类型转换。4 字节的空间装不下 8 字节的数据,这就是道理所在。

类型转换的一般用法如下:

1
目标类型 变量名 = (目标类型) 值

下面是一个示例:

1
2
3
int a =128;
byte b;
b = (byte) a;

变量的作用域

在一层花括号包裹的区域中可以声明和使用变量,在其他层面的花括号内定义的变量不能越层使用。

1
2
3
4
5
6
7
8
9
10
public class VarTest {
public static void main(String[] args) {
int a =1,c;
{
int b =2;
}
c =a+b;
System.out.println("c="+c);
}
}

这样写会报错,因为在里层花括号中声明的变量 b 的作用范围只限于包裹它的花括号,除非删掉外层符号。

常量

用途

常量就是在程序运行中一段固定不变的值。

类型

和变量类似,分为整型常量、浮点数常量、布尔常量、字符常量等。下面进行逐一介绍。

整型常量

各进制数字的组成

  1. 二进制:以 0b​(B) 开头,由 0 和 1 组成的数字序列。
  2. 八进制:以 0​ 开头,其后由 0 ~ 7​ 组成的数字序列。
  3. 十进制:由 0 ~ 9​ 的整数组成的数字序列。
  4. 十六进制:由 0x​(X) 开头,并且其后由 0 ~ 9, A ~ F​ 组成的字符序列。

字母的大小写无所谓。

各进制间的转换

这里可参阅书本的截图,只用会十进制与二进制的相互转换,剩下的了解即可。

image​​image​​image​​image​​image

浮点数常量

分为单精度浮点数(float)常量和双精度浮点数(double)常量,Java 中默认的小数类型是 double,表示方法如下:

1
3.14f 2e3f 5.022E+23f

其中的 e 表示前面的数要乘以以 10 为底数的后一个数的次幂,如 2e3f​ 即 $2*10^3$。

布尔常量

true​ 或 false​,真或假。

字符常量

1
'a' 'I' '0' '\n'

用单括号引起来,夹一个字符。

字符串常量

1
"卧室一個字符串" "Hello\nWorld!" ""

长度大于等于零,可以包含一个或多个字符,或者不含字符。

null 常量

只含一个值 null,表示引用的对象为空。

声明常量

常量其本质就是一个不可变的变量,其大体相似,只是命名规范和关键字存在一定差别。

1
final 常量类型 常量名 [=初始值];

转义符

反斜杠,即 “\”,也被称作转义符,用以转义后面的一个字符,来表示平常不可见的或特殊的部分符号。

常用的转义字符有以下几个:

  1. \n​:最常用的一个,表示换行。
  2. \r​:回车符,用于将光标移动到当前行的开头。类似于 Home 键,英文名大概是 Return 吧。
  3. \t​:制表符,用于添加一段间隔,便于排版。是 Table 的缩写。
  4. \b​:退格符,就是近似于删除键的东西。英文是 backspace。
  5. \'\"​:英文引号,需要在字符串中表示英文的引号时需要转义,不然会与编程语言冲突。
  6. \\​:反斜杠本身。

运算符

算术运算符

  1. +​​ 加号 / 正号
  2. -​​ 减号 / 负号
  3. *​ 乘号
  4. /​ 除号
  5. %​ 取模运算(取余数)
  6. ++​​ 自增
  7. --​​ 自减

有几点注意事项:

  1. 其中 自增 / 自减 符号放在数字前或后的用法不同,例如,++​ 放在数字前表示先进行 +1​ 操作,放在数字后就先进行之前的符号的操作。

    a=2;b=++a​,则结果为 a=3;b=3;​。

    a=2;b=a++​,则结果为 a=3;b=2​。

    自减操作同理,请仔细理解。

  2. 整数之间除法运算结果只有整数,如果有小数参与结果才会更精确。

    如 $5/2$ 结果会为 $2$,

    $3500/1000*3$ 的结果会为 $9$,

    $2.5/10$ 的结果是 $0.25$

  3. 取模运算结果的正负号取决于符号左边的被取模数而与取模数无关。

    如 $-5$%$2$ 结果为 $-1$,

    $10$%$(-3)$ 结果为 $1$。

赋值运算符

类型及用法

image​​image

特殊赋值运算符的自动强制类型转换

image​​image

比较运算符

类型介绍及用法

image

易混用法

image

逻辑运算符

类型介绍及用法

image​​​image​​image​​image​​

细节用法

image

image

image

image

位运算符

意义及用法

image

image

解释说明

image

image

image

image

条件运算符

image

image

运算符的优先级

image

image

选择结构语句

if 语句

翻译为“如果(本条件成立),就(干什么)”。

1
2
3
if (判断条件) {
执行语句;
}

if … else 语句

翻译为“如果(),就();否则就()”。

1
2
3
4
5
if (判断条件) {
条件为真时执行的语句;
} else {
条件为假时执行的语句;
}

if … else if … else 语句

翻译为“如果(主条件为真),就(干正事);否则如果(新条件),那么就(干什么);否则当主条件为假时执行(其他语句)”

1
2
3
4
5
6
7
if (主判断条件) {
执行语句 1;
} else if (判断条件 n) {
执行语句 n;
} else {
主判断条件为假时执行语句;
}

switch 语句

1
2
3
4
5
6
7
8
9
10
11
switch (控制表达式) {
case 目标值 1:
执行语句;
break;
case 目标值 2:
执行语句;
break;
default:
默认执行语句;
break;
}

循环结构语句

while 循环语句

当条件为真时循环执行语句。

1
2
3
while (循环条件) {
执行语句;
}

do … while 循环语句

先执行语句再判断是否需要循环,语句会一直执行直到条件成立。

1
2
3
do {
执行语句;
} while (循环条件);

for 循环语句

1
2
3
for (初始化表达式;循环条件;操作表达式) {
执行语句;
}

image

跳转语句

break 语句

作用是跳出循环,执行循环结构体之外的下几行语句。

continue 语句

作用是跳出单次循环重新进入下一个循环。

数组

可以理解为高中阶段的集合,一个集合可以包含多个元素。

定义数组

1
2
3
数组类型[] 数组名 =new 数组类型[数组长度];
数组类型[] 数组名 =new 数组类型{元素 1,元素 2,...,数组 n};
数组类型[] 数组名 ={元素 1,元素 2,...,数组 n};

image

使用数组

引用元素

image

使用 数组名[索引]​ 表示数组中的元素。需要注意的是一个长度为 100 个元素的数组索引范围为 0 ~ 99​。

获取数组长度

1
数组名.length

常见操作

数组遍历

1
2
3
for (int i=1; i < 数组名.length; i++) {
System.out.println(数组名[i]); // 通过索引访问数组元素
}

数组最值

image

数组排序

image

image​​

image

多维数组

image​​image


第二章:Java 的基本语法
https://holeholo.github.io/2023/10/29/第二章:Java-的基本语法/
作者
HoleHolo
发布于
2023年10月29日
许可协议