本文部分引用: https://caochenlei.blog.csdn.net/article/details/
1.算术表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。
提升规则: byte类型,short类型和char类型将被提升到int类型,不管是否有其他类型参与运算。
整个表达式的类型自动提升到与表达式中最高等级的操作数相同的类型 等级顺序:
例如:
tips:正是由于上述原因,所以在程序开发中我们很少使用byte或者short类型定义整数。也很少会使用char类型定 义字符,而使用字符串类型,更不会使用char类型做算术运算。
2.短路逻辑运算符
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。
- 逻辑与&,无论左边真假,右边都要执行。
- 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
- 逻辑或|,无论左边真假,右边都要执行。
- 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
3.三元运算符案例:
1、需求:动物园里有两只老虎,已知两只老虎的体重分别为180kg、200kg,请用程序实现判断两只老虎的体重是否相同。
2、需求:一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。
2. 数据输入(应用)
我们可以通过 Scanner 类来获取用户的输入。使用步骤如下:
1、导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。
2、创建Scanner对象。
3、接收数据
示例:
改写三个和尚案例,数据使用键盘录入。
3. 流程控制语句(应用)
if语句案例:奇偶数
需求:任意给出一个整数,请用程序实现判断该整数是奇数还是偶数,并在控制台输出该整数是奇数还是偶数。
分析:
if语句格式3案例:
需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
分析:
1. switch语句练习-春夏秋冬(应用)
- 需求:一年有12个月,分属于春夏秋冬4个季节,键盘录入一个月份,请用程序实现判断该月份属于哪个季节,并输出。
- 运行结果:
- 示例代码:
- 注意:如果switch中得case,没有对应break的话,则会出现case穿透的现象。
2. for循环练习-输出数据(应用)
- 需求:在控制台输出1-5和5-1的数据
- 示例代码:
3. for循环练习-求和(应用)
- 需求:求1-5之间的数据和,并把求和结果在控制台输出
- 示例代码:
- 本题要点:
- 今后遇到的需求中,如果带有求和二字,请立即联想到求和变量
- 求和变量的定义位置,必须在循环外部,如果在循环内部则计算出的数据将是错误的
4. for循环练习-求偶数和(应用)
- 需求:求1-100之间的偶数和,并把求和结果在控制台输出 }
- 示例代码:
5. for循环练习-水仙花(应用)
- 需求:在控制台输出所有的“水仙花数”
- 解释:什么是水仙花数?
- 水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
- 例如
- 水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
- 思路:
- 获取所有的三位数,准备进行筛选,最小的三位数为100,最大的三位数为999,使用for循环获取
- 获取每一个三位数的个位,十位,百位,做if语句判断是否是水仙花数
- 示例代码
6. for循环练习-统计水仙花数个数(应用)
- 需求:统计“水仙花数”一共有多少个,并在控制台输出个数
- 示例代码:
- 本题要点:
- 今后如果需求带有统计xxx,请先想到计数器变量
- 计数器变量定义的位置,必须在循环外部
7. while循环练习-珠穆朗玛峰(应用)
- 需求:世界最高山峰是珠穆朗玛峰(8844.43米=毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
- 示例代码:
4.3 跳转控制语句(掌握)
- 跳转控制语句(break)
- 跳出循环,结束循环
- 跳转控制语句(continue)
- 跳过本次循环,继续下次循环
- 注意: continue只能在循环中进行使用!
9. Random
9.1 Random产生随机数(掌握)
- 概述:
- Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能
- API后续课程详细讲解,现在可以简单理解为Java已经写好的代码
- Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能
- 使用步骤:
- 导入包
import java.util.Random;
- 创建对象
Random r = new Random();
- 产生随机数
int num = r.nextInt(10);
解释: 10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0-19
- 导入包
- 示例代码:
9.2 Random练习-猜数字(应用)
- 需求:
程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?
当猜错的时候根据不同情况给出相应的提示
A. 如果猜的数字比真实数字大,提示你猜的数据大了
B. 如果猜的数字比真实数字小,提示你猜的数据小了
C. 如果猜的数字与真实数字相等,提示恭喜你猜中了
- 示例代码:
1.2数组定义格式【记忆】
1.2.1第一种
1.2.2第二种
1.3数组动态初始化【应用】
1.3.1什么是动态初始化
1.3.2动态初始化格式
1.3.3动态初始化格式详解
- 等号左边:
- int:数组的数据类型
- []:代表这是一个数组
- arr:代表数组的名称
- 等号右边:
- new:为数组开辟内存空间
- int:数组的数据类型
- []:代表这是一个数组
- 5:代表数组的长度
1.4数组元素访问【应用】
1.4.1什么是索引
1.4.2访问数组元素格式
1.4.3示例代码
1.5.2java中的内存分配
- 目前我们只需要记住两个内存,分别是:栈内存和堆内存
1.9.2静态初始化格式
- 完整版格式
- 简化版格式
1.9.3示例代码
1.10数组操作的两个常见小问题【应用】
1.10.1索引越界异常
- 出现原因
数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。
程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
- 解决方案
将错误的索引修改为正确的索引范围即可!
1.10.2空指针异常
- 出现原因
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
- 解决方案
给数组一个真正的堆内存空间引用即可!
1.11数组遍历【应用】
- 数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。
1.12数组最值【应用】
- 最大值获取:从数组的所有元素中找出最大值。
- 实现思路:
- 定义变量,保存数组0索引上的元素
- 遍历数组,获取出数组中的每个元素
- 将遍历到的元素和保存数组0索引上值的变量进行比较
- 如果数组元素的值大于了变量的值,变量记录住新的值
- 数组循环遍历结束,变量保存的就是数组中的最大值
- 代码实现:
1. 带参数方法练习(应用)
- 需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数 }
- 思路:
- ①定义一个方法,用于打印两个数字中的较大数,例如getMax()
- ②为方法定义两个参数,用于接收两个数字
- ③使用分支语句分两种情况对两个数字的大小关系进行处理
- ④在main()方法中调用定义好的方法(使用常量)
- ⑤在main()方法中调用定义好的方法(使用变量)
- 代码:
2. 带返回值方法练习(应用)
- 需求:设计一个方法可以获取两个数的较大值,数据来自于参数
- 思路:
- ①定义一个方法,用于获取两个数字中的较大数
- ②使用分支语句分两种情况对两个数字的大小关系进行处理
- ③根据题设分别设置两种情况下对应的返回结果
- ④在main()方法中调用定义好的方法并使用变量保存
- ⑤在main()方法中调用定义好的方法并直接打印结果
- 代码:
3.方法的通用格式(掌握)
- 格式:
- 解释:
- public static 修饰符,目前先记住这个格式
返回值类型 方法操作完毕之后返回的数据的数据类型
方法名 调用方法时候使用的标识
参数 由数据类型和变量名组成,多个参数之间用逗号隔开
方法体 完成功能的代码块
return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
- public static 修饰符,目前先记住这个格式
- 定义方法时,要做到两个明确
- 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
- 明确参数:主要是明确参数的类型和数量
- 调用方法时的注意:
- void类型的方法,直接调用即可
- 非void类型的方法,推荐用变量接收调用
4.方法重载练习(掌握)
- 需求:使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte,short,int,long)
- 思路:
- ①定义比较两个数字的是否相同的方法compare()方法,参数选择两个int型参数
- ②定义对应的重载方法,变更对应的参数类型,参数变更为两个long型参数
- ③定义所有的重载方法,两个byte类型与两个short类型参数
- ④完成方法的调用,测试运行结果
- 代码:
5. 数组遍历(应用)
- 需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]
- 思路:
- ①因为要求结果在一行上输出,所以这里需要在学习一个新的输出语句System.out.print(“内容”);
System.out.println(“内容”); 输出内容并换行
System.out.print(“内容”); 输出内容不换行
System.out.println(); 起到换行的作用
- ②定义一个数组,用静态初始化完成数组元素初始化
- ③定义一个方法,用数组遍历通用格式对数组进行遍历
- ④用新的输出语句修改遍历操作
- ⑤调用遍历方法
- ①因为要求结果在一行上输出,所以这里需要在学习一个新的输出语句System.out.print(“内容”);
- 代码:
7.4 数组最大值(应用)
- 需求:设计一个方法用于获取数组中元素的最大值
- 思路:
- ①定义一个数组,用静态初始化完成数组元素初始化
- ②定义一个方法,用来获取数组中的最大值,最值的认知和讲解我们在数组中已经讲解过了
- ③调用获取最大值方法,用变量接收返回结果
- ④把结果输出在控制台
- 代码:
1.减肥计划if版本【应用】
案例需求
代码实现
2.减肥计划switch版本【应用】
案例需求
代码实现
3.逢七跳过【应用】
案例需求
代码实现
2.4不死神兔【应用】
案例需求
代码实现
5.百钱白鸡【应用】
案例需求
代码实现
6.数组元素求和【应用】
案例需求
代码实现
7.判断两个数组是否相同【应用】
案例需求
代码实现
8.查找元素在数组中出现的索引位置【应用】
案例需求
代码实现
9.数组元素反转【应用】
案例需求
代码实现
10.评委打分【应用】
案例需求
代码实现
1. 学生对象-练习【应用】
- 需求:首先定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法的使用
- 分析:
- 成员变量:姓名,年龄…
- 成员方法:学习,做作业…
- 示例代码:
2.private的使用【应用】
- 需求:定义标准的学生类,要求name和age使用private修饰,并提供set和get方法以及便于显示数据的show方法,测试类中创建对象并使用,最终控制台输出 林青霞,30
- 示例代码:
3.this关键字【应用】
- this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
4.5 封装思想【理解】
- 封装概述
是面向对象三大特征之一(封装,继承,多态)
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的 - 封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXxx()/setXxx()方法 - 封装好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
5. 构造方法
5.1 构造方法概述【理解】
构造方法是一种特殊的方法
- 作用:创建对象 Student stu = new Student();
- 格式:
public class 类名{
}
- 功能:主要是完成对象数据的初始化
- 示例代码:
5.2 构造方法的注意事项【理解】
- 构造方法的创建
- 构造方法的重载
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
- 推荐的使用方式
无论是否使用,都手工书写无参数构造方法
- 重要功能!
可以使用带参构造,为成员变量进行初始化
- 示例代码
5.3 标准类制作【应用】
- 需求:定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。
- 示例代码:
- 字符串不可变,它们的值在创建后不能被更改
- 虽然 String 的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
- 常用的构造方法
- 示例代码
- 通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
- 直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
1.5.1==号的作用
- 比较基本数据类型:比较的是具体的值
- 比较引用数据类型:比较的是对象地址值
1.5.2equals方法的作用
- 方法介绍
- 示例代码
1.6.1案例需求
1.6.2代码实现
1.7.1案例需求
1.7.2代码实现
1.8.1案例需求
1.8.2代码实现
1.9.1案例需求
1.9.2代码实现
1.10.1案例需求
1.10.2代码实现
1.11帮助文档查看String常用方法【记忆】
2.StringBuilder类
2.1StringBuilder类概述【理解】
2.2StringBuilder类和String类的区别【理解】
- String类:内容是不可变的
- StringBuilder类:内容是可变的
2.3StringBuilder类的构造方法【记忆】
- 常用的构造方法
- 示例代码
2.4StringBuilder类添加和反转方法【记忆】
- 添加和反转方法
- 示例代码
2.5StringBuilder和String相互转换【应用】
- StringBuilder转换为String
- String转换为StringBuilder
- 示例代码
2.6字符串拼接升级版案例【应用】
2.6.1案例需求
2.6.2代码实现
2.7字符串反转升级版案例【应用】
2.7.1案例需求
2.7.2代码实现
2.8帮助文档查看StringBuilder常用方法【记忆】
1.ArrayList
1.1ArrayList类概述【理解】
- 什么是集合
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
- ArrayList集合的特点
底层是数组实现的,长度可以变化
- 泛型的使用
用于约束集合中存储元素的数据类型
1.2ArrayList类常用方法【应用】
1.2.1构造方法
1.2.2成员方法
1.2.3示例代码
1.3ArrayList存储字符串并遍历【应用】
1.3.1案例需求
1.3.2代码实现
1.4ArrayList存储学生对象并遍历【应用】
1.4.1案例需求
1.4.2代码实现
1.5ArrayList存储学生对象并遍历升级版【应用】
1.5.1案例需求
1.5.2代码实现
2.学生管理系统
2.1学生管理系统实现步骤【理解】
- 案例需求
针对目前我们的所学内容,完成一个综合案例:学生管理系统!该系统主要功能如下:
- 实现步骤
- 定义学生类,包含以下成员变量
- 学生管理系统主界面的搭建步骤
- 学生管理系统的添加学生功能实现步骤
- 学生管理系统的查看学生功能实现步骤
- 学生管理系统的删除学生功能实现步骤
- 学生管理系统的修改学生功能实现步骤
- 退出系统
使用System.exit(0);退出JVM
2.2学生类的定义【应用】
2.3测试类的定义【应用】
3.1、概述
概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的。面向对象的三大特征:封装、继承、多态。
开发:其实就是找对象,建立对象,使用对象,维护对象的关系。
3.2、类和对象
简单理解:类是对事物的一种描述,对象则为具体存在的事物
类的定义:
对象使用:
成员调用:
特别注意:

3.3、封装
概述:是面向对象编程语言对客观世界的模拟,客观世界 里成员变量都是隐藏在对象内部的,外界是无法直接操作的
原则:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
好处:通过方法来控制成员变量的操作,提高了代码的安全性,把代码用方法进行封装,提高了代码的复用性
3.3.1、private关键字
概述:private是一个修饰符,可以用来修饰成员(成员变量,成员方法),被private修饰的成员,只能在本类进行访问
应用:类中的属性通常被私有化,并对外提供公共的访问方法,这样可以避免安全隐患。这个方法一般有两个,规范写法:对于属性 xxx,可以使用setXxx()、getXxx()对其进行操作。
3.3.2、this关键字
概述:this代表它所在函数所属对象的引用,哪个对象在调用this所在的函数,this就代表哪个对象
应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象
3.3.3、构造方法
概述:构造方法是一种特殊的方法,可以使用带参构造,为成员变量进行初始化
格式:
注意:
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法,如果定义了构造方法,系统将不再提供默认的构造方法
- 如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
3.3.4、封装案例
3.4、继承
概述:继承可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法
格式:class 子类 extends 父类 { }
好处:继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中非私有的成员
3.4.1、super关键字
概述:代表父类存储空间的标识(可以理解为父类对象引用)
应用:子类要访问父类中的同名成员(成员变量和成员方法),用super关键字
3.4.2、this和super区别
3.4.3、继承中的成员访问特点
3.4.3.1、继承中变量使用的访问特点
- 子类局部范围找
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
3.4.3.2、继承中成员方法的访问特点
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
3.4.3.3、继承中构造方法的访问特点
注意:子类中所有的构造方法默认都会访问父类中无参的构造方法,每一个子类构造方法的第一条语句默认都是:super()
问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
答案:通过使用super关键字去显示的调用父类的带参构造方法
3.4.4、方法重写
概述:子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了 父类的功能,又定义了子类特有的内容
注解:Override注解用来检测当前的方法,是否是重写的方法,起到【校验】的作用
注意:
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 子类方法访问权限不能更低(public > 默认 > 私有)
3.4.5、继承的注意事项
- 类只支持单继承,不支持多继承
- 类支持多层继承
3.5、多态
概述:同一个对象,在不同时刻表现出来的不同形态
前提:要有继承或实现关系、要有方法的重写、要有父类引用指向子类对象
好处:提高程序的扩展性,定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
3.5.1、多态中的成员访问特点
3.5.2、多态中的转型
3.5.3、instanceof 运算符
格式:对象 intanceof 类型(类类型 接口类型)
描述:如果运算符左侧变量所指的对象,是操作符右侧类或接口的一个对象,那么结果为真
3.6、包和导包
3.6.1、package关键字
概述:包就是文件夹,用来管理类文件的
格式:package 包名; (多级包用.分开)
注意:
3.6.2、 import关键字
概述:使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了,为了简化带包的操作,Java就提供了导包的功能
普通格式:import 包名;
静态导入:import static 包名.类名.方法名;
3.7、权限修饰符

