Java 基础知识点详解:从语法到实践(附代码案例)

 一、Java 语言特性与环境搭建

在学习语法前,先明确 Java 的核心特性和环境搭建步骤 —— 这是编写 Java 代码的前提。

1. Java 核心特性

  • 跨平台性:依托 “一次编写,到处运行(Write Once, Run Anywhere)” 的理念,通过 JVM(Java 虚拟机)实现,代码编译后生成的字节码可在任何安装 JVM 的系统上运行。
  • 面向对象:Java 是纯面向对象语言(除基本数据类型外),一切皆对象,支持封装、继承、多态三大特性。
  • 安全性:无指针操作、自动垃圾回收(GC)、异常处理机制,减少内存泄漏和程序崩溃风险。
  • 健壮性:强制类型检查、编译期错误提示,降低运行时异常概率。

2. 开发环境搭建

Java 开发需要两个核心工具:JDK(Java Development Kit,开发工具包)和 IDE(集成开发环境,如 IDEA、Eclipse)。

(1)JDK 安装与配置
  1. 下载对应系统的 JDK(推荐 JDK 11 或 17,LTS 长期支持版本),从Oracle 官网或国内镜像(如华为、阿里云)获取;
  1. 安装 JDK,记住安装路径(如C:\Program Files\Java\jdk-17);
  1. 配置环境变量:
    • 新增JAVA_HOME:值为 JDK 安装路径;
    • 编辑Path:添加%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin(JDK 9 + 无需单独配置 JRE);
  1. 验证:打开命令提示符,输入java -version和javac -version,若显示版本信息则配置成功。
(2)IDE 选择与使用

推荐使用IntelliJ IDEA Community Edition(免费、功能强大),新建 Java 项目步骤:

  1. 打开 IDEA,选择 “New Project”;
  1. 选择 “Java”,配置 JDK 路径,点击 “Next”;
  1. 勾选 “Create project from template”(可选 “Command Line App” 快速创建带主类的项目);
  1. 输入项目名称(如JavaBasicDemo)和路径,点击 “Finish”。

二、Java 基础语法:从 HelloWorld 开始

任何编程语言的入门都从 “HelloWorld” 开始,通过这个简单案例,我们可以理解 Java 的基本代码结构。

1. HelloWorld 代码示例

// 声明一个公共类,类名必须与文件名一致(如HelloWorld.java)

public class HelloWorld {

// 主方法:程序的入口,JVM会从这里开始执行

public static void main(String[] args) {

// 输出语句:在控制台打印字符串

System.out.println("Hello, Java!");

}

}

2. 代码结构解析

  • 类声明:public class HelloWorld,public表示类是公共的(可被其他类访问),class是定义类的关键字,HelloWorld是类名(必须与.java文件名完全一致,大小写敏感)。
  • 主方法:public static void main(String[] args),这是 Java 程序的 “入口点”,JVM 启动后会优先执行该方法:
    • public:方法可被外部访问;
    • static:方法属于类,无需创建对象即可调用;
    • void:方法无返回值;
    • main:方法名(固定,JVM 只识别此名称的入口方法);
    • String[] args:方法参数,用于接收命令行传入的参数(如java HelloWorld 123,args[0]就是"123")。
  • 输出语句:System.out.println("Hello, Java!"),System是 Java 内置类,out是System的静态成员变量(表示输出流),println()是out的方法(打印字符串并换行,若用print()则不换行)。

3. 代码编译与运行

Java 是编译型语言,需先将.java源文件编译为.class字节码文件,再运行:

  1. 编译:在命令行进入代码所在目录,输入javac HelloWorld.java,无报错则生成HelloWorld.class;
  1. 运行:输入java HelloWorld,控制台输出Hello, Java!。

三、基本数据类型与变量

Java 中的数据类型分为 “基本数据类型” 和 “引用数据类型”,基本数据类型是 Java 的 “最小数据单元”,直接存储值。

1. 基本数据类型(8 种)

Java 的 8 种基本数据类型分为 4 类,各有明确的取值范围和默认值,避免内存浪费:

