【尚硅谷Java基础篇知识笔记】

第1章 Java语言概述


一、软件开发介绍

1.1 软件开发基础

  • 软件分类
    • 系统软件(如操作系统)
    • 应用软件(如微信、支付宝)
  • 人机交互方式
    • GUI(图形界面):直观易用(如Windows)
    • CLI(命令行):需记忆命令(如Linux终端)

1.2 常用DOS命令

命令功能示例
dir列出当前目录内容dir
md创建目录md test
cd切换目录cd D:\code
del删除文件del test.txt
echo创建文件并写入内容echo hi > a.txt

二、计算机编程语言

2.1 编程语言发展

代际类型特点示例
第一代机器语言二进制指令01010101
第二代汇编语言使用助记符MOV AX, 5
第三代高级语言面向过程/对象,跨平台C、Java、Python

2.2 Java语言优势

  • 市场需求大:长期占据TIOBE排行榜前三
  • 跨平台性:一次编写,到处运行(JVM实现)
  • 生态完善:企业级应用、Android开发、大数据领域广泛应用

三、Java语言核心特性

3.1 Java简史

  • 1991年:Green项目,Oak语言诞生
  • 1995年:更名为Java,正式发布
  • 2009年:Oracle收购Sun
  • 2014年:JDK 8发布(Lambda表达式、Stream API)

3.2 技术体系

平台应用场景
Java SE桌面应用开发
Java EE企业级Web应用(如Spring)
Java ME嵌入式设备开发

3.3 主要特性

  • 面向对象:封装、继承、多态
  • 健壮性:自动内存管理(GC)、强类型检查
  • 跨平台性:JVM实现“一次编译,到处运行”

四、Java运行机制

4.1 核心机制

  • JVM(Java虚拟机):执行字节码,屏蔽底层差异
  • 垃圾回收(GC):自动管理内存,开发者无需手动释放

4.2 运行流程

.java源文件
javac编译
.class字节码
JVM解释执行

五、环境搭建

5.1 JDK与JRE

组件说明包含内容
JDKJava开发工具包JRE + 开发工具(javac等)
JREJava运行环境JVM + 核心类库

5.2 环境变量配置

  1. 新增系统变量 JAVA_HOME:指向JDK安装路径(如 D:\jdk1.8
  2. 编辑 Path:添加 %JAVA_HOME%\bin

验证命令

java -version   # 查看Java版本
javac           # 检查编译环境

六、HelloWorld

6.1 开发步骤

  1. 编写代码HelloWorld.java):
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }
    
  2. 编译javac HelloWorld.java → 生成 HelloWorld.class
  3. 运行java HelloWorld

6.2 注意事项

  • 类名与文件名必须一致(区分大小写)
  • main方法是程序入口,格式固定

七、常见问题

错误现象原因解决方案
'javac' 不是内部命令Path未配置或配置错误检查环境变量
找不到主类类名与文件名不一致统一命名
需要 ';'语句缺少分号检查代码语法
公共类应在同名文件中声明public类名与文件名不匹配修改类名或文件名

八、注释规范

8.1 注释类型

类型语法用途
单行注释// 注释内容解释单行代码
多行注释/* 注释内容 */解释代码块
文档注释/** 注释内容 */生成API文档(javadoc)

8.2 文档注释示例

/**
 * 计算两数之和
 * @param a 第一个加数
 * @param b 第二个加数
 * @return 两数之和
 */
public int add(int a, int b) {
    return a + b;
}

九、API文档

9.1 使用场景