3.8、final关键字
概述:final关键字是最终的意思,可以修饰成员方法、成员变量、类
特点:
注意:final修饰局部变量
- fianl修饰基本数据类型变量:基本类型的数据值不能发生改变
- final修饰引用数据类型变量:引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变
3.9、static关键字
概述:static关键字是静态的意思,可以修饰成员方法、成员变量
特点:
注意:静态成员方法只能访问静态成员
3.1、抽象类
概述:在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了
格式:public abstract class 类名 {}
语法特点:
- 抽象类和抽象方法必须使用 abstract 关键字修饰
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类不能实例化,要想实例化,参照多态的方式,通过子类对象实例化,这叫抽象类多态
- 抽象类的子类,要么重写抽象类中的所有抽象方法,要么子类也是抽象类
内部特点:
注意问题:
- 与abstract不能共存的关键字:final、private、static
3.2、接口
概述:接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用
格式:public interface 接口名 {}
语法特点:
- 接口用关键字interface修饰
- 类实现接口用implements表示
- 接口不能实例化,要想实例化,参照多态的方式,通过子类对象实例化,这叫接口多态
- 接口的子类,要么重写接口中的所有抽象方法,要么子类也是抽象类
内部特点:
注意问题:
- 抽象类和接口区别
- JDK8新特性
- 默认方法
- 静态方法
3.3、内部类
概述:在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类
格式:
语法特点:
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
常见分类:
3.4、方法进阶
3.4.1、类作为方法形参和返回值
3.4.2、抽象类作为方法形参和返回值
3.4.3、接口作为方法形参和返回值
3.4.4、匿名内部类作为方法实参和返回值
4.1、Object类
描述:该类是所有类的最终根类
4.2、System类
描述:该类包含几个有用的类字段和方法
4.3、Arrays类
描述:该类包含用于操作数组的各种方法
4.4、Math类
描述:该类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数
成员变量:
成员方法:
4.6、Date类
描述:该类是一个日期类
构造方法:
4.7、SimpleDateFormat类
1、将日期格式化为字符串
2、将字符串格式化为日期
4.8、Calendar类
4.1、String类
描述:该类代表字符串
构造方法:
成员方法:
注意事项:
4.2、八种包装类
4.3、BigInteger类
4.4、BigDecimal类
4.5、异常
概述:异常就是程序出现了不正常的情况
体系:

解决:
注意:

案例:
5.1、泛型
概述:泛型是是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型类:
泛型方法:
泛型接口:
类型通配符:
可变参数:
5.2、集合
概述:提供一种可变的存储模型,存储的数据容量可以随时发生改变
体系:

5.2.1、Collection接口
子接口特点:
- List接口:按照顺序存取,元素可以重复,有索引,可使用迭代器、增强for循环、普通for循环遍历
- Set接口:不按照顺序存取,元素不可以重复,没有索引,可使用迭代器、增强for循环遍历
通用方法:
5.2.2、List接口
子类特点:
- ArrayList集合:底层是数组结构实现,查询快、增删慢
- LinkedList集合:底层是链表结构实现,查询慢、增删快
通用方法:
注意事项:
LinkedList集合的特有方法:
5.2.3、Set接口
子类特点:
- HashSet集合:底层由哈希表支撑,元素存取无序,对象添加需要重写hashCode和equals方法
- TreeSet集合:底层由二叉树支撑,元素顺序存取,对象排序需要继承Comparable接口重写compareTo方法、或者使用Comparator初始化
HashSet演示:
TreeSet演示:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
5.2.4、Map接口
接口特点:
- 键值对映射关系
- 一个键对应一个值,键不可以重复,值可以重复
- 凡是对象作为HashMap的键时,对象添加需要重写hashCode和equals方法
通用方法:
5.3、Collections类
描述:是针对集合操作的工具类
成员方法:
示例代码:斗地主洗牌
6.1、File类
描述:该类是文件和目录路径名的抽象表示
构造方法:
成员方法:
创建功能:
判断功能:
获取功能:
删除功能:
6.2、IO流
概述:IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制、文件上传、文件下载、文件的读取、文件的写出等等
分类:
注意:
- 如果操作的是纯文本文件,优先使用字符流
- 如果操作的是图片、视频、音频、应用等二进制文件,优先使用字节流
- 如果不确定文件类型,优先使用字节流,字节流是万能的流
6.2.1、字节流
体系:

6.2.1.1、字节流写数据的三种方式
6.2.1.2、字节流读数据的三种方式
6.2.1.3、字节流复制文件的四种方式
6.2.2、字符流
体系:

6.2.2.1、字符流写数据的五种方式
6.2.2.2、字符流读数据的四种方式
6.2.2.3、字符流复制文本的七种方式
6.3、文件夹复制
6.3.1、复制单级文件夹
6.3.2、复制多级文件夹
6.3.3、捕获异常新特性
6.3.3.1、JDK7以前做法
6.3.3.2、JDK7版本改进
6.4、IO特殊流
6.4.1、标准输入流
6.4.2、标准输出流
6.4.3、字节打印流
6.4.4、字符打印流
6.4.5、对象序列化流
注意:需要实现Serializable接口,同时需要给出serialVersionUID
6.4.6、对象反序列化流
注意:成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
6.5、Properties集合
7.1、概述
进程:是正在运行的程序
线程:是进程中的单个顺序控制流,是一条执行路径
7.2、实现方式
7.2.1、方式一
7.2.2、方式二
7.3、线程优先级
7.4、线程的控制
sleep演示:使当前正在执行的线程停留(暂停执行)指定的毫秒数
join演示:等待这个线程死亡才能执行其它线程
Daemon演示:将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
7.5、线程的生命周期