类型分类

数据类型

占用字节

取值范围

默认值

说明

整数型

byte

1

-128 ~ 127

0

最小整数类型

short

2

-32768 ~ 32767

0

短整数

int

4

-2³¹ ~ 2³¹-1

0

常用整数类型(默认)

long

8

-2⁶³ ~ 2⁶³-1

0L

长整数,赋值需加L(如 100L)

浮点型

float

4

±3.4e38(精度 6-7 位)

0.0f

单精度浮点数,赋值需加f

double

8

±1.8e308(精度 15-16 位)

0.0d

双精度浮点数(默认)

字符型

char

2

'\u0000'(0)~ '\uffff'(65535)

'\u0000'

存储单个字符(Unicode 编码)

布尔型

boolean

1

true / false

false

表示逻辑判断

2. 变量定义与使用

变量是 “存储数据的容器”,定义时需指定数据类型,语法:数据类型 变量名 = 初始值;(初始值可选,成员变量有默认值,局部变量无默认值需手动赋值)。

代码示例:基本数据类型变量
public class DataTypeDemo {

// 成员变量:定义在类中,有默认值

static int memberInt; // 默认值0

static boolean memberBool; // 默认值false

public static void main(String[] args) {

// 1. 整数型变量

byte age = 25; // 注意:值不能超过byte范围(-128~127)

int score = 98; // 常用类型

long bigNum = 10000000000L; // 长整数需加L

// 2. 浮点型变量

float pi1 = 3.14f; // 单精度需加f

double pi2 = 3.1415926535; // 双精度(默认)

// 3. 字符型变量

char ch1 = 'A'; // 单个字符,用单引号

char ch2 = '\u0041'; // Unicode编码(对应'A')

char ch3 = '中'; // 支持中文(Unicode包含中文编码)

// 4. 布尔型变量

boolean isPass = true;

// 局部变量:定义在方法中,无默认值,必须赋值后使用

String name; // 未赋值,直接使用会报错

name = "张三"; // 赋值后可使用

// 输出变量值

System.out.println("年龄:" + age); // 拼接字符串输出

System.out.println("圆周率(double):" + pi2);

System.out.println("是否及格:" + isPass);

System.out.println("成员变量默认值:" + memberInt + "," + memberBool);

}

}
关键注意点:
  • 变量命名规范:遵循 “小驼峰命名法”,如userName、studentAge,首字母小写,后续单词首字母大写;
  • 类型转换
    • 自动转换:小范围类型→大范围类型(如byte→int),无需手动处理;
    • 强制转换:大范围类型→小范围类型(如int→byte),需加(目标类型),可能丢失精度:
int num1 = 129;

byte num2 = (byte) num1; // 强制转换,129超出byte范围,结果为-127(精度丢失)
  • 避免浮点型精度问题:如0.1 + 0.2结果不是0.3而是0.30000000000000004,若需精确计算(如金额),需使用BigDecimal类。

四、运算符:实现数据计算与逻辑判断

运算符是用于操作变量和值的符号,Java 支持多种运算符,按功能可分为算术运算符、赋值运算符、比较运算符、逻辑运算符等。

1. 算术运算符(+、-、*、/、%、++、--)

用于数值计算,其中++(自增)和--(自减)需注意 “前置” 和 “后置” 的区别。

代码示例:
public class ArithmeticDemo {

public static void main(String[] args) {

int a = 10;

int b = 3;

// 基本算术运算

System.out.println("a + b = " + (a + b)); // 13

System.out.println("a - b = " + (a - b)); // 7

System.out.println("a * b = " + (a * b)); // 30

System.out.println("a / b = " + (a / b)); // 3(整数除法,舍去小数)

System.out.println("a % b = " + (a % b)); // 1(取余,余数符号与被除数一致)

// 自增自减

int c = a++; // 后置++:先赋值,再自增(c=10,a=11)

int d = ++a; // 前置++:先自增,再赋值(a=12,d=12)

System.out.println("c = " + c + ", d = " + d + ", a = " + a); // 10,12,12

}

}

