第一章:Java基础入门
Java简介与历史
Java语言的起源
- Java语言由Sun公司(现已被Oracle收购)的James Gosling等人于1995年开发
- 最初被称为Oak,后改名为Java
- 设计初衷是为家用电器等嵌入式设备提供编程语言
- Java的名字来源于Java岛盛产的咖啡,这也是为什么Java的图标是一杯咖啡
Java的特点
- 简单性:语法类似C++但去除了指针等复杂特性,更容易学习和使用
- 面向对象:完全面向对象的编程语言,一切皆对象(除基本数据类型外)
- 平台无关性:“一次编写,到处运行”(Write Once, Run Anywhere)
- Java代码编译成字节码,可在任何有Java虚拟机(JVM)的平台上运行
- 不需要针对不同操作系统重写代码
- 安全性:内置多层安全机制,如沙箱执行环境,防止恶意代码破坏系统
- 多线程:内置多线程支持,简化并发编程
- 分布式:设计用于分布式环境,内置网络功能支持
- 健壮性:强类型检查,自动内存管理(垃圾回收),异常处理机制
Java的发展历程
- JDK 1.0 (1996):初始版本,包含基本语言特性和类库
- J2SE 1.2 (1998):引入集合框架,增强GUI功能
- J2SE 5.0 (2004):增加泛型、注解、枚举、可变参数等重要特性
- Java SE 8 (2014):引入Lambda表达式、Stream API、新的日期时间API
- Java SE 11 (2018):第一个长期支持版本(LTS),模块化系统成熟
- Java SE 17 (2021):最新的长期支持版本(LTS),增加密封类等特性
Java的应用领域
- 企业级应用:大型信息系统、电子商务平台、金融系统
- 移动应用:Android应用开发(Android使用Java作为主要开发语言)
- Web应用:网站后端、Web服务、微服务
- 桌面应用:跨平台GUI应用程序
- 大数据处理:Hadoop、Spark等大数据框架
- 科学计算:数值分析、模拟仿真
- 嵌入式系统:智能卡、消费电子产品
开发环境搭建
JDK安装与配置
JDK (Java Development Kit) 是Java开发的核心工具包,包含:
- JRE (Java Runtime Environment):Java运行环境,包含JVM和核心类库
- 编译器:将Java源代码编译为字节码
- 调试器:用于调试Java程序
- 开发工具:如javadoc(文档生成工具)、jar(打包工具)等
下载JDK
- 访问Oracle官网 (https://www.oracle.com/java/technologies/downloads/) 或OpenJDK网站
- 选择适合你操作系统的JDK版本(推荐使用LTS版本,如Java 17)
- 下载安装包
Windows系统安装配置
- 运行下载的安装程序,按照向导完成安装
- 配置环境变量:
- 右键"此电脑"→"属性"→"高级系统设置"→"环境变量"
- 新建系统变量
JAVA_HOME
,值为JDK安装目录(如C:\Program Files\Java\jdk-17
) - 编辑系统变量
Path
,添加%JAVA_HOME%\bin
- 打开命令提示符,输入
java -version
验证安装
macOS系统安装配置
- 运行下载的安装程序,按照向导完成安装
- 打开终端,输入
java -version
验证安装 - 如需手动配置环境变量,编辑
~/.bash_profile
或~/.zshrc
文件:export JAVA_HOME=$(/usr/libexec/java_home) export PATH=$JAVA_HOME/bin:$PATH
Linux系统安装配置
- 使用包管理器安装OpenJDK(以Ubuntu为例):
sudo apt update sudo apt install openjdk-17-jdk
- 配置环境变量,编辑
/etc/profile
或~/.bashrc
文件:export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
- 使环境变量生效:
source /etc/profile
或source ~/.bashrc
- 验证安装:
java -version
集成开发环境(IDE)选择
IDE能大幅提高开发效率,为初学者提供代码补全、错误检查等功能。
IntelliJ IDEA
- 优点:功能强大,智能代码补全,专业开发首选
- 缺点:完整版需付费,学习曲线较陡
- 适合人群:准备长期从事Java开发的学习者
Eclipse
- 优点:开源免费,插件丰富,轻量级
- 缺点:界面不够现代,有时响应较慢
- 适合人群:初学者,预算有限的学习者
NetBeans
- 优点:Oracle官方支持,开箱即用,内置GUI设计器
- 缺点:相对较重,启动较慢
- 适合人群:喜欢一站式解决方案的学习者
VS Code
- 优点:轻量级,启动快,配合插件可用于Java开发
- 缺点:需要额外配置,不是专门为Java设计
- 适合人群:已经熟悉VS Code的学习者
初学者推荐:Eclipse或IntelliJ IDEA社区版,两者都免费且功能足够学习使用。
IDE安装与配置(以IntelliJ IDEA为例)
- 访问JetBrains官网下载IntelliJ IDEA社区版(免费)
- 运行安装程序,按照向导完成安装
- 首次启动时,选择UI主题和插件
- 配置JDK路径:
- 点击
File > Project Structure
- 在
Platform Settings > SDKs
中添加已安装的JDK
- 点击
- 熟悉IDE界面:
- 项目视图:显示项目文件结构
- 编辑器:编写代码的主要区域
- 控制台:显示程序输出和错误信息
- 工具窗口:提供各种辅助功能
创建第一个项目
- 点击
File > New > Project
- 选择
Java
项目类型 - 设置项目名称和位置
- 点击
Finish
创建项目 - 在项目中创建新的Java类:右键点击
src
目录,选择New > Java Class
第一个Java程序
Hello World程序
让我们创建第一个Java程序,向世界问好!
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
程序结构解析
让我们逐行分析这个简单的程序:
-
public class HelloWorld
:类声明public
:访问修饰符,表示这个类可以被任何其他类访问class
:关键字,表示定义一个类HelloWorld
:类名,必须与文件名相同(HelloWorld.java)
-
public static void main(String[] args)
:主方法声明,程序入口public
:访问修饰符,允许JVM调用这个方法static
:关键字,表示这是一个类方法,不需要创建对象就能调用void
:返回类型,表示这个方法不返回任何值main
:方法名,JVM会寻找这个特定名称的方法作为程序入口String[] args
:命令行参数,以字符串数组形式传入
-
System.out.println("Hello, World!");
:输出语句System
:Java核心类,提供系统相关功能out
:System类的静态成员,标准输出流println()
:输出一行文本并换行的方法"Hello, World!"
:要输出的字符串;
:语句结束符
-
大括号
{}
:定义代码块,包含方法体或类体
编译与运行
使用命令行
- 创建文件
HelloWorld.java
,输入上面的代码 - 打开命令行,导航到文件所在目录
- 编译:
javac HelloWorld.java
(生成HelloWorld.class
文件) - 运行:
java HelloWorld
使用IDE
- 在IDE中创建Java类
HelloWorld
- 输入代码
- 点击运行按钮(通常是绿色三角形)
Java程序的执行过程
- 编写源代码(.java文件)
- 编译源代码生成字节码(.class文件)
- JVM加载字节码
- JVM解释执行字节码
Java是混合型语言:编译型(源代码→字节码)+ 解释型(JVM解释执行字节码)
常见错误与解决方法
- 类名与文件名不匹配:Java要求公共类的名称必须与文件名完全一致(包括大小写)
- 缺少分号:Java语句必须以分号结束
- 大小写错误:Java区分大小写,
System
不等于system
- 路径问题:运行时找不到类,检查当前目录和类路径
基本语法规则
标识符
标识符是用来命名类、变量、方法等程序元素的名称。
命名规则
- 由字母、数字、下划线(_)或美元符号($)组成
- 不能以数字开头
- 不能使用Java关键字
- 区分大小写
- 长度无限制
有效的标识符:userName
, _value
, $price
, user123
无效的标识符:123user
(以数字开头), user-name
(包含连字符), class
(关键字)
命名约定
Java有一套标准的命名约定,虽然不强制执行,但遵循这些约定可以使代码更易读。
- 类名:首字母大写,使用驼峰命名法(如
HelloWorld
,StudentInfo
) - 方法名和变量名:首字母小写,使用驼峰命名法(如
firstName
,calculateTotal
) - 常量名:全部大写,单词间用下划线分隔(如
MAX_VALUE
,PI
) - 包名:全部小写(如
java.lang
,com.example.project
)
关键字
关键字是Java语言预定义的、有特殊含义的标识符,不能用作变量名、类名等。
常用关键字
- 数据类型:
boolean
,byte
,char
,double
,float
,int
,long
,short
- 流程控制:
if
,else
,switch
,case
,default
,for
,while
,do
,break
,continue
,return
- 修饰符:
public
,private
,protected
,static
,final
,abstract
,synchronized
,volatile
- 类相关:
class
,interface
,enum
,extends
,implements
,new
,this
,super
- 异常处理:
try
,catch
,finally
,throw
,throws
- 包相关:
package
,import
- 其他:
void
,null
,true
,false
保留字
保留字是Java预留的关键字,当前版本未使用,但未来版本可能会使用:goto
, const
代码结构
语句
Java语句是执行特定操作的代码单元,以分号(;)结束:
int age = 25; // 声明并初始化变量
System.out.println("Age: " + age); // 输出语句
代码块
代码块是由一对大括号{}包围的语句集合:
{
int x = 10;
System.out.println(x);
} // x的作用域仅限于这个代码块
缩进与格式
Java不强制要求特定的缩进,但良好的缩进和格式可以提高代码可读性:
public class Example {
public static void main(String[] args) {
if (args.length > 0) {
System.out.println("Hello, " + args[0]);
} else {
System.out.println("Hello, World");
}
}
}
变量与数据类型
基本数据类型
Java有8种基本数据类型,分为4类:
整数类型
-
byte:8位,范围-128到127
byte smallNumber = 100;
-
short:16位,范围-32,768到32,767
short mediumNumber = 1000;
-
int:32位,范围约-21亿到21亿(最常用的整数类型)
int standardNumber = 100000;
-
long:64位,范围约-9千万兆到9千万兆(需要后缀L或l)
long largeNumber = 1000000000L;
浮点类型
-
float:32位,单精度浮点数(需要后缀F或f)
float decimalNumber = 3.14f;
-
double:64位,双精度浮点数(默认的小数类型)
double preciseNumber = 3.14159265359;
字符类型
- char:16位,表示单个Unicode字符,使用单引号
char letter = 'A'; char unicodeChar = '\u0041'; // Unicode编码,也是'A'
布尔类型
- boolean:表示真(true)或假(false)
boolean isJavaFun = true; boolean isBoring = false;
变量声明与初始化
变量是存储数据的容器,使用前必须声明。
变量声明
数据类型 变量名; // 声明变量
例如:
int age; // 声明整型变量age
变量初始化
数据类型 变量名 = 初始值; // 声明并初始化变量
例如:
int age = 25; // 声明并初始化整型变量
double salary = 5000.50; // 声明并初始化双精度浮点型变量
char grade = 'A'; // 声明并初始化字符变量
boolean isStudent = true; // 声明并初始化布尔变量
多个变量声明
int x = 10, y = 20, z = 30; // 声明并初始化多个同类型变量
常量声明
常量是值不能改变的变量,使用final
关键字声明。
final double PI = 3.14159; // 声明常量
final int MAX_USERS = 100; // 声明常量
常量命名通常全部大写,单词间用下划线分隔。
引用数据类型
除了基本数据类型,Java中的其他所有类型都是引用类型,它们存储对象的引用(内存地址)。
类(Class)
String name = "John"; // String是Java提供的类
Person person = new Person(); // 自定义类
接口(Interface)
List<String> names = new ArrayList<>(); // List是接口,ArrayList是实现类
数组(Array)
int[] numbers = {1, 2, 3, 4, 5}; // 整型数组
String[] fruits = {"Apple", "Banana", "Orange"}; // 字符串数组
字符串(String)
字符串是Java中特殊的引用类型,使用双引号:
String greeting = "Hello, Java!"; // 创建字符串
String empty = ""; // 空字符串
字符串操作示例:
String firstName = "John";
String lastName = "Doe";
String fullName = firstName + " " + lastName; // 字符串连接
int length = fullName.length(); // 获取字符串长度
boolean containsJohn = fullName.contains("John"); // 检查是否包含子串
类型转换
自动类型转换(隐式转换)
当小类型转换为大类型时,Java会自动进行转换:
byte -> short -> int -> long -> float -> double
char -> int
例如:
int x = 10;
long y = x; // 自动类型转换,int转为long
long z = 100; // 100是int类型,自动转为long
double d = z; // 自动类型转换,long转为double
强制类型转换(显式转换)
当大类型转换为小类型时,需要进行强制类型转换,可能会丢失精度:
小类型变量 = (小类型)大类型变量;
例如:
double z = 3.14;
int w = (int)z; // 强制类型转换,w = 3,小数部分被截断
long bigNum = 1234567890L;
int smallNum = (int)bigNum; // 如果bigNum超出int范围,会丢失数据
字符串与其他类型的转换
其他类型转字符串:
int num = 100;
String str1 = Integer.toString(num); // 使用包装类的toString方法
String str2 = String.valueOf(num); // 使用String的valueOf方法
String str3 = num + ""; // 连接空字符串(简便方法)
字符串转其他类型:
String numStr = "100";
int num1 = Integer.parseInt(numStr); // 字符串转int
double num2 = Double.parseDouble("3.14"); // 字符串转double
boolean bool = Boolean.parseBoolean("true"); // 字符串转boolean
基本输入输出
标准输出
Java提供了多种向控制台输出信息的方法:
System.out.println()
输出内容并换行:
System.out.println("Hello, Java!"); // 输出字符串并换行
System.out.println(42); // 输出数字并换行
System.out.println("Age: " + 25); // 输出拼接内容并换行
System.out.print()
输出内容但不换行:
System.out.print("Hello, "); // 输出不换行
System.out.print("World!"); // 接着上一个输出
// 结果: Hello, World!
System.out.printf()
格式化输出,类似C语言的printf函数:
System.out.printf("圆周率是 %.2f\n", 3.1415926); // 保留两位小数
System.out.printf("姓名: %s, 年龄: %d\n", "张三", 25); // 字符串和整数
常用格式说明符:
%d
:整数%f
:浮点数%s
:字符串%c
:字符%b
:布尔值%n
或\n
:换行
标准输入
Java使用Scanner
类从控制台读取输入:
import java.util.Scanner; // 导入Scanner类
public class InputExample {
public static void main(String[] args) {
// 创建Scanner对象
Scanner scanner = new Scanner(System.in);
// 提示用户输入
System.out.print("请输入您的姓名:");
String name = scanner.nextLine(); // 读取一行文本
System.out.print("请输入您的年龄:");
int age = scanner.nextInt(); // 读取整数
// 注意:nextInt()后如果要读取字符串,需要先调用nextLine()消耗换行符
scanner.nextLine();
System.out.print("请输入您的职业:");
String job = scanner.nextLine(); // 读取一行文本
// 输出读取的信息
System.out.println("\n您的信息:");
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("职业:" + job);
// 关闭Scanner
scanner.close(); // 良好习惯,防止资源泄露
}
}
Scanner常用方法
nextLine()
:读取一行文本(到回车)next()
:读取一个单词(到空格)nextInt()
:读取一个整数nextDouble()
:读取一个双精度浮点数nextBoolean()
:读取一个布尔值hasNext()
:检查是否还有输入
注意事项
- 使用
nextInt()
、nextDouble()
等方法后,如果要使用nextLine()
读取字符串,需要先额外调用一次nextLine()
来消耗换行符 - 输入不符合预期类型时会抛出异常,初学者可以先不处理异常
- 使用完毕后应调用
close()
方法关闭Scanner
文件输入输出(简介)
Java也支持文件输入输出,这里简单介绍:
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileIOExample {
public static void main(String[] args) {
// 写入文件
try {
PrintWriter writer = new PrintWriter("output.txt");
writer.println("Hello, File IO!");
writer.println("这是第二行");
writer.close();
System.out.println("文件写入成功");
} catch (FileNotFoundException e) {
System.out.println("写入文件时出错");
}
// 读取文件
try {
File file = new File("output.txt");
Scanner fileScanner = new Scanner(file);
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
System.out.println("读取: " + line);
}
fileScanner.close();
} catch (FileNotFoundException e) {
System.out.println("找不到文件");
}
}
}
文件IO是更高级的主题,将在后续章节详细介绍。
运算符与表达式
算术运算符
用于执行基本的数学运算:
-
加法:
+
int sum = 5 + 3; // sum = 8
-
减法:
-
int difference = 10 - 4; // difference = 6
-
乘法:
*
int product = 4 * 3; // product = 12
-
除法:
/
int quotient1 = 10 / 3; // quotient1 = 3 (整数除法,结果取整) double quotient2 = 10.0 / 3; // quotient2 = 3.3333... (浮点数除法)
-
取模(求余):
%
int remainder = 10 % 3; // remainder = 1 (10除以3的余数)
-
自增:
++
int a = 5; a++; // 等价于 a