7.6、解决多线程数据安全问题
7.6.1、同步代码块
7.6.2、普通同步方法
7.6.3、静态同步方法
7.6.4、Look锁
7.7、生产者和消费者模式
概述:生产者消费者模式是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。
演示:
8.1、概述
网络编程:在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换
8.2、三要素
IP地址:是网络中设备的唯一标识,一般分两类:IPV4、IPV6
端口:设备上应用程序的唯一标识,常见的端口:8080、3306
协议:计算机网络中,连接和通信的规则被称为网络通信协议,常见的协议:UDP协议、TCP协议
8.3、UDP编程
UDP协议:用户数据报协议(User Datagram Protocol),无连接通讯协议,但不能保证传输数据完整性,常用于音频、视频、普通数据传输等
8.3.1、发送数据
8.3.2、接收数据
8.3.3、练习
- 案例需求:
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据才结束
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
- 代码实现:
8.4、TCP编程
TCP协议:传输控制协议 (Transmission Control Protocol),面向连接通讯协议、且可以保证传输数据完整性,常用于文件上传、文件下载、浏览网页等
8.4.1、发送数据
8.4.2、接收数据
8.4.3、练习
- 案例需求
客户端:数据来自于键盘录入,直到输入的数据是886,发送数据才结束
服务端:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
- 代码实现:
8.5、文件上传
8.5.1、单线程文件上传
客户端代码:
服务端代码:
8.5.2、多线程文件上传
客户端代码:
服务端代码:
9.1、Lambda表达式
9.1.1、标准格式
9.1.2、使用前提
有一个接口并且接口中有且仅有一个抽象方法
9.1.3、常见应用
9.1.3.1、无参无返回值抽象方法练习
9.1.3.2、有参无返回值抽象方法练习
9.1.3.3、有参有返回值抽象方法练习
9.1.4、省略模式
- 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号和return关键字
9.1.5、注意事项
- 使用Lambda必须要有接口并且要求接口中有且仅有一个抽象方法
- 必须有上下文环境,才能推导出Lambda对应的接口
- 根据局部变量的赋值得知Lambda对应的接口
- 根据调用方法的参数得知Lambda对应的接口
9.1.6、Lambda表达式和匿名内部类的区别
- 所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件,对应的字节码会在运行的时候动态生成
9.2、方法引用
9.2.1、概述
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案,拿参数做操作,如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?肯定是没必要,那我们又是如何使用已经存在的方案的呢?我们是通过方法引用来使用已经存在的方案
9.2.2、方法引用符
9.2.3、省略模式
方法引用可以根据上下文进行推导,方法引用是Lambda的孪生兄弟
9.2.4、常见应用
9.2.4.1、引用类方法
使用说明:Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数
9.2.4.2、引用类的实例方法
使用说明:Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后面的参数全部传递给该方法作为参数
9.2.4.3、引用对象的实例方法
使用说明:Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数
9.2.4.4、引用构造器方法
使用说明:Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数
10.1、函数式接口
10.1.1、概述
有且仅有一个抽象方法的接口,并且可以通过在类上标注@FunctionalInterface注解进行检测,建议自定义的函数式接口都加上这个注解
10.1.2、函数式接口作为方法的参数
10.1.3、函数式接口作为方法的返回值
10.1.4、四大内置核心函数式接口