2. 赋值运算符(=、+=、-=、*=、/=、%=)

用于给变量赋值,复合赋值运算符(如+=)会自动处理类型转换。

代码示例:
int x = 5;

x += 3; // 等价于x = x + 3 → x=8

x *= 2; // 等价于x = x * 2 → x=16

byte y = 10;

y += 5; // 自动转换,等价于y = (byte)(y + 5),无需手动强制转换

3. 比较运算符(==、!=、>、<、>=、<=)

用于比较两个值的关系,返回boolean类型(true或false),常用于条件判断。

代码示例:
int num1 = 5;

int num2 = 10;

System.out.println(num1 == num2); // false(判断是否相等,注意:基本类型比较值,引用类型比较地址)

System.out.println(num1 != num2); // true(判断是否不相等)

System.out.println(num1 > num2); // false

System.out.println(num1 <= num2); // true

4. 逻辑运算符(&&、||、!)

用于逻辑判断,操作数必须是boolean类型,返回boolean类型。

运算符

名称

逻辑规则

特点

&&

逻辑与

两边都为 true,结果才为 true

短路:左边为 false 时,右边不执行

逻辑或

!

逻辑非

取反(true→false,false→true)

单目运算符

代码示例:
boolean flag1 = true;

boolean flag2 = false;

// 逻辑与

System.out.println(flag1 && flag2); // false

// 逻辑或

System.out.println(flag1 || flag2); // true

// 逻辑非

System.out.println(!flag1); // false

// 短路特性示例

int m = 10;

boolean result = (m > 20) && (++m > 10); // 左边为false,右边++m不执行

System.out.println("m = " + m); // 10(m未自增)

五、流程控制:控制代码执行顺序

流程控制用于改变代码的 “自上而下” 默认执行顺序,分为分支结构(if-else、switch)和循环结构(for、while、do-while)。

1. 分支结构:根据条件执行不同代码

(1)if-else:适用于范围判断

语法:

if (条件1) {

// 条件1为true时执行

} else if (条件2) {

// 条件1为false,条件2为true时执行

} else {

// 所有条件都为false时执行

}
代码示例:成绩等级判断
public class IfElseDemo {

public static void main(String[] args) {

int score = 85;

if (score >= 90) {

System.out.println("成绩等级:优秀");

} else if (score >= 80) {

System.out.println("成绩等级:良好");

} else if (score >= 60) {

System.out.println("成绩等级:及格");

} else {

System.out.println("成绩等级:不及格");

}

}

}

// 输出:成绩等级:良好
(2)switch:适用于固定值匹配

Java 7 + 支持int、byte、short、char、String类型的 case 值,语法:

switch (表达式) {

case 值1:

// 表达式 == 值1时执行

break; // 跳出switch,避免穿透

case 值2:

// 表达式 == 值2时执行

break;

default:

// 所有case不匹配时执行

}
代码示例:星期判断
public class SwitchDemo {

public static void main(String[] args) {

String week = "周二";

switch (week) {

case "周一":

System.out.println("新的一周开始,加油!");

break;

case "周二":

case "周三":

case "周四":

System.out.println("工作日,坚持!");

break;

case "周五":

System.out.println("周五啦,期待周末!");

break;

case "周六":

case "周日":

System.out.println("周末愉快!");

break;

default:

System.out.println("输入的星期有误!");

}

}

}

// 输出:工作日,坚持!

注意:break不可省略(除非需要 “case 穿透”),否则会继续执行后续 case 代码。

2. 循环结构:重复执行代码块

(1)for 循环:适用于已知循环次数的场景

语法:

for (初始化表达式; 循环条件; 更新表达式) {

// 循环体(条件为true时执行)

}
  • 初始化表达式:循环前执行一次(如int i = 0);
  • 循环条件:每次循环前判断,为true则执行循环体;
  • 更新表达式:每次循环体执行后执行(如i++)。
代码示例:打印 1~10 的和
public class ForDemo {

public static void main(String[] args) {

int sum = 0;

// 循环1~10

for (int i = 1; i <= 10; i++) {

sum += i; // 累加:sum = sum + i

}

System.out.println("1~10的和:" + sum); // 输出:55

}

}

 