9.2 核心内容

  • 包结构:按功能分类(如 java.utiljava.io
  • 类与方法说明:包含参数、返回值、异常信息

十、编程风格

10.1 代码规范

  • 缩进:使用Tab键(4个空格)
  • 运算符空格int sum = a + b;
  • 块风格:行尾风格(推荐)
    public class Test {
        public static void main(String[] args) {
            // 代码
        }
    }
    

十一、开发工具

11.1 主流IDE对比

工具特点适用场景
Eclipse免费、插件丰富企业级开发
IntelliJ IDEA智能提示强大、集成度高全栈开发
VS Code轻量级、支持多语言小型项目/脚本

作业练习

  1. 编写HelloWorld程序,添加必要注释
  2. 打印个人信息(每项占一行):
    System.out.println("姓名:张三");
    System.out.println("性别:男");
    
  3. 使用转义符打印如下图形:
    System.out.println("*\t*\tI love Java\t*");
    System.out.println("*\t*\t*\t*");
    

知识回顾

  • Java通过JVM实现跨平台
  • JDK包含开发工具,JRE包含运行环境
  • 环境变量Path配置是全局命令调用的关键
  • 注释是提高代码可读性的重要手段

第2章 Java基本语法(上):变量与运算符


1. 关键字与保留字

关键字(Keyword)

  • 定义:被Java赋予特殊含义的字符串,所有字母小写。
  • 分类
    • 数据类型class, interface, byte, int, boolean, void 等。
    • 流程控制if, else, for, while, break, return 等。
    • 访问权限private, protected, public
    • 异常处理try, catch, finally, throw
    • 其他new, this, static, package, import
  • 完整列表Oracle官方文档

保留字(Reserved Word)

  • 定义:目前未使用但未来可能作为关键字的标识符。
  • 示例goto, const

2. 标识符(Identifier)

定义规则

  • 组成:字母、数字、_$,且数字不能开头。
  • 区分大小写,长度无限制。
  • 不能包含空格,不能是关键字或保留字(但可包含)。

命名规范

类型规则示例
包名全小写,多单词用.分隔com.util
类名/接口名首字母大写(大驼峰)StudentScore
变量名/方法名首字母小写(小驼峰)studentName
常量名全大写,用_分隔MAX_VALUE

注意:建议使用英文命名,避免使用汉字。


3. 变量

变量概念

  • 内存中的存储区域,包含类型、名称和值。
  • 作用域:定义所在的{}内,同一作用域不能重复定义。

变量分类

按数据类型
  • 基本数据类型(8种):
    • 整数:byte(1B), short(2B), int(4B), long(8B)
    • 浮点:float(4B), double(8B)
    • 字符:char(2B)
    • 布尔:boolean(1B)
  • 引用数据类型:类、接口、数组、String。
按声明位置
  • 成员变量:类体内声明(实例变量、类变量)。
  • 局部变量:方法体内声明(需显式初始化)。

数据类型转换

自动类型转换
  • 规则:小容量 → 大容量。
  • 顺序byteshortintlongfloatdouble
  • 示例
    int a = 10;
    double b = a; // 自动转换
    
强制类型转换
  • 语法(目标类型) 值,可能导致精度损失。
  • 示例
    double x = 10.5;
    int y = (int) x; // y = 10
    

进制转换

进制前缀示例
二进制0b/0B0b1010
八进制00123
十六进制0x/0X0x1AF

转换规则

  • 十进制 → 其他进制:除基取余法。
  • 其他进制 → 十进制:按权展开求和。

4. 运算符

算术运算符

运算符描述示例
+加法/字符串连接3 + 5 = 8"a" + "b" = "ab"
-减法5 - 3 = 2
*乘法2 * 3 = 6
/除法(取整)5 / 2 = 2
%取模5 % 2 = 1
++/--自增/自减a++(先取值后运算)

注意byte/short运算时自动提升为int

赋值运算符

  • 扩展赋值运算符+=, -=, *=, /=, %=
  • 示例
    short s = 3;
    s += 2; // 合法,等价于 s = (short)(s + 2)
    

比较运算符

运算符描述示例
==等于3 == 5 → false
!=不等于3 != 5 → true
instanceof类型检查"Hello" instanceof String → true

逻辑运算符

运算符描述示例
&&短路与true && false → false
``
!逻辑非!true → false
^异或true ^ true → false

位运算符

运算符描述示例
<<左移3 << 2 → 12
>>带符号右移-8 >> 1 → -4
>>>无符号右移-8 >>> 1 → 2147483644
&按位与6 & 3 → 2
``按位或

三元运算符

  • 语法条件 ? 表达式1 : 表达式2
  • 示例
    int max = (a > b) ? a : b;
    

运算符优先级

优先级运算符
最高(), [], .
!, ~, ++, --
*, /, %
+, -
<<, >>, >>>
&&, `
最低=, +=, -= 等赋值运算符

练习示例

// 打印数字的个位、十位、百位
int num = 153;
System.out.println("个位数:" + (num % 10));
System.out.println("十位数:" + (num / 10 % 10));
System.out.println("百位数:" + (num / 100));

输出

个位数:3  
十位数:5  
百位数:1  

第2章 Java基本语法(下):程序流程控制


1. 程序流程控制概述

  • 流程控制:控制程序中各语句的执行顺序。
  • 三种基本结构
    • 顺序结构:从上到下逐行执行。
    • 分支结构:根据条件选择性执行代码(if-elseswitch-case)。
    • 循环结构:根据条件重复执行代码(forwhiledo-while)。

2. 顺序结构

  • 特点:程序从上到下逐行执行,没有判断和跳转。
  • 示例
    public class Test {
        int num1 = 12;
        int num2 = num1 + 2; // 合法前向引用
    }
    
  • 错误示例
    public class Test {
        int num2 = num1 + 2; // 错误,num1未定义
        int num1 = 12;
    }
    

3. 分支结构

3.1 if-else结构

  • 三种格式

    1. 单分支
      if (条件表达式) {
          执行代码块;
      }
      
    2. 双分支
      if (条件表达式) {
          执行代码块1;
      } else {
          执行代码块2;
      }
      
    3. 多分支
      if (条件表达式1) {
          执行代码块1;
      } else if (条件表达式2) {
          执行代码块2;
      } else {
          执行代码块n;
      }
      
  • 注意事项

    • 条件表达式必须是布尔类型。
    • else是可选的,且可以嵌套使用。
    • 多个条件为“互斥”关系时,顺序无关;为“包含”关系时,应从小到大判断。
  • 示例

    int age = 75;
    if (age < 0) {
        System.out.println("不可能!");
    } else if (age > 250) {
        System.out.println("是个妖怪!");
    } else {
        System.out.println("人家芳龄 " + age + ",马马虎虎啦!");
    }
    

3.2 switch-case结构

  • 语法

    switch (表达式) {
        case 常量1:
            语句1;
            break;
        case 常量2:
            语句2;
            break;
        default:
            语句;
            break;
    }
    
  • 规则

    • 表达式类型:byteshortcharint、枚举(JDK 5.0)、String(JDK 7.0)。
    • case后的值必须是常量,且不能重复。
    • break用于跳出switch,若无break,会继续执行后续case
    • default是可选的,位置灵活。
  • 示例

    int i = 1;
    switch (i) {
        case 0:
            System.out.println("zero");
            break;
        case 1:
            System.out.println("one");
            break;
        default:
            System.out.println("default");
            break;
    }
    

4. 循环结构

4.1 for循环

  • 语法

    for (初始化部分; 循环条件部分; 迭代部分) {
        循环体部分;
    }
    
  • 执行过程:初始化 → 条件判断 → 循环体 → 迭代 → 条件判断 → …

  • 示例

    for (int i = 1; i <= 100; i++) {
        System.out.println(i);
    }
    

4.2 while循环

  • 语法

    初始化部分;
    while (循环条件部分) {
        循环体部分;
        迭代部分;
    }
    
  • 示例

    int i = 1;
    while (i <= 100) {
        System.out.println(i);
        i++;
    }
    

4.3 do-while循环

  • 语法

    初始化部分;
    do {
        循环体部分;
        迭代部分;
    } while (循环条件部分);
    
  • 特点:至少执行一次循环体。

  • 示例

    int i = 1;
    do {
        System.out.println(i);
        i++;
    } while (i <= 100);
    

5. 嵌套循环

  • 定义:一个循环放在另一个循环体内。
  • 特点:外层循环执行一次,内层循环执行多次。
  • 示例
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            System.out.print(j + "*" + i + "=" + (i * j) + "\t");
        }
        System.out.println();
    }
    

6. 特殊关键字

6.1 break

  • 作用:终止当前循环或switch语句。
  • 示例
    for (int i = 0; i < 10; i++) {
        if (i == 3) break;
        System.out.println(i);
    }
    

6.2 continue

  • 作用:跳过本次循环,继续下一次循环。
  • 示例
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) continue;
        System.out.println(i);
    }
    

6.3 return

  • 作用:结束当前方法,返回结果。
  • 示例
    public int add(int a, int b) {
        return a + b;
    }
    

综合练习

1. 家庭收支记账软件

  • 功能:记录家庭的收入和支出,支持查看明细、登记收入、登记支出、退出程序。
  • 示例
    public class FamilyAccount {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int balance = 10000; // 初始余额
            while (true) {
                System.out.println("1. 收支明细");
                System.out.println("2. 登记收入");
                System.out.println("3. 登记支出");
                System.out.println("4. 退出");
                int choice = scanner.nextInt();
                switch (choice) {
                    case 1:
                        System.out.println("当前余额:" + balance);
                        break;
                    case 2:
                        System.out.println("请输入收入金额:");
                        int income = scanner.nextInt();
                        balance += income;
                        break;
                    case 3:
                        System.out.println("请输入支出金额:");
                        int expense = scanner.nextInt();
                        balance -= expense;
                        break;
                    case 4:
                        System.out.println("退出程序");
                        return;
                }
            }
        }
    }
    

第三章 数组

1. 数组的概述

  • 定义: 数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号(索引)管理数据。
  • 数组的基本概念
    • 数组名
    • 下标(索引)
    • 元素
    • 数组的长度

数组的特点

  • 引用数据类型: 数组本身是引用数据类型,元素可以是基本数据类型或引用数据类型。
  • 内存分配: 创建数组时会在内存中开辟一块连续的空间,数组名指向该空间的首地址。
  • 长度不可变: 数组一旦创建,其长度不可修改。
  • 访问速度快: 通过索引直接访问元素。

数组的分类

分类方式类型
按维度一维数组、二维数组、多维数组
按数据类型基本数据类型数组、引用数据类型数组(对象数组)

2. 一维数组的使用

2.1 声明

// 两种声明方式
int a[];
int[] b;
String[] c;  // 引用类型变量数组

⚠️ 注意: 声明数组时不能指定长度,例如 int a[5]; 是非法的。

2.2 初始化

(1)动态初始化
int[] arr = new int[3];  // 长度为3
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
(2)静态初始化
int[] arr = {3, 9, 8};  // 直接初始化
String[] names = {"李四光", "茅以升", "华罗庚"};

2.3 数组的引用

  • 数组元素的访问: 数组名[索引]
  • 索引范围: 0 ~ n-1
  • 数组长度: 数组名.length
int[] arr = new int[5];
System.out.println(arr.length); // 输出5

2.4 数组的默认初始化值

数据类型默认值
byte, short, int, long0
float, double0.0
char‘\u0000’ (空字符)
booleanfalse
引用类型null
int[] a = new int[5];
System.out.println(a[3]); // 默认值0

2.5 内存解析

  • 栈(Stack): 局部变量存储
  • 堆(Heap): 数组存储
  • 方法区(Method Area): 常量池、类信息存储

示例:

int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = "刘德华";

3. 多维数组

3.1 二维数组的声明

int[][] arr;  // 声明二维数组
int arr[][];  // 另一种方式

3.2 初始化

(1)动态初始化
int[][] arr = new int[3][2]; // 3行2列
arr[0][1] = 78;
(2)静态初始化
int[][] arr = {{3, 8, 2}, {2, 7}, {9, 0, 1, 6}};

⚠️ 注意: int[][] arr = new int[][3]; 是非法的。

3.3 二维数组的内存解析

int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[4];
  • 堆区存储: arr 存储的是多个一维数组的引用,而非一个连续的二维矩阵。

4. 数组中的常见算法

4.1 赋值

示例:杨辉三角

int[][] yanghui = new int[10][];
for(int i = 0; i < yanghui.length; i++) {
    yanghui[i] = new int[i + 1];
    yanghui[i][0] = yanghui[i][i] = 1;
    for(int j = 1; j < i; j++) {
        yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
    }
}

4.2 查找

  • 线性查找
for(int i = 0; i < arr.length; i++) {
    if(arr[i] == target) {
        System.out.println("找到索引: " + i);
        break;
    }
}
  • 二分查找(前提:数组必须有序)
int[] arr = {-99, -54, -2, 0, 2, 33, 256, 999};
int target = 256;
int left = 0, right = arr.length - 1;
while(left <= right) {
    int mid = (left + right) / 2;
    if(arr[mid] == target) {
        System.out.println("找到索引: " + mid);
        break;
    } else if(arr[mid] > target) {
        right = mid - 1;
    } else {
        left = mid + 1;
    }
}

4.3 排序

  • 冒泡排序
for(int i = 0; i < arr.length - 1; i++) {
    for(int j = 0; j < arr.length - 1 - i; j++) {
        if(arr[j] > arr[j + 1]) {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
  • 快速排序
public static void quickSort(int[] arr, int left, int right) {
    if(left < right) {
        int pivot = partition(arr, left, right);
        quickSort(arr, left, pivot - 1);
        quickSort(arr, pivot + 1, right);
    }
}

private static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    while(left < right) {
        while(left < right && arr[right] >= pivot) right--;
        arr[left] = arr[right];
        while(left < right && arr[left] <= pivot) left++;
        arr[right] = arr[left];
    }
    arr[left] = pivot;
    return left;
}

5. Arrays 工具类

  • 排序: Arrays.sort(arr)
  • 查找: Arrays.binarySearch(arr, key)
  • 填充: Arrays.fill(arr, val)
  • 比较: Arrays.equals(arr1, arr2)
  • 转字符串: Arrays.toString(arr)

示例:

int[] numbers = {5, 900, 1, 5, 77, 30, 64, 700};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));

6. 数组常见异常

异常类型触发情况
ArrayIndexOutOfBoundsException访问超出索引范围
NullPointerException数组未初始化就访问元素

示例:

int[] arr = null;
System.out.println(arr[0]); // 报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值