目录
第1章 Java简介
1.1 Java的历史和发展
Java最初由Sun Microsystems的James Gosling及其团队在1991年开发,并于1995年正式发布。Java最初被命名为Oak,目的是用于消费电子产品中的嵌入式系统。但随着互联网的兴起,Java逐渐演变为一种主要用于网络编程的语言。
Java自发布以来经历了多个版本的更新,从最初的JDK 1.0到现在的Java 17,每个版本都带来了新的功能和改进。Java的"一次编写,到处运行"(Write Once, Run Anywhere)的特性使其成为跨平台应用开发的首选语言。
1.2 Java的特点
-
平台无关性:Java的最大特点是平台无关性。这主要得益于Java虚拟机(JVM)的作用,JVM可以在任何支持的操作系统上运行Java字节码文件,从而实现跨平台运行。
-
面向对象:Java是一种纯面向对象的编程语言,支持封装、继承和多态等OOP特性,使得代码具有良好的可维护性和可扩展性。
-
安全性:Java提供了丰富的安全机制,包括字节码验证、类加载器、沙箱模型等,特别是在网络环境中,Java的安全性尤为突出。
-
多线程:Java内置了对多线程编程的支持,允许开发者轻松实现并发程序,这在处理大型、复杂的应用程序时尤为重要。
1.3 Java开发环境
要开始Java开发,需要安装JDK(Java Development Kit)。JDK包含了JRE(Java Runtime Environment)和一系列开发工具,如编译器(javac)和调试器(jdb)。配置好环境变量后,你可以在命令行中编译并运行Java程序。
第一个Java程序:Hello World
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
这个简单的程序展示了Java的基本结构,包括类定义、主方法和输出语句。
第2章 Java基础语法
2.1 数据类型与变量
Java提供了多种数据类型,可以分为两大类:基本数据类型和引用数据类型。
-
基本数据类型:包括四种整型(byte, short, int, long)、两种浮点型(float, double)、字符型(char)和布尔型(boolean)。基本数据类型直接存储数值,如:
int number = 10; float price = 19.99f; char letter = 'A'; boolean isTrue = true;
-
引用数据类型:包括类、接口、数组等,它们存储的是对象的引用(即内存地址),而不是对象本身。
String message = "Hello, Java!"; int[] numbers = {1, 2, 3, 4, 5};
2.2 运算符
Java提供了多种运算符以操作变量和数据:
-
算术运算符:包括加(+)、减(-)、乘(*)、除(/)、取余(%),用于数学运算。
int sum = 10 + 5; int remainder = 10 % 3;
-
关系运算符:用于比较两个数值,返回布尔值(true或false)。如等于(==)、不等于(!=)、大于(>)、小于(<)等。
boolean isEqual = (10 == 10); // true boolean isGreater = (10 > 5); // true
-
逻辑运算符:用于布尔逻辑运算,如与(&&)、或(||)、非(!)。
boolean result = (10 > 5) && (5 < 3); // false
-
赋值运算符:用于给变量赋值,如简单赋值(=)、加等赋值(+=)、减等赋值(-=)。
int x = 10; x += 5; // x = x + 5
2.3 控制流
Java的控制流语句用于控制程序的执行流程:
-
条件语句:根据条件的真假来执行不同的代码块。
if (x > 10) { System.out.println("x is greater than 10"); } else { System.out.println("x is less than or equal to 10"); } switch (day) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; default: System.out.println("Other day"); break; }
-
循环语句:重复执行某段代码,直到条件为false。
for (int i = 0; i < 5; i++) { System.out.println("i = " + i); } while (x > 0) { x--; } do { x++; } while (x < 5);
-
跳转语句:用于跳过或终止循环。
for (int i = 0; i < 10; i++) { if (i == 5) { continue; // 跳过当前循环 } if (i == 8) { break; // 终止循环 } }
第3章 面向对象编程(OOP)
3.1 类与对象
在Java中,类是对象的模板,而对象是类的实例。类定义了对象的属性和行为,而对象是类的实际表现。
-
类的定义:
public class Car { String brand; String model; int year; void start() { System.out.println(brand + " " + model + " is starting."); } }
-
对象的创建:
Car myCar = new Car(); myCar.brand = "Toyota"; myCar.model = "Corolla"; myCar.year = 2020; myCar.start();
-
构造方法:用于初始化对象。
public class Car { String brand; String model; int year; // 构造方法 public Car(String brand, String model, int year) { this.brand = brand; this.model = model; this.year = year; } void start() { System.out.println(brand + " " + model + " is starting."); } } Car myCar = new Car("Toyota", "Corolla", 2020); myCar.start();
3.2 继承与多态
继承允许新类基于已有类创建,增强了代码的复用性。多态性允许对象以多种形式存在。
-
继承的实现:
public class Vehicle { String brand; void start() { System.out.println("Vehicle is starting."); } } public class Car extends Vehicle { String model; void start() { System.out.println("Car " + brand + " " + model + " is starting."); } } Car myCar = new Car(); myCar.brand = "Toyota"; myCar.model = "Corolla"; myCar.start(); // 输出: Car Toyota Corolla is starting.
-
多态的实现:
Vehicle myVehicle = new Car(); // 父类引用指向子类对象 myVehicle.start(); // 输出: Car is starting.
3.3 封装与抽象
封装是指将对象的属性私有化,提供公共的访问方法。抽象则是通过抽象类和接口来隐藏实现细节,强调行为而非具体实现。
-
封装的实现:
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
抽象类与接口:
abstract class Animal { abstract void makeSound(); } class Dog extends Animal { void makeSound() { System.out.println("Woof Woof"); } } interface Drivable { void drive(); } class Car implements Drivable { public void drive() { System.out.println("Car is driving"); } }
第4章 异常处理
4.1 异常的概念
在Java中,异常是一种用于指示程序在运行时发生错误的机制。Java通过异常处理机制来捕获和处理这些错误,从而使程序能够在发生异常时采取适当的措施,而不是直接终止运行。
异常可以分为两大类:
- 检查异常(Checked Exception):在编译时就必须处理的异常,如IOException、SQLException。
- 非检查异常(Unchecked Exception):包括运行时异常(RuntimeException)和错误(Error),如NullPointerException、ArrayIndexOutOfBoundsException。
4.2 异常处理机制
Java提供了try-catch-finally
语句来处理异常,使得代码更加健壮。
-
try-catch语句:
try { int result = 10 / 0; } catch (ArithmeticException e) { System.out.println("ArithmeticException caught: " + e.getMessage()); }
在这个例子中,
try
块中的代码尝试执行除以零的操作,这会抛出ArithmeticException
异常。catch
块捕获了该异常并进行了处理。 -
finally块:无论是否发生异常,
finally
块中的代码都会执行,通常用于释放资源。try { // 打开资源 } catch (Exception e) { // 处理异常 } finally { // 关闭资源 }
-
throw与throws关键字:
throw
用于显式抛出异常,而throws
则声明一个方法可能抛出的异常。public void checkAge(int age) throws IllegalArgumentException { if (age < 18) { throw new IllegalArgumentException("Age must be 18 or above."); } }
4.3 自定义异常
Java允许开发者根据特定的应用需求自定义异常类,以更好地表示某些特定错误情况。
-
自定义异常类:
public class InsufficientFundsException extends Exception { public InsufficientFundsException(String message) { super(message); } }
-
使用自定义异常:
public void withdraw(double amount) throws InsufficientFundsException { if (balance < amount) { throw new InsufficientFundsException("Insufficient balance."); } balance -= amount; }
第5章 Java常用类库
5.1 字符串处理
Java中处理字符串的类主要有String
、StringBuilder
和StringBuffer
。
-
String类:
String
是一个不可变类,一旦创建就不能修改。String greeting = "Hello"; greeting = greeting + " World!"; System.out.println(greeting); // 输出: Hello World!
-
StringBuilder和StringBuffer: 这两个类用于可变字符串操作,
StringBuilder
在单线程环境下使用,而StringBuffer
是线程安全的。StringBuilder sb = new StringBuilder("Hello"); sb.append(" World!"); System.out.println(sb.toString()); // 输出: Hello World!
5.2 集合框架
Java集合框架提供了多种数据结构,如List
、Set
、Map
等,用于存储和操作数据。
-
List接口:有序集合,允许重复元素。常用实现类有
ArrayList
和LinkedList
。List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("apple");
-
Set接口:无序集合,不允许重复元素。常用实现类有
HashSet
、TreeSet
。Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana");
-
Map接口:键值对映射,键不能重复。常用实现类有
HashMap
、TreeMap
。Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2);
5.3 输入输出流(I/O)
Java的I/O操作涉及到读取和写入数据的流。
-
File类:用于表示文件和目录路径名。
File file = new File("example.txt"); if (file.exists()) { System.out.println("File exists"); }
-
字节流与字符流:
InputStream
和OutputStream
用于处理字节数据,而Reader
和Writer
用于处理字符数据。FileInputStream fis = new FileInputStream("example.txt"); int data = fis.read(); while (data != -1) { System.out.print((char) data); data = fis.read(); } fis.close();
-
序列化与反序列化:通过
ObjectOutputStream
和ObjectInputStream
可以实现对象的序列化与反序列化。ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat")); oos.writeObject(new Person("John", 25)); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat")); Person person = (Person) ois.readObject(); ois.close();
第6章 多线程编程
6.1 线程的基本概念
线程是程序执行的最小单元。Java中的每个线程都通过继承Thread
类或实现Runnable
接口来实现。
-
创建线程:
public class MyThread extends Thread { public void run() { System.out.println("Thread is running"); } } MyThread thread = new MyThread(); thread.start();
或者:
public class MyRunnable implements Runnable { public void run() { System.out.println("Runnable is running"); } } Thread thread = new Thread(new MyRunnable()); thread.start();
6.2 线程的生命周期
线程的生命周期包括以下状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。
- 线程控制:
sleep()
:使线程暂停指定时间。join()
:等待线程终止。yield()
:让出CPU执行权给其他线程。
thread1.join();
6.3 线程同步与线程安全
在多线程环境下,如果多个线程同时访问同一个共享资源,可能会出现数据不一致的问题。Java提供了同步方法
和同步代码块
来保证线程安全。复制代码
-
public synchronized void increment() { count++; }
-
同步代码块:
public void increment() { synchronized(this) { count++; } }
-
线程通信:通过
wait()
、notify()
、notifyAll()
实现线程间的通信。synchronized(this) { while(condition) { wait(); } // 执行某些操作 notifyAll(); }
第7章 网络编程
7.1 网络基础
Java网络编程基于TCP/IP协议栈,可以通过Socket
和ServerSocket
类实现客户端和服务器之间的通信。
- IP地址和端口号:IP地址用于标识网络中的设备,端口号用于标识应用程序。
- TCP与UDP:TCP(传输控制协议)提供可靠的、面向连接的通信,而UDP(用户数据报协议)提供不可靠的、无连接的通信。
7.2 Java中的网络编程
-
Socket编程:用于实现客户端和服务器之间的双向通信。
// 客户端 Socket socket = new Socket("localhost", 8080); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello, Server!"); // 服务器 ServerSocket serverSocket = new ServerSocket(8080); Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String message = in.readLine(); System.out.println("Received: " + message);
-
URL与URLConnection:用于通过HTTP协议访问网络资源。
URL url = new URL("http://example.com"); URLConnection conn = url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); } in.close();