欢迎来到Java编程世界!本章将为你介绍Java语言的基础概念、特点和发展历程,为后续的深入学习打下坚实的基础。
1.1 Java简介
什么是Java?
Java是一种面向对象的编程语言,由Sun Microsystems公司(现为Oracle公司)于1995年发布。Java以其”一次编写,到处运行”(Write Once, Run Anywhere, WORA)的特性而闻名。
Java的核心特点
1. 平台无关性
Java程序编译后生成字节码(Bytecode),运行在Java虚拟机(JVM)上,实现了跨平台特性。
// Java源代码 (.java)
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
// 编译过程:
// HelloWorld.java → javac → HelloWorld.class (字节码)
// 运行过程:
// HelloWorld.class → JVM → 在任何支持JVM的平台上运行
2. 面向对象
Java是纯面向对象的语言,一切皆对象(除了基本数据类型)。
// 类的定义
public class Student {
// 属性(成员变量)
private String name;
private int age;
// 构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 方法
public void study() {
System.out.println(name + " is studying.");
}
// Getter和Setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 对象的创建和使用
public class Main {
public static void main(String[] args) {
Student student = new Student("张三", 20);
student.study();
System.out.println("学生姓名:" + student.getName());
}
}
3. 自动内存管理
Java具有自动垃圾回收(Garbage Collection, GC)机制,自动管理内存分配和释放。
public class MemoryExample {
public static void main(String[] args) {
// 创建对象,JVM自动分配内存
String str1 = new String("Hello");
String str2 = new String("World");
// 当对象不再被引用时,GC会自动回收内存
str1 = null; // str1指向的对象变为垃圾,等待回收
// 手动建议进行垃圾回收(不保证立即执行)
System.gc();
}
}
4. 强类型系统
Java是强类型语言,所有变量必须先声明类型才能使用。
public class TypeExample {
public static void main(String[] args) {
// 基本数据类型
int number = 42;
double price = 99.99;
boolean isActive = true;
char grade = 'A';
// 引用数据类型
String message = "Hello Java";
int[] numbers = {1, 2, 3, 4, 5};
// 类型转换
double result = number + price; // 自动类型提升
int intResult = (int) price; // 强制类型转换
System.out.println("Number: " + number);
System.out.println("Price: " + price);
System.out.println("Result: " + result);
System.out.println("Int Result: " + intResult);
}
}
5. 多线程支持
Java内置了多线程支持,可以轻松创建并发程序。
// 继承Thread类
class MyThread extends Thread {
private String threadName;
public MyThread(String name) {
this.threadName = name;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(threadName + " - Count: " + i);
try {
Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
System.out.println("Thread interrupted.");
}
}
}
}
// 实现Runnable接口
class MyRunnable implements Runnable {
private String threadName;
public MyRunnable(String name) {
this.threadName = name;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(threadName + " - Count: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread interrupted.");
}
}
}
}
public class ThreadExample {
public static void main(String[] args) {
// 使用Thread类
MyThread thread1 = new MyThread("Thread-1");
thread1.start();
// 使用Runnable接口
Thread thread2 = new Thread(new MyRunnable("Thread-2"));
thread2.start();
// 使用Lambda表达式(Java 8+)
Thread thread3 = new Thread(() -> {
for (int i = 1; i <= 5; i++) {
System.out.println("Lambda-Thread - Count: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread interrupted.");
}
}
});
thread3.start();
}
}
1.2 Java发展历程
主要版本里程碑
版本 | 发布年份 | 主要特性 |
---|---|---|
Java 1.0 | 1996 | 初始版本,AWT图形界面 |
Java 1.1 | 1997 | 内部类,JavaBeans,JDBC |
Java 1.2 (J2SE) | 1998 | Swing,集合框架,JIT编译器 |
Java 1.3 | 2000 | HotSpot JVM,JNDI |
Java 1.4 | 2002 | 断言,正则表达式,NIO |
Java 5 (1.5) | 2004 | 泛型,枚举,注解,自动装箱 |
Java 6 | 2006 | 脚本引擎,Web服务 |
Java 7 | 2011 | try-with-resources,钻石操作符 |
Java 8 | 2014 | Lambda表达式,Stream API,默认方法 |
Java 9 | 2017 | 模块系统,JShell |
Java 10 | 2018 | 局部变量类型推断(var) |
Java 11 | 2018 | HTTP Client,字符串方法增强 |
Java 17 | 2021 | 密封类,模式匹配增强(LTS版本) |
Java 21 | 2023 | 虚拟线程,模式匹配for switch(LTS版本) |
Java版本特性示例
Java 8 - Lambda表达式和Stream API
import java.util.*;
import java.util.stream.*;
public class Java8Features {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
// 传统方式
List<String> filteredNames = new ArrayList<>();
for (String name : names) {
if (name.length() > 3) {
filteredNames.add(name.toUpperCase());
}
}
Collections.sort(filteredNames);
// Java 8 Stream API方式
List<String> result = names.stream()
.filter(name -> name.length() > 3) // Lambda表达式
.map(String::toUpperCase) // 方法引用
.sorted() // 排序
.collect(Collectors.toList()); // 收集结果
System.out.println("传统方式结果: " + filteredNames);
System.out.println("Stream API结果: " + result);
// 函数式接口
Runnable task = () -> System.out.println("Hello from Lambda!");
task.run();
}
}
Java 10 - var关键字
import java.util.*;
public class Java10Features {
public static void main(String[] args) {
// 局部变量类型推断
var message = "Hello Java 10!"; // 推断为String
var number = 42; // 推断为int
var list = new ArrayList<String>(); // 推断为ArrayList<String>
var map = Map.of("key1", "value1", "key2", "value2"); // 推断为Map<String, String>
list.add("Item 1");
list.add("Item 2");
System.out.println("Message: " + message);
System.out.println("Number: " + number);
System.out.println("List: " + list);
System.out.println("Map: " + map);
}
}
Java 17 - 密封类
// 密封类定义
public sealed class Shape permits Circle, Rectangle, Triangle {
protected final String name;
protected Shape(String name) {
this.name = name;
}
public abstract double area();
}
// 允许的子类
final class Circle extends Shape {
private final double radius;
public Circle(double radius) {
super("Circle");
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
final class Rectangle extends Shape {
private final double width, height;
public Rectangle(double width, double height) {
super("Rectangle");
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
non-sealed class Triangle extends Shape {
private final double base, height;
public Triangle(double base, double height) {
super("Triangle");
this.base = base;
this.height = height;
}
@Override
public double area() {
return 0.5 * base * height;
}
}
// 使用密封类
public class SealedClassExample {
public static void main(String[] args) {
Shape circle = new Circle(5.0);
Shape rectangle = new Rectangle(4.0, 6.0);
Shape triangle = new Triangle(3.0, 4.0);
System.out.println("Circle area: " + circle.area());
System.out.println("Rectangle area: " + rectangle.area());
System.out.println("Triangle area: " + triangle.area());
// 模式匹配(Java 17预览特性)
printShapeInfo(circle);
printShapeInfo(rectangle);
}
public static void printShapeInfo(Shape shape) {
switch (shape) {
case Circle c -> System.out.println("这是一个圆形");
case Rectangle r -> System.out.println("这是一个矩形");
case Triangle t -> System.out.println("这是一个三角形");
}
}
}
1.3 Java生态系统
核心组件
1. Java虚拟机(JVM)
// JVM内存区域示例
public class JVMExample {
// 方法区(元空间)- 存储类信息
private static final String CONSTANT = "Hello";
// 堆内存 - 存储对象实例
private String instanceVariable;
public static void main(String[] args) {
// 栈内存 - 存储局部变量和方法调用
int localVariable = 10;
// 创建对象(在堆中分配内存)
JVMExample example = new JVMExample();
example.instanceVariable = "Instance";
// 方法调用(在栈中创建栈帧)
example.methodCall(localVariable);
}
private void methodCall(int parameter) {
// 局部变量(在当前栈帧中)
String localString = "Local";
System.out.println("Parameter: " + parameter);
System.out.println("Local: " + localString);
System.out.println("Instance: " + instanceVariable);
System.out.println("Constant: " + CONSTANT);
}
}
2. Java开发工具包(JDK)
# JDK主要工具
javac # Java编译器
java # Java运行时
javadoc # 文档生成工具
jar # 打包工具
jdb # 调试器
jps # 进程状态工具
jstat # 统计信息工具
jmap # 内存映射工具
jstack # 线程堆栈工具
3. Java运行时环境(JRE)
// 运行时信息获取
public class RuntimeExample {
public static void main(String[] args) {
// 获取运行时信息
Runtime runtime = Runtime.getRuntime();
System.out.println("可用处理器数量: " + runtime.availableProcessors());
System.out.println("JVM最大内存: " + runtime.maxMemory() / 1024 / 1024 + " MB");
System.out.println("JVM总内存: " + runtime.totalMemory() / 1024 / 1024 + " MB");
System.out.println("JVM空闲内存: " + runtime.freeMemory() / 1024 / 1024 + " MB");
// 获取系统属性
System.out.println("Java版本: " + System.getProperty("java.version"));
System.out.println("操作系统: " + System.getProperty("os.name"));
System.out.println("用户目录: " + System.getProperty("user.home"));
System.out.println("工作目录: " + System.getProperty("user.dir"));
}
}
主要框架和库
1. Spring框架
// Spring Boot示例
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SpringBootExample {
@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
public static void main(String[] args) {
SpringApplication.run(SpringBootExample.class, args);
}
}
2. 数据库访问
// JDBC示例
import java.sql.*;
public class JDBCExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
// 创建表
String createTable = "CREATE TABLE IF NOT EXISTS users (" +
"id INT PRIMARY KEY AUTO_INCREMENT, " +
"name VARCHAR(50), " +
"email VARCHAR(100))";
try (Statement statement = connection.createStatement()) {
statement.execute(createTable);
}
// 插入数据
String insertSQL = "INSERT INTO users (name, email) VALUES (?, ?)";
try (PreparedStatement pstmt = connection.prepareStatement(insertSQL)) {
pstmt.setString(1, "张三");
pstmt.setString(2, "zhangsan@example.com");
pstmt.executeUpdate();
}
// 查询数据
String selectSQL = "SELECT * FROM users";
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(selectSQL)) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1.4 Java应用领域
1. 企业级应用开发
// 企业级应用示例 - 简单的订单管理系统
import java.time.LocalDateTime;
import java.util.*;
// 实体类
class Order {
private String orderId;
private String customerId;
private List<OrderItem> items;
private LocalDateTime orderDate;
private OrderStatus status;
public Order(String orderId, String customerId) {
this.orderId = orderId;
this.customerId = customerId;
this.items = new ArrayList<>();
this.orderDate = LocalDateTime.now();
this.status = OrderStatus.PENDING;
}
// Getters and Setters
public String getOrderId() { return orderId; }
public String getCustomerId() { return customerId; }
public List<OrderItem> getItems() { return items; }
public LocalDateTime getOrderDate() { return orderDate; }
public OrderStatus getStatus() { return status; }
public void setStatus(OrderStatus status) { this.status = status; }
public void addItem(OrderItem item) {
items.add(item);
}
public double getTotalAmount() {
return items.stream().mapToDouble(OrderItem::getTotalPrice).sum();
}
}
class OrderItem {
private String productId;
private String productName;
private int quantity;
private double unitPrice;
public OrderItem(String productId, String productName, int quantity, double unitPrice) {
this.productId = productId;
this.productName = productName;
this.quantity = quantity;
this.unitPrice = unitPrice;
}
public double getTotalPrice() {
return quantity * unitPrice;
}
// Getters
public String getProductId() { return productId; }
public String getProductName() { return productName; }
public int getQuantity() { return quantity; }
public double getUnitPrice() { return unitPrice; }
}
enum OrderStatus {
PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED
}
// 服务类
class OrderService {
private Map<String, Order> orders = new HashMap<>();
public Order createOrder(String customerId) {
String orderId = "ORD" + System.currentTimeMillis();
Order order = new Order(orderId, customerId);
orders.put(orderId, order);
return order;
}
public Order getOrder(String orderId) {
return orders.get(orderId);
}
public void updateOrderStatus(String orderId, OrderStatus status) {
Order order = orders.get(orderId);
if (order != null) {
order.setStatus(status);
}
}
public List<Order> getOrdersByCustomer(String customerId) {
return orders.values().stream()
.filter(order -> order.getCustomerId().equals(customerId))
.toList();
}
}
// 主类
public class EnterpriseExample {
public static void main(String[] args) {
OrderService orderService = new OrderService();
// 创建订单
Order order = orderService.createOrder("CUST001");
order.addItem(new OrderItem("PROD001", "笔记本电脑", 1, 5999.99));
order.addItem(new OrderItem("PROD002", "鼠标", 2, 99.99));
System.out.println("订单ID: " + order.getOrderId());
System.out.println("客户ID: " + order.getCustomerId());
System.out.println("订单总额: " + order.getTotalAmount());
System.out.println("订单状态: " + order.getStatus());
// 更新订单状态
orderService.updateOrderStatus(order.getOrderId(), OrderStatus.CONFIRMED);
System.out.println("更新后状态: " + order.getStatus());
}
}
2. Android移动应用开发
// Android Activity示例
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView textView;
private Button button;
private int clickCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化视图组件
textView = findViewById(R.id.textView);
button = findViewById(R.id.button);
// 设置点击事件监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickCount++;
textView.setText("点击次数: " + clickCount);
}
});
// 使用Lambda表达式(Android支持Java 8特性)
// button.setOnClickListener(v -> {
// clickCount++;
// textView.setText("点击次数: " + clickCount);
// });
}
}
3. Web开发
// Servlet示例
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Hello Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello from Java Servlet!</h1>");
out.println("<p>当前时间: " + new java.util.Date() + "</p>");
out.println("</body>");
out.println("</html>");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
1.5 Java与其他语言对比
Java vs Python
// Java版本 - 计算斐波那契数列
public class FibonacciJava {
public static long fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static void main(String[] args) {
int n = 10;
System.out.println("斐波那契数列前" + n + "项:");
for (int i = 0; i < n; i++) {
System.out.print(fibonacci(i) + " ");
}
}
}
# Python版本 - 计算斐波那契数列
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
n = 10
print(f"斐波那契数列前{n}项:")
for i in range(n):
print(fibonacci(i), end=" ")
Java vs C++
特性 | Java | C++ |
---|---|---|
内存管理 | 自动垃圾回收 | 手动管理 |
平台依赖 | 跨平台(JVM) | 平台相关 |
多重继承 | 不支持(接口多实现) | 支持 |
指针 | 无指针概念 | 支持指针 |
编译方式 | 编译为字节码 | 编译为机器码 |
性能 | 相对较慢 | 更快 |
安全性 | 更安全 | 需要小心处理 |
1.6 学习路径规划
初学者路径(0-3个月)
// 学习目标检查清单
public class LearningPath {
public static void main(String[] args) {
System.out.println("=== Java初学者学习路径 ===");
// 第1阶段:基础语法(1个月)
String[] basicTopics = {
"变量和数据类型",
"运算符和表达式",
"控制结构(if, for, while)",
"数组和字符串",
"方法定义和调用"
};
System.out.println("第1阶段 - 基础语法:");
for (String topic : basicTopics) {
System.out.println(" ☐ " + topic);
}
// 第2阶段:面向对象(1个月)
String[] oopTopics = {
"类和对象",
"封装、继承、多态",
"构造方法和方法重载",
"接口和抽象类",
"异常处理"
};
System.out.println("\n第2阶段 - 面向对象:");
for (String topic : oopTopics) {
System.out.println(" ☐ " + topic);
}
// 第3阶段:核心API(1个月)
String[] apiTopics = {
"集合框架(List, Set, Map)",
"文件I/O操作",
"多线程基础",
"网络编程基础",
"数据库连接(JDBC)"
};
System.out.println("\n第3阶段 - 核心API:");
for (String topic : apiTopics) {
System.out.println(" ☐ " + topic);
}
}
}
进阶路径(3-6个月)
// 进阶学习目标
public class AdvancedLearningPath {
public static void main(String[] args) {
System.out.println("=== Java进阶学习路径 ===");
// 框架学习
String[] frameworks = {
"Spring Framework",
"Spring Boot",
"Spring MVC",
"MyBatis/Hibernate",
"Maven/Gradle构建工具"
};
System.out.println("框架技术:");
for (String framework : frameworks) {
System.out.println(" ☐ " + framework);
}
// 高级特性
String[] advanced = {
"Lambda表达式和Stream API",
"反射和注解",
"泛型深入",
"并发编程",
"JVM调优"
};
System.out.println("\n高级特性:");
for (String topic : advanced) {
System.out.println(" ☐ " + topic);
}
}
}
本章小结
本章我们学习了Java的基础概念:
- Java特点:平台无关性、面向对象、自动内存管理、强类型系统、多线程支持
- 发展历程:从Java 1.0到Java 21的主要版本和特性
- 生态系统:JVM、JDK、JRE以及主要框架
- 应用领域:企业级应用、Android开发、Web开发等
- 学习路径:从基础语法到高级特性的系统学习计划
下一章预告
下一章我们将学习Java环境搭建与开发工具,包括: - JDK安装和配置 - IDE选择和配置 - 项目构建工具 - 调试和性能分析工具
练习题
基础练习
环境检查:
- 查看你的系统Java版本
- 了解JDK和JRE的区别
- 尝试编译和运行第一个Java程序
概念理解:
- 解释”一次编写,到处运行”的含义
- 说明Java的主要特点
- 比较Java与其他编程语言的优缺点
进阶练习
代码分析:
- 分析本章中的多线程示例
- 理解密封类的使用场景
- 探索Stream API的其他用法
实践项目:
- 创建一个简单的学生管理系统
- 实现基本的增删改查功能
- 使用面向对象的设计原则
提示:Java学习需要大量的实践,建议每学完一个概念就立即编写代码验证理解。