单元2 Java语言基础
单元2 Java语言基础
2.1 Java 程序结构
2.1.1 包(package)
1. 包的作用
- 管理类:防止命名冲突,避免命名冲突
- 控制访问:通过访问控制权限来控制对类、接口、字段、方法的访问
- 组织类:对类进行分类管理
2. 包的声明(创建)
- 声明包:
package 包名;
- 导入包:
import 包名;
或import 包名.*;
,··*
表示导入包中的所有类,如:import java.util.*;
导入java.util
包中的所有类
另外,也可以使用
import static
导入类的静态成员,>如:import static java.lang.Math.*;
//说明: 导入
java.lang.Math
类中的所有静态成员
还可以在程序中直接使用
java.lang
包中的类,如:System.out.println("Hello World!");
因为
java.lang
包是 Java 的核心包,默认导入
- 注意:包名应该全部小写,如
java.lang
,java.util
,com.baidu
3. 包的命名规则()
- 全部小写字母:如
java.lang
- 域名倒置:如
com.baidu
- 类名:如
com.baidu.util.DateUtil
- 扩展阅读:
阿里巴巴JAVA开发手册
史上最全的Java命名规范参考!
Java包(package)的作用、命名规范,以及包命名注意事项
3. Java 中常用的标准包
- java.lang:包含Java语言的核心类,如String、Math、System和Thread,无需显式导入,自动导入
- java.util:包含Java工具类库,如集合框架、日期时间类和随机数生成器
- java. io:包含Java输入/输出类库,如文件读写、网络通信等
- java. net:包含Java网络编程类库,如URL、Socket等
- java.sql:包含Java数据库编程类库,如JDBC接口
- java.awt:包含Java图形用户界面编程类库,如窗口、按钮、文本框等
查看更多标准库
- javax.swing:包含Java图形用户界面编程类库,如窗口、按钮、文本框等,是AWT的扩展
- java.nio:包含Java非阻塞I/O类库,如缓冲区、通道等
- java.lang.reflect:包含Java反射机制类库,如Class、Method、Field等
- java.security:包含Java安全类库,如加密、签名等
- java.rmi:包含Java远程方法调用类库,如RMI接口
- java.rmi.registry:包含Java远程方法调用注册表类库,如Registry、LocateRegistry等
- java.rmi.server:包含Java远程方法调用服务器类库,如UnicastRemoteObject、Skeleton等
- java.text:包含Java文本处理类库,如日期时间格式化、数字格式化等
- java.time:包含Java日期时间类库,如LocalDate、LocalTime、LocalDateTime等
- java.util.concurrent:包含Java并发编程类库,如线程池、锁等
- java.util.logging:包含Java日志类库,如Logger、Handler等
- java.util.prefs:包含Java首选项类库,如Preferences等
- java.util.regex:包含Java正则表达式类库,如Pattern、Matcher等
- java.util.zip:包含Java压缩类库,如ZipInputStream、ZipOutputStream等
- javax.crypto:包含Java加密类库,如Cipher、SecretKey等
- javax.imageio:包含Java图像I/O类库,如ImageIO、ImageReader等
- javax.jws:包含Java Web服务类库,如@WebService、@WebMethod等
- javax.management:包含Java管理类库,如MBean、MBeanServer等
- javax.naming:包含Java命名与目录接口类库,如Context、InitialContext等
2.1.2 主函数及其参数
1. 主函数
主函数是Java程序的入口点,格式如下:
public static void main(String[] args)
2. main方法中的参数
args
是一个字符串数组,用于接收命令行参数。在运行程序时,可以通过命令行传递参数给主函数。例如,假设有一个名为HelloWorld.java
的Java程序,可以在命令行中运行以下命令:
java HelloWorld arg1 arg2 arg3
其中,arg1
、arg2
和arg3
是传递给主函数的参数。在程序中,可以通过args
数组来访问这些参数。例如,可以使用以下代码来打印出传递给主函数的所有参数:
for (String arg : args) {
System.out.println(arg);
}
2.1.3 代码块
代码块是一组由大括号{}
包围的语句。代码块可以用于定义一个作用域,其中声明的变量只在代码块内可见。代码块可以嵌套使用,即一个代码块可以包含另一个代码块。
代码块可以分为:普通代码块、静态代码块、构造代码块和同步代码块。下面进行前3种讲解:
1. 普通代码块
普通代码块是定义在方法体内的代码块,可以包含任意数量的语句。普通代码块可以用于定义一个作用域,其中声明的变量只在代码块内可见。例如:
public class HelloWorld {
public static void main(String[] args) {
{
int x = 10;
System.out.println(x);
}
// x 在这里不可见
}
}
在上面的例子中,x
变量只在第一个代码块内可见。
2. 静态代码块
静态代码块是定义在类中的代码块,使用static
关键字修饰。静态代码块在类加载时执行,并且只执行一次。静态代码块可以用于初始化静态变量或执行其他静态初始化操作。例如:
public class HelloWorld {
static int x;
static {
x = 10;
System.out.println("静态代码块执行");
}
public static void main(String[] args) {
System.out.println(x);
}
}
在上面的例子中,静态代码块在类加载时执行,并初始化静态变量x
。
3. 构造代码块
构造代码块是定义在类中的代码块,没有static
关键字修饰。构造代码块在每次创建对象时都会执行,并且先于构造函数执行。构造代码块可以用于初始化实例变量或执行其他初始化操作。例如:
public class HelloWorld {
int x;
{
x = 10;
System.out.println("构造代码块执行");
}
public HelloWorld() {
System.out.println("构造函数执行");
}
public static void main(String[] args) {
HelloWorld obj = new HelloWorld();
System.out.println(obj.x);
}
}
在上面的例子中,构造代码块在每次创建对象时都会执行,并初始化实例变量x
。
4. 同步代码块
同步代码块是定义在方法体内的代码块,使用synchronized
关键字修饰。同步代码块可以用于保证在多线程环境下,同一时刻只有一个线程可以执行代码块中的代码。例如:
public class HelloWorld {
private int x = 0;
public synchronized void increment() {
x++;
}
}
在上面的例子中,increment
方法使用了synchronized
关键字修饰,保证了在多线程环境下,同一时刻只有一个线程可以执行该方法中的代码。
5. try-with-resources语句
try-with-resources语句是Java 7引入的一种语法,用于自动关闭实现了AutoCloseable
接口的资源。例如:
public class HelloWorld {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的例子中,BufferedReader
对象在try-with-resources语句中创建,并在语句结束时自动关闭。
6. lambda表达式
lambda表达式是Java 8引入的一种语法,用于简化匿名内部类的编写。例如:
public class HelloWorld {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(s -> System.out.println(s));
}
}
在上面的例子中,forEach
方法接受一个lambda表达式作为参数,用于对列表中的每个元素执行操作。
7. Stream API
Stream API是Java 8引入的一种语法,用于处理集合数据。例如:
public class HelloWorld {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c");
list.stream()
.filter(s -> s.startsWith("a"))
.forEach(System.out::println);
}
}
在上面的例子中,stream
方法将列表转换为流,filter
方法对流中的元素进行过滤,forEach
方法对流中的每个元素执行操作。
8. Optional
Optional是Java 8引入的一种容器类,用于表示可能为空的对象。例如:
public class HelloWorld {
public static void main(String[] args) {
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(System.out::println);
}
}
在上面的例子中,Optional.of
方法创建一个包含指定值的Optional对象,ifPresent
方法在Optional对象包含值时执行操作。
9. 接口默认方法
接口默认方法是在Java 8中引入的一种语法,允许在接口中定义默认方法。例如:
public interface MyInterface {
default void myMethod() {
System.out.println("Hello");
}
}
在上面的例子中,myMethod
方法是一个默认方法,可以在实现该接口的类中直接调用。
10. 方法引用
方法引用是Java 8引入的一种语法,用于简化lambda表达式的写法。例如:
public class HelloWorld {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println);
}
}
在上面的例子中,System.out::println
是一个方法引用,用于调用System.out
对象的println
方法。
2.2 基本数据类型
展开:JAVA数据类型思维导图
2.2.1 基本数据类型
Java中的基本数据类型包括以下几种:
- 整型:byte、short、int、long
- 浮点型:float、double
- 布尔型:boolean
- 字符型:char
2.2.2 基本数据类型的默认值
Java中基本数据类型的默认值如下:
- 整型:0
- 浮点型:0.0
- 布尔型:false
- 字符型:'\u0000'
- 引用类型:null
2.2.3 基本数据类型的转换
Java中基本数据类型的转换包括以下几种:
- 自动类型转换:将较小的数据类型转换为较大的数据类型,例如将byte转换为int。
- 强制类型转换:将较大的数据类型转换为较小的数据类型,例如将int转换为byte。
- 隐式类型转换:将基本数据类型转换为对应的包装类,例如将int转换为Integer。
- 显式类型转换:将包装类转换为基本数据类型,例如将Integer转换为int。
- 类型提升:将较小的数据类型提升为较大的数据类型,例如将byte和int相加时,byte会被提升为int。
2.2.4 基本数据类型的范围
Java中基本数据类型的范围如下:
- byte:-128到127
- short:-32,768到32,767
- int:-231到231-1
- long:-263到263-1
- float:大约±3.40282347E+38F(有效位数为6-7位)
- double:大约±1.79769313486231570E+308(有效位数为15位)
- char:0到65535
- boolean:true或false
2.2.5 基本数据类型的常量
Java中基本数据类型的常量包括以下几种:
- 整型常量:例如10、-20、0x1A等。
- 浮点型常量:例如3.14、-0.5、1.23E-4等。
- 布尔型常量:true和false。
- 字符型常量:例如'a'、'b'、'\u0000'等。
- 说明:
- 字符型常量可以使用转义字符表示特殊字符,例如'\n'表示换行符,'\t'表示制表符。
- '\u0000'表示一个空白字符,即在单引号之间没有任何字符。之所以能这样表示是因为,Java采用的是Unicode字符集,Unicode字符以\u开头,空白字符在Unicode码表中对应的值为'\u0000'。
2.2.6 基本数据类型的运算
Java中基本数据类型的运算包括以下几种:
- 算术运算:加、减、乘、除、取余等。
- 关系运算:大于、小于、等于、不等于、大于等于、小于等于等。
- 逻辑运算:与、或、非、异或等。
- 位运算:与、或、非、异或、左移、右移、无符号右移等。
2.3 变量与常量
2.3.1 标识符和关键字
1.标识符和关键字
Java中的标识符是指用来标识变量、类、方法等的名称,关键字是Java语言中具有特殊含义的保留字。Java中的标识符必须以字母、下划线或美元符号开头,后面可以跟字母、数字、下划线或美元符号。Java中的关键字不能用作标识符。
(1)标识符的命名规则
Java中的标识符必须以字母、下划线或美元符号开头,后面可以跟字母、数字、下划线或美元符号。Java中的标识符不能包含空格,不能包含特殊字符,不能包含Java关键字。
(2)关键字
Java中的关键字包括以下几种:
- 基本数据类型关键字:int、float、double、boolean、char、byte、short、long。
- 控制流程关键字:if、else、switch、case、default、for、while、do、break、continue、return、try、catch、finally。
- 类与对象关键字:class、interface、extends、implements、new、this、super、instanceof。
- 访问控制关键字:public、protected、private。
- 其他关键字:void、null、true、false、import、package、abstract、final、native、static、strictfp、synchronized、transient、volatile。
表 Java常用关键字表
关键字 | 含义 |
---|---|
abstract | 声明抽象类或抽象方法 |
boolean | 布尔类型 |
break | 跳出循环或switch语句 |
byte | 字节类型 |
case | switch语句中的分支 |
catch | 捕获异常 |
char | 字符类型 |
class | 声明类 |
continue | 跳过本次循环 |
default | switch语句中的默认分支 |
do | do-while循环 |
double | 双精度浮点类型 |
else | if语句中的else分支 |
extends | 继承 |
final | 声明常量或不可变类 |
finally | try-catch语句中的finally块 |
float | 单精度浮点类型 |
for | for循环 |
if | if语句 |
implements | 实现接口 |
import | 导入类或包 |
instanceof | 判断对象是否为某个类的实例 |
int | 整型 |
interface | 声明接口 |
long | 长整型 |
native | 声明本地方法 |
new | 创建对象 |
null | 空值 |
package | 声明包 |
private | 私有访问控制 |
protected | 受保护访问控制 |
public | 公共访问控制 |
return | 返回值 |
short | 短整型 |
static | 静态方法或变量 |
strictfp | 严格浮点运算 |
super | 调用父类方法或变量 |
switch | switch语句 |
synchronized | 同步方法或代码块 |
this | 调用当前对象的方法或变量 |
throw | 抛出异常 |
throws | 声明方法可能抛出的异常 |
transient | 不会被序列化的变量 |
try | try-catch语句中的try块 |
void | 无返回值 |
volatile | 变量在多个线程中可见 |
while | while循环 |
2.关键字的特点
Java中的关键字具有以下特点:
- 关键字都是小写的。
- 关键字不能用作标识符。
- 关键字具有特殊的含义,不能随意使用。