Java SE(Standard Edition)是Java编程语言的标准版本,提供了基础的编程环境和API,适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。
1. Java环境基础
具体可参考这里对三者的介绍 传送门
1.1 JVM, JRE 和 JDK
JVM(Java Virtual Machine): 是 Java 虚拟机,负责执行 Java 字节码。JVM 提供了平台无关性,使得 Java 程序可以在不同操作系统上运行。
JRE(Java Runtime Environment): 是 Java 运行时环境,包括 JVM 和 Java 类库。JRE 是执行 Java 程序所需的基本软件包。
JDK(Java Development Kit): 是 Java 开发工具包,包含 JRE 和开发工具(如编译器
javac
、Java 文档生成工具javadoc
等)。用于开发和编译 Java 程序。
1.2 编译原理
Java 源代码文件(.java)通过 JDK 中的编译器转换为字节码文件(.class)。这个过程使用 JIT(即时编译器)在 JVM 中将字节码转换为机器码,以实现跨平台运行。
// 示例代码:编写 Java 程序
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
// 编译命令:javac HelloWorld.java
// 运行命令:java HelloWorld
2. 运算符
具体可以参考这篇传送门
Java 包含多种运算符,包括算术运算符、关系运算符、逻辑运算符等。例如:
- 算术运算符:
+, -, *, /, %
- 关系运算符:
==, !=, >, <, >=, <=
- 逻辑运算符:
&&, ||, !
位运算符:& | ^ ~ >> << >>>
byte byteValue = 100; // 1字节
short shortValue = 10000; // 2字节
int intValue = 100000; // 4字节
long longValue = 100000L; // 8字节
float floatValue = 10.5f; // 4字节
double doubleValue = 20.99; // 8字节
char charValue = 'A'; // 2字节
boolean booleanValue = true; // 1字节
int a = 5; // 二进制:0101
int b = 3; // 二进制:0011
System.out.println(a & b); // 输出 1 (二进制:0001)
System.out.println(a | b); // 输出 7 (二进制:0111)
System.out.println(a ^ b); // 输出 6 (二进制:0110)
System.out.println(~a); // 输出 -6 (二进制:...11111010)
System.out.println(a << 1); // 输出 10 (二进制:1010)
System.out.println(a >> 1); // 输出 2 (二进制:0010)
3. 面向对象
3.1 三大特性
封装: 将数据和方法包装在类中,通过访问控制符控制访问权限。
继承: 子类继承父类的属性和方法。
多态: 允许对象以多种形式存在,通常通过方法重载和重写实现。
示例代码:
class Animal {
void sound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Bark");
}
}
3.2 重写和重载的区别
重写: 子类对父类方法的实现进行修改,方法名、参数列表相同。
重载: 同一个类中,方法名相同但参数列表不同。
示例代码:
class MathUtil {
// 方法重载
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
3.3 抽象类与接口
抽象类: 使用
abstract
关键字声明,不能实例化,可以包含抽象方法和实现的方法。接口: 通过
interface
关键字声明,完全抽象,不能包含实现的方法(Java 8 之后可以包含默认方法)。
示例代码:
abstract class Shape {
abstract void draw();
}
interface Drawable {
void draw();
}
3.4 访问控制符的区别
- public: 公开,任何类都可以访问。
- protected: 保护,仅限同一包和子类访问。
- default: 默认,仅限同一包访问。
- private: 私有,仅限类内部访问。
4. 集合框架
可以参考这里传送门
Java 集合框架提供了多种数据结构的实现,主要包括:
- List: 有序可重复集合,如
ArrayList
和LinkedList
。- Set: 无序不可重复集合,如
HashSet
和TreeSet
。- Map: 键值对集合,如
HashMap
和TreeMap
。- Stack:栈(后进先出)
- Queue:队列(先进先出)
4.1 继承关系
Collection
接口是所有集合的根接口。List
和Set
继承自Collection
。Map
和Collection
平行存在。
4.2 equals 与 == 的区别
==
比较的是对象的引用(内存地址)。equals()
方法比较的是对象的内容。
示例代码:
String str1 = new String("Java");
String str2 = new String("Java");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
4.3 hashCode 的作用
可以参考这里传送门
hashCode()
方法返回对象的哈希码,用于哈希表中存储和查找对象。
5. IO流框架
Java IO流用于数据的输入输出操作,主要分为字节流和字符流。
具体可以参考这篇 传送门
5.1 字节流与字符流
-
字节流: 处理原始二进制数据,
InputStream
和OutputStream
是字节流的基类。 -
字符流: 处理文本数据,
Reader
和Writer
是字符流的基类。
5.2 序列化
Java 对象可以被序列化为字节流并通过流传输。实现 Serializable
接口即可。
示例代码:
import java.io.*;
class Person implements Serializable {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// 序列化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"));
oos.writeObject(new Person("John", 30));
oos.close();
// 反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"));
Person person = (Person) ois.readObject();
ois.close();
6. Java中的常用类
- Random: 用于生成随机数。
- System: 包含系统级别功能,如输入输出。
- 时间类:
LocalDate
,LocalTime
,LocalDateTime
处理时间和日期。- String: 处理不可变字符串。
- Arrays: 提供数组操作的方法。
- Collection: 提供集合的操作方法。
- 包装类: 包装基本数据类型,例如
Integer
,Double
。- 常量池: 字符串常量池用于提高内存利用率。
示例代码:
int randomNum = new Random().nextInt(100); // 生成 0-99 的随机数
String str = "Hello, World!";
String[] splitStr = str.split(", "); // 分割字符串
7. 异常处理机制
Java 提供异常处理机制,使用 try
, catch
, finally
.
7.1 自定义异常类
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
try {
throw new MyException("自定义异常");
} catch (MyException e) {
System.out.println(e.getMessage());
}
8. 多线程编程
Java 支持多线程,通过 Thread
类和 Runnable
接口实现。
8.1 线程安全的三大特性
- 原子性
- 可见性
- 有序性
8.2 线程锁与关键字
使用 synchronized
关键字实现同步,确保线程安全。
class Counter {
private int count = 0;
synchronized void increment() {
count++;
}
}
9. 网络编程
Java 提供了强大的网络编程支持,主要使用 Socket
和 ServerSocket
类。
9.1 端口与监听
- 端口: 用于区分不同的网络应用程序。
-
监听: 服务器通过
ServerSocket
监听特定端口的连接请求。
示例代码
// 服务器端
try (ServerSocket serverSocket = new ServerSocket(8888)) {
Socket socket = serverSocket.accept();
// 处理客户端请求
}
// 客户端
try (Socket socket = new Socket("localhost", 8888)) {
// 发送请求
}
10. GUI图形界面编程
Java 提供 AWT 和 Swing 用于图形用户界面开发。
/*
* Created by JFormDesigner on Sun Sep 29 17:23:34 CST 2024
*/
package com.ffyc.homework;
import java.awt.*;
import javax.swing.*;
/**
* @author 20526
*/
public class UserLogin extends JFrame {
private JButton loginButton;
private JButton registerButton;
private JPasswordField passwordField;
private JTextField usernameField;
private JLabel usernameLabel;
private JLabel passwordLabel;
public UserLogin() {
super("用户登录界面");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
this.setVisible(true);
// 添加按钮的事件监听器
loginButton.addActionListener(e -> System.out.println("登录成功!"));
registerButton.addActionListener(e -> System.out.println("注册成功!"));
}
private void initComponents() {
// 初始化组件
loginButton = new JButton("登录");
registerButton = new JButton("注册");
passwordField = new JPasswordField();
usernameField = new JTextField();
usernameLabel = new JLabel("用户名");
passwordLabel = new JLabel("密码");
// 设置颜色
Color backgroundColor = new Color(245, 245, 245);
Color buttonColor = new Color(70, 130, 180);
Color buttonHoverColor = new Color(100, 149, 237);
// 设置内容面板
Container contentPane = getContentPane();
contentPane.setLayout(null);
contentPane.setBackground(backgroundColor);
// 设置按钮样式
loginButton.setBackground(buttonColor);
loginButton.setForeground(Color.WHITE);
registerButton.setBackground(buttonColor);
registerButton.setForeground(Color.WHITE);
loginButton.setOpaque(true);
loginButton.setBorderPainted(false);
registerButton.setOpaque(true);
registerButton.setBorderPainted(false);
// 鼠标进入时改变按钮颜色
loginButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
loginButton.setBackground(buttonHoverColor);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
loginButton.setBackground(buttonColor);
}
});
registerButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
registerButton.setBackground(buttonHoverColor);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
registerButton.setBackground(buttonColor);
}
});
// 设置组件位置和大小
usernameLabel.setBounds(200, 170, 55, 40);
usernameField.setBounds(275, 165, 200, 50);
passwordLabel.setBounds(200, 230, 55, 40);
passwordField.setBounds(275, 225, 200, 45);
loginButton.setBounds(280, 295, 80, 30);
registerButton.setBounds(400, 295, 75, registerButton.getPreferredSize().height);
// 将组件添加到面板
contentPane.add(usernameLabel);
contentPane.add(usernameField);
contentPane.add(passwordLabel);
contentPane.add(passwordField);
contentPane.add(loginButton);
contentPane.add(registerButton);
// 设置窗口大小和位置
contentPane.setPreferredSize(new Dimension(770, 620));
pack();
setLocationRelativeTo(getOwner());
}
public static void main(String[] args) {
new UserLogin();
}
}
运行结果演示
以上就是 Java SE 简单回顾,详细内容可参考我往期博客。希望能对你理解和学习 Java SE 有所帮助。