(2)while 循环:适用于未知循环次数,仅需循环条件的场景

语法:

while (循环条件) {

// 循环体(条件为true时执行)

// 注意:需在循环体内更新条件变量,避免死循环

}

核心逻辑:先判断循环条件,若为true则执行循环体;若初始条件为false,循环体一次都不会执行。

代码示例:计算 1~100 中偶数的和
public class WhileDemo {

public static void main(String[] args) {

int num = 1; // 初始值

int evenSum = 0; // 存储偶数和

// 循环条件:num <= 100

while (num <= 100) {

if (num % 2 == 0) { // 判断是否为偶数

evenSum += num;

}

num++; // 更新条件变量(关键!否则会无限循环)

}

System.out.println("1~100中偶数的和:" + evenSum); // 输出:2550

}

}

注意:若忘记在循环体内更新num(如删除num++),num会一直等于 1,num <= 100始终为true,导致死循环(程序卡住,需强制关闭)。

(3)do-while 循环:适用于 “至少执行一次循环体” 的场景

语法:

do {

// 循环体(先执行一次)

// 需更新条件变量

} while (循环条件); // 分号不可省略

核心区别:与while相反,do-while先执行一次循环体,再判断循环条件;即使初始条件为false,循环体也会执行一次。

代码示例:用户输入验证(至少提示一次输入)
import java.util.Scanner; // 导入扫描器类,用于读取用户输入

public class DoWhileDemo {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in); // 创建扫描器对象

int correctPwd = 123456; // 正确密码

int inputPwd;

// 至少执行一次输入操作

do {

System.out.print("请输入密码:");

inputPwd = scanner.nextInt(); // 读取用户输入的整数

} while (inputPwd != correctPwd); // 密码错误则继续循环

System.out.println("密码正确,欢迎进入!");

scanner.close(); // 关闭扫描器,释放资源

}

}

运行逻辑:无论用户第一次输入是否正确,都会先执行 “输入密码” 的提示;只有当输入密码与correctPwd一致时,才退出循环。

(4)循环控制:break 与 continue

在循环中,可通过break和continue精细控制循环执行流程:

关键字

作用

适用场景

break

立即跳出当前循环(或switch),执行循环后的代码

满足特定条件时终止循环(如找到目标值后退出)

continue

跳过当前循环的剩余代码,直接进入下一次循环判断

跳过不符合条件的循环体(如跳过奇数,只处理偶数)

代码示例 1:break 的使用(找到第一个能被 7 整除的数后退出)
public class BreakDemo {

public static void main(String[] args) {

// 寻找1~50中第一个能被7整除的数

for (int i = 1; i <= 50; i++) {

if (i % 7 == 0) {

System.out.println("找到第一个能被7整除的数:" + i); // 输出:7

break; // 跳出循环,后续i=8~50不再判断

}

}

System.out.println("循环结束");

}

}
代码示例 2:continue 的使用(只打印 1~10 中的奇数)
public class ContinueDemo {

public static void main(String[] args) {

for (int i = 1; i <= 10; i++) {

if (i % 2 == 0) {

continue; // 跳过偶数,直接进入下一次循环(i++)

}

System.out.println("奇数:" + i); // 只打印1、3、5、7、9

}

}

}

六、数组:存储多个相同类型的数据

数组是 Java 中最简单的 “引用数据类型”,用于存储固定长度相同类型数据(如多个学生的成绩、多个商品的价格)。

1. 数组的定义与初始化

数组有两种初始化方式:静态初始化(已知元素值,长度由系统自动计算)和动态初始化(已知长度,元素先为默认值,后续赋值)。

(1)静态初始化

语法:数据类型[] 数组名 = {元素1, 元素2, ..., 元素n};

或 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ..., 元素n};(完整写法)

代码示例:
// 静态初始化:存储3个学生的成绩

int[] scores = {98, 85, 76}; // 长度为3,索引0~2

