单元2 Java语言基础

峰剩榜 / 2024-09-21 / 原文

单元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.langjava.utilcom.baidu

3. 包的命名规则()

  • 全部小写字母:如 java.lang
  • 域名倒置:如 com.baidu
  • 类名:如 com.baidu.util.DateUtil
  • 扩展阅读:
    阿里巴巴JAVA开发手册
    史上最全的Java命名规范参考!
    Java包(package)的作用、命名规范,以及包命名注意事项

3. Java 中常用的标准包

  1. java.lang:包含Java语言的核心类,如String、Math、System和Thread,无需显式导入,自动导入
  2. java.util:包含Java工具类库,如集合框架、日期时间类和随机数生成器
  3. java. io:包含Java输入/输出类库,如文件读写、网络通信等
  4. java. net:包含Java网络编程类库,如URL、Socket等
  5. java.sql:包含Java数据库编程类库,如JDBC接口
  6. java.awt:包含Java图形用户界面编程类库,如窗口、按钮、文本框等
查看更多标准库
  1. javax.swing:包含Java图形用户界面编程类库,如窗口、按钮、文本框等,是AWT的扩展
  2. java.nio:包含Java非阻塞I/O类库,如缓冲区、通道等
  3. java.lang.reflect:包含Java反射机制类库,如Class、Method、Field等
  4. java.security:包含Java安全类库,如加密、签名等
  5. java.rmi:包含Java远程方法调用类库,如RMI接口
  6. java.rmi.registry:包含Java远程方法调用注册表类库,如Registry、LocateRegistry等
  7. java.rmi.server:包含Java远程方法调用服务器类库,如UnicastRemoteObject、Skeleton等
  8. java.text:包含Java文本处理类库,如日期时间格式化、数字格式化等
  9. java.time:包含Java日期时间类库,如LocalDate、LocalTime、LocalDateTime等
  10. java.util.concurrent:包含Java并发编程类库,如线程池、锁等
  11. java.util.logging:包含Java日志类库,如Logger、Handler等
  12. java.util.prefs:包含Java首选项类库,如Preferences等
  13. java.util.regex:包含Java正则表达式类库,如Pattern、Matcher等
  14. java.util.zip:包含Java压缩类库,如ZipInputStream、ZipOutputStream等
  15. javax.crypto:包含Java加密类库,如Cipher、SecretKey等
  16. javax.imageio:包含Java图像I/O类库,如ImageIO、ImageReader等
  17. javax.jws:包含Java Web服务类库,如@WebService、@WebMethod等
  18. javax.management:包含Java管理类库,如MBean、MBeanServer等
  19. 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

其中,arg1arg2arg3是传递给主函数的参数。在程序中,可以通过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数据类型思维导图
graph LR A(数据类型)-->B1(基本数据类型) A-->B2(引用数据类型) B1-->C1(整数类型) B1-->C2(字符类型) B1-->C3(布尔类型) B1-->C4(浮点类型) C1-->D1(byte字节型) C1-->D2(short短整型) C1-->D3(int整型) C1-->D4(long长整型) C2-->E1(char字符型) C3-->F1(boolean布尔型) C4-->F2(float浮点型) C4-->F3(double双精度浮点型) B2-->G1(类) B2-->G2(接口) B2-->G3(数组) B2-->G4(字符串)

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中的关键字具有以下特点:

  • 关键字都是小写的。
  • 关键字不能用作标识符。
  • 关键字具有特殊的含义,不能随意使用。