10.1.4.1、Supplier接口
10.1.4.2、Consumer接口
10.1.4.3、Predicate接口
10.1.4.4、Function接口
10.2、Stream流
10.2.1、概述
流(Stream)是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算
10.2.2、操作步骤
- 获流对象:一个数据源(如:集合、数组),获取一个流(如:串行流、并行流、无限流)
- 中间操作:一个中间操作链,对数据源的数据进行处理
- filter()
- limit()
- skip()
- distinct()
- sorted()
- map()
- mapToInt()
- mapToLong()
- mapToDouble()
- flatMap()
- flatMapToInt()
- flatMapToLong()
- flatMapToDouble()
- peek()
- 终止操作:一个终止操作,执行中间操作链并产生结果
- forEach()
- forEachOrdered()
- count()
- min()
- max()
- reduce()
- collect()
- toArray()
- findFirst()
- findAny()
- anyMatch()
- allMatch()
- noneMatch()
10.2.3、代码演示
filter代码演示:
limit&skip代码演示:
distinct代码演示:
sorted代码演示:
map&mapToInt&mapToLong&mapToDouble代码演示:
forEach&forEachOrdered&count代码演示:
max&min代码演示:
11.1、Optional 容器类
11.1.1、概述
Optional 类是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional类 可以更好的表达这个概念并且可以避免空指针异常
11.1.2、常用方法
11.2、新日期时间
11.2.1、概述
Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的,Java 8的日期和时间类包含 LocalDate、LocalTime、LocalDateTime、Instant、Duration 以及 Period,这些类都包含在 java.time 包中,它们是线程安全的,LocalDate 只会获取年月日,LocalTime 只会获取时分秒,LocalDateTime 获取年月日时分秒,相当于 LocalDate + LocalTime,推荐使用LocalDateTime
11.2.2、LocalDate类
描述:本地日期,可以获取年、月、日、星期几
11.2.3、LocalTime类
描述:本地时间,可以获取时、分、秒
11.2.4、LocalDateTime类
描述:本地日期时间,可以获取年、月、日、时、分、秒、纳秒
11.2.5、Instant类
描述:时间戳,可以获取秒、毫秒、纳秒
11.2.6、Period类
描述:用于计算两个“日期”间隔,可以获取年、月、天、总月
11.2.7、Duration类
描述:用于计算两个“时间”间隔,可以获取天、时、时、分、秒、毫秒、纳秒
11.2.8、时间校正器
描述:TemporalAdjusters 包含许多静态方法,可以直接调用
11.2.9、格式化时间
描述:通过localDate.format方法格式化,格式可以是内置的也可以是自定义的
11.2.10、解析时间
描述:通过LocalDate.parse方法解析,格式可以是内置的也可以是自定义的
11.2.11、带时区的日期或时间
描述:ZonedDate、ZonedTime、ZonedDateTime
12.1、类加载器
12.1.1、类加载
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载、类的连接、类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化
12.1.2、类初始化过程
- 类的加载
- 就是指将class文件读入内存,并为之创建一个java.lang.Class对象
- 任何类被使用时,系统都会为之建立一个java.lang.Class对象
- 类的连接
- 验证阶段:用于检验被加载的类是否有正确的内部结构并和其它类协调一致
- 准备阶段:负责为类的类变量分配内存并设置默认初始化值
- 解析阶段:将类的二进制数据中的符号引用替换为直接引用
- 类的初始化:在该阶段,主要就是对类变量进行初始化
- 假如类还未被加载和连接,则程序先加载并连接该类
- 假如该类的直接父类还未被初始化,则先初始化其直接父类
- 假如类中有初始化语句,则系统依次执行这些初始化语句
- 注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3
12.1.3、类初始化时机
- 创建类的实例
- 调用类的方法
- 访问类、接口的变量或者为该类变量赋值
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
12.1.4、类加载器
概述:负责将.class文件加载到内存中并为之生成对应的 java.lang.Class 对象
- Bootstrap class loader:它是虚拟机的内置类加载器,通常表示为null 并且没有父加载器
- Platform class loader:它是平台类加载器,它可以看到所有平台类 :包括由平台类加载器或其祖先定义的Java SE平台API,其实现类和JDK特定的运行时类
- System class loader:它是系统类加载器也被称为应用程序类加载器 ,与平台类加载器不同。 它通常用于定义应用程序类路径和JDK特定工具上的类
注意:类加载器的继承关系:System的父加载器为Platform,而Platform的父加载器为Bootstrap
12.1.5、类加载机制
- 全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
- 父类委托:当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
- 缓存机制:保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时,类加载器先从缓存区中搜索该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据并将其转换成 Class对象存储到缓存区
12.1.6、ClassLoader类
12.2、反射
12.2.1、概述
反射是指在运行时去获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制。 由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展
12.2.2、获取Class类对象
12.2.3、反射获取构造方法
方法描述:
方法演示:
12.2.4、反射获取成员变量
方法描述:
方法演示:
12.2.5、反射获取成员方法
方法概述:
方法演示:
12.2.6、综合案例
12.2.7、动态代理
13.1、枚举类
13.1.1、概述
概述:枚举是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等
格式:public enum 枚举名称 {}
13.1.2、自定义枚举类
13.1.2.1、第一版
13.1.2.2、第二版
13.1.2.3、第三版
13.1.2.4、测试方法
13.1.3、系统的枚举类
13.1.3.1、第一版
13.1.3.2、第二版
13.1.3.3、第三版
13.1.3.4、测试方法
13.1.4、常见方法
13.1.5、注意事项
- 定义枚举类要用关键字enum
- 所有枚举类都是Enum的子类
- 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其它的东西,这个分号就不能省略,建议不要省略
- 枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);
- 枚举类也可以有抽象方法,但是枚举项必须重写该方法
- 枚举在switch语句中的使用
13.2、注解
13.2.1、概述
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被注解。和 Javadoc 不同,Java 注解可以通过反射获取注解内容。在编译器生成类文件时,注解可以被嵌入到字节码中。Java 虚拟机可以保留注解内容,在运行时可以获取到注解内容 。 当然它也支持自定义 Java 注解。
格式:public @interface 注解名称 {}
13.2.2、元注解
13.2.2.1、@interface注解
使用 @interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是一个Annotation,定义 Annotation 时,@interface 是必须的,通过 @interface 定义注解后,该注解不能继承其它的注解或接口
13.2.2.2、@Inherited注解
表示允许子类继承父类中的注解
13.2.2.3、@Document注解
表示将此注解包含在 javadoc 中
13.2.2.4、@Target注解
表示该注解目标
- ElemenetType.CONSTRUCTOR 构造器声明
- ElemenetType.FIELD 域声明
- ElemenetType.LOCAL_VARIABLE 局部变量声明
- ElemenetType.METHOD 方法声明
- ElemenetType.PACKAGE 包声明
- ElemenetType.PARAMETER 参数声明
- ElemenetType.TYPE 类、接口、枚举、注解声明
13.2.2.5、@Retention注解
表示该注解的生命周期
- RetentionPolicy.SOURCE 源码期间有效
- RetentionPolicy.CLASS 编译期间有效
- RetentionPolicy.RUNTIME 运行期间有效
13.2.3、参数成员
- 参数成员只能用public或默认(default)这两个访问权修饰
- 参数成员只能用八种基本数据类型(byte,short,int,long,float,double,char,boolean)和String、Enum、Class、Annotations等类型以及这些类型的一维数组
13.2.4、常见注解
13.2.5、综合案例
第一步:创建自定义注解,MyTest.java
第二步:创建待测试模块,UserDao.java
第三步:反射执行方法,MyJunit.java
14.1、JDK5新特性回顾
- 自动装箱、拆箱
- 静态导入
- 增强for循环
- 可变参数
- 枚举
- 泛型
- 元数据
14.2、JDK7新特性回顾
- 对Java集合(Collections)的增强支持
- 在switch中可用String
- 数值可加下划线
- 支持二进制文字
- 泛型简化
- 异常的多个catch合并
- 自动资源管理
14.3、JDK8新特性回顾
- Lambda表达式
- 函数式接口
- 方法引用与构造器引用
- Stream API
- Optional容器类
- 接口中的默认方法与静态方法
- 新时间日期 API
- 重复注解
原文链接:https://blog.csdn.net/weixin_/article/details/
到此这篇多级列表1.1,1.2,1.3怎么弄咋样在侧边显现出来(多级列表3.1怎么设置)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qdvuejs/19627.html