String[] names = new String[]{"张三", "李四", "王五"}; // 完整写法
(2)动态初始化

语法:数据类型[] 数组名 = new 数据类型[数组长度];

元素默认值:整数型为0,浮点型为0.0,字符型为'\u0000',布尔型为false,引用类型为null。

代码示例:
// 动态初始化:创建长度为5的int数组(存储5个年龄)

int[] ages = new int[5];

// 手动赋值(数组索引从0开始)

ages[0] = 20;

ages[1] = 21;

ages[2] = 19;

ages[3] = 22;

ages[4] = 20;

2. 数组的核心操作

数组的核心是 “索引”(从0开始,最大索引为数组长度-1),通过索引访问、修改元素;可通过数组名.length获取数组长度。

代码示例:数组遍历与常用操作
public class ArrayDemo {

public static void main(String[] args) {

int[] scores = {98, 85, 76, 92, 88}; // 静态初始化

// 1. 获取数组长度

System.out.println("数组长度:" + scores.length); // 输出:5

// 2. 访问指定索引的元素(索引0对应第一个元素)

System.out.println("第一个成绩:" + scores[0]); // 输出:98

System.out.println("最后一个成绩:" + scores[scores.length - 1]); // 输出:88(避免硬编码)

// 3. 修改元素值

scores[2] = 80; // 将索引2的元素(原76)改为80

System.out.println("修改后索引2的成绩:" + scores[2]); // 输出:80

// 4. 遍历数组(方式1:普通for循环,可获取索引)

System.out.println("\n普通for循环遍历:");

for (int i = 0; i < scores.length; i++) {

System.out.println("索引" + i + ":" + scores[i]);

}

// 5. 遍历数组(方式2:增强for循环(for-each),简化写法,无需索引)

System.out.println("\n增强for循环遍历:");

for (int score : scores) { // 每次循环将数组元素赋值给score

System.out.println("成绩:" + score);

}

// 6. 计算数组元素的平均值

int sum = 0;

for (int score : scores) {

sum += score;

}

double avg = (double) sum / scores.length; // 强制转换为double,避免整数除法

System.out.println("\n成绩平均值:" + avg); // 输出:87.0

}

}

3. 数组常见问题:索引越界异常

数组的索引范围是0 ~ 数组长度-1,若访问超出此范围的索引,会抛出ArrayIndexOutOfBoundsException(数组索引越界异常)。

错误示例:
int[] arr = {1, 2, 3};

System.out.println(arr[3]); // 错误!数组长度为3,最大索引为2,访问索引3越界

避免方法:遍历数组时,用i < 数组名.length作为循环条件(而非固定数值,如i < 3)。

七、方法:代码复用与模块化

方法是 “封装一段特定功能的代码块”,可重复调用,减少代码冗余,让程序结构更清晰(如 “计算两数之和”“判断是否为偶数” 等功能都可封装为方法)。

1. 方法的定义语法

修饰符 返回值类型 方法名(参数列表) {

// 方法体(实现功能的代码)

return 返回值; // 若返回值类型为void,无需return(或写return;表示结束方法)

}
  • 修饰符:常用public static(公共静态方法,可通过 “类名。方法名” 调用,无需创建对象);
  • 返回值类型:方法执行后返回的数据类型(如int、String),若无需返回值,用void;
  • 方法名:遵循 “小驼峰命名法”(如calculateSum);
  • 参数列表:方法接收的输入数据(格式:数据类型 参数名1, 数据类型 参数名2),无参数则留空;
  • return:将结果返回给调用者,若返回值类型为void,return可省略(或仅用于提前结束方法)。

2. 方法的分类与调用

根据参数和返回值,方法可分为 4 类,调用方式略有不同:

方法类型

特点

调用示例

无参无返回值

无输入,无输出

方法名();

无参有返回值

无输入,有输出

返回值类型 变量名 = 方法名();

有参无返回值

有输入,无输出

方法名(参数1, 参数2);

有参有返回值

有输入,有输出

返回值类型 变量名 = 方法名(参数1, 参数2);

代码示例:4 类方法的实现与调用
public class MethodDemo {

// 1. 无参无返回值方法:打印欢迎信息

public static void printWelcome() {

System.out.println("==================");

System.out.println(" 欢迎使用Java方法演示 ");

System.out.println("==================");

}

// 2. 无参有返回值方法:生成1~100的随机数

public static int getRandomNum() {

return (int) (Math.random() * 100) + 1; // Math.random()生成0.0~1.0的随机数

}

// 3. 有参无返回值方法:打印数组所有元素

public static void printArray(int[] arr) {

for (int num : arr) {

System.out.print(num + " ");

}

System.out.println(); // 换行

}

// 4. 有参有返回值方法:计算数组元素的最大值

public static int getMaxValue(int[] arr) {

if (arr == null || arr.length == 0) {

throw new IllegalArgumentException("数组不能为null或空数组"); // 抛出异常,提示错误

}

int max = arr[0]; // 假设第一个元素为最大值

for (int i = 1; i < arr.length; i++) {

if (arr[i] > max) {

max = arr[i]; // 更新最大值

}

}

return max; // 返回最大值

}

public static void main(String[] args) {

// 调用方法

printWelcome(); // 1. 调用无参无返回值方法

int random = getRandomNum(); // 2. 调用无参有返回值方法

System.out.println("\n生成的随机数:" + random);

int[] scores = {98, 85, 76, 92, 88};

System.out.print("\n数组元素:");

printArray(scores); // 3. 调用有参无返回值方法

int maxScore = getMaxValue(scores); // 4. 调用有参有返回值方法

System.out.println("数组最大值:" + maxScore);

}

}

运行结果

==================

欢迎使用Java方法演示

==================

生成的随机数:45(每次运行可能不同)

数组元素:98 85 76 92 88

数组最大值:98

3. 方法的核心特性:重载(Overload)

方法重载是指 “在同一个类中,方法名相同,但参数列表不同” 的现象,用于实现 “同一功能的不同输入场景”(如 “计算两数之和” 可支持int、double等不同类型)。

重载的判断条件

  1. 方法名必须相同;
  1. 参数列表必须不同(参数个数不同、或参数类型不同、或参数顺序不同);
  1. 与返回值类型、修饰符无关。
代码示例:方法重载(计算两数之和)
public class MethodOverloadDemo {

// 1. 计算两个int类型的和

public static int add(int a, int b) {

System.out.println("调用int类型的add方法");

return a + b;

}

// 2. 计算两个double类型的和(参数类型不同,构成重载)

public static double add(double a, double b) {

System.out.println("调用double类型的add方法");

return a + b;

}

// 3. 计算三个int类型的和(参数个数不同,构成重载)

public static int add(int a, int b, int c) {

System.out.println("调用三个int的add方法");

return a + b + c;

}

public static void main(String[] args) {

System.out.println("两int之和:" + add(10, 20)); // 调用第1个add方法,输出30

System.out.println("两double之和:" + add(1.5, 2.5)); // 调用第2个add方法,输出4.0

System.out.println("三int之和:" + add(5, 10, 15)); // 调用第3个add方法,输出30

}

}

核心逻辑:调用重载方法时,JVM 会根据 “实际传入的参数类型和个数” 自动匹配对应的方法。

八、总结与实践建议

Java 基础语法是后续学习面向对象(类、对象、继承、多态)、集合框架、IO 流等进阶知识的基石,建议通过 “理解 + 实践” 巩固:

  1. 重点掌握
    • 基本数据类型的使用(尤其是int、double、String);
    • 流程控制(if-else、for 循环、while 循环);
    • 数组的遍历与操作;
    • 方法的定义与调用(包括重载)。
  1. 实践建议
    • 编写小案例:如 “学生成绩管理”(计算平均分、找最高分)、“猜数字游戏”(用循环和条件判断实现);
    • 解决常见问题:主动尝试 “索引越界”“死循环” 等错误,理解异常原因;
    • 规范代码风格:遵循命名规范(小驼峰、类名首字母大写),合理缩进,添加注释。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遗憾是什么.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值