输出语句

1
2
3
System.out.println( "abc" );//先打印abc,再进行换行
System. out.print( "abc" );//只打印abc,不换行
System.out.println();//不打印任何数据,只做换行处理。

变量

变量的定义格式

1
数据类型 变量名 = 数据值;

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
public class VariableDemo1{
//主入口
public static void main(String[] args){
//定义变量
//数据类型 变量名 = 数据值;
//数据类型:限定了变量能存储的数据类型
//int(整数) double(小数)
//数据值:真正存在变量中的数据
//等号:赋值.
int a = 10;
System.out.println(a);//10
}
}

变量的使用方式

  • 输入打印

    1
    2
    int a = 10;
    System.out.println(a);//10
  • 参与计算

    1
    2
    3
    int a = 10;
    int b = 20;
    System.out.println(a+b);//30
  • 修改记录的值

    1
    2
    3
    4
    int a = 10;
    System.out.println(a);//10
    a = 20;
    System.out.println(a);//20
  • 一条语句中定义多个变量

    1
    2
    3
    4
    int d = 100, e = 200, f = 300;
    System.out.println(d);
    System.out.println(e);
    System.out.println(f);

变量的注意事项

  • 只能储存一个值
  • 变量名不允许重复定义
  • 一条语句可以定义多个变量
  • 变量在使用之前一定要进行赋值

变量的使用场景

  • 重复使用某个值
  • 某个数据经常发生改变

基本数据类型

数据类型 关键字
整数 byte、short、int、long
浮点数 float、double
字符 char
布尔 boolean

image-20240126152002992

相关demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class VariableDemo3{
//主入口
public static void main(String[] args){
//byte
byte b = 10;
System.out.println(b);
//short
short s = 20;
System.out.println(s);
//int
int i = 30;
System.out.println(i);
//long
//如果要定义long类型的变量
//在数据值后面需要加一个L作为后缀
//L可以是大写的,也可以是小写的
//建议:使用大写。原因小写l与数字1长相相似
long l = 999999999999L;
System.out.println(l);
//float
//float类型的数据后面要需要加一个F
//F可以是大写也可以是小写
float f = 10.1F;
System.out.println(f);
//double
double d = 20.2;
System.out.println(d);
//char
char c ='中';
System.out.println(c);
//boolean
//只有true 和 false
boolean o = true;
System.out.println(o);

}
}

键盘录入

  1. 导包

    1
    import java.util.Scanner; //导包的动作必须出现在类定义的上边
  2. 创建对象

    1
    2
    Scanner sc = new Scanner(System.in);
    上面这个格式里面,只有sc是变量名,可以变,其他的都不允许变
  3. 接收数据

    1
    int i = sc.nextInt(); // 只有i是变量名,可以变,其他的都不允许变

相关demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1.导包,找到Scanner这个类在哪
//书写要注意:要写在类定义的上面
import java.util.Scanner;


public class ScannerDemo1{
//程序主入口
public static void main(String[] args){
//2.创建对象,表示我现在准备要用Scanner这个类
Scanner sc = new Scanner(System.in);

//3.接收数据
//变量i记录了键盘录入的数据
System.out.println("请输入整数");
int i = sc.nextInt();
System.out.println(i);
}
}

运算符和表达式

运算符

  • 对字面量或者变量进行操作的符号

表达式

  • 用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式

  • 不同运算符连接的表达式体现的是不同类型的表达式

类型转换

隐式转换(自动类型提升)

  • 把一个取值范围小的数据,转成取值范围大的数据
  • byte < short < int < long < float < double
  • byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后在进行运算

强制转换

  • 如果把一个取值范围大的数值,赋给取值范围小的变量。
  • 是不允许直接赋值的。如果一定要这么做就需要加入强制转换

格式:

1
目标数据类型 变量名 = (目标数据类型)被强制转换的数据

自增/自减运算符

符号 作用 说明
++ 变量的值加1
变量的值减1

运算符

赋值运算符

符号 作用 说明
= 赋值 int a = 10,将10赋值给变量a
+= 加后赋值 a += b,将a+b的值给a
-= 减后赋值 a -= b,将a -b 的值给a
*= 乘后赋值 a *=b,将a * b的值给a
/= 除后赋值 a /= b,将a / b的值给a
%= 取余后赋值 a %= b, 将a / b 的余数给a

关系运算符

符号 说明
== a==b,判断a和b的值是否相等,成立为true,不成立为false
!= a!=b,判断a和b的值是否不相等,成立为true,不成立为false
> a>b,判断a是否大于b,成立为true,不成立为false
>= a>=b,判断a是否大于等于b,成立为true,不成立为false
< a<b,判断a是否小于b,成立为true,不成立为false
<= a<=b,判断a是否小于等于b,成立为true,不成立为false
  • 关系运算法的结果都是boolean类型,要么是true,要么是false.

逻辑运算符

符号 作用 说明
& 逻辑与(且) 并且,两边都为真,结果才是真
| 逻辑或 或者,两边都为假,结果才是假
^ 逻辑异或 相同为false,不同为true
! 逻辑非 取反

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package logicoperator;

public class LogicoperatorDemo1 {
public static void main(String[] args) {
//1.& 并且
//两边都为真,结果才是真
System.out.println(true & true);
System.out.println(false & false);
System.out.println(true & false);
System.out.println(false & true);

//2. | 或者
//两边都为假结果才是假
System.out.println(true | true);
System.out.println(false | false);
System.out.println(true | false);
System.out.println(false | true);

//3. ^ 异或
//相同为false,不同为true
System.out.println(true ^ true);
System.out.println(false ^ false);
System.out.println(true ^ false);
System.out.println(false ^ true);

//4. 非,取反
System.out.println(!false);//true
System.out.println(!true);//false
}
}

短路逻辑运算符

符号 作用 说明
&& 短路与 结果和&相同,但是有短路效果结果和
|| 短路或 结果和|相同,但是有短路效果结果和

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package logicoperator;

public class LogicoperatorDemo2 {
public static void main(String[] args) {
//1.&&
//运行结果与单个&是一样的
//表示两边都为真结果才是真
System.out.println(true && true);
System.out.println(false && false);
System.out.println(false && true);
System.out.println(true && false);

//2. ||
//运行结果与单个|是一样的
//表示两边都为假,结果才是假
System.out.println(true || true);
System.out.println(false || false);
System.out.println(false || true);
System.out.println(true || false);

//3.短路逻辑运算符具有短路的效果
//简单理解:当左边的表达式能确定最终的结果,那么右边的就不会参与运行了
int a = 10;
int b = 10;
boolean result = ++a < 5 && ++b < 5;
System.out.println(result);
System.out.println(a);
System.out.println(b);
}
}

三元运算符/三元表达式

1
格式: 关系表达式?表达式1:表达式2

计算规则

  • 首先计算关系表达式的值
  • 如果值为true,表达式1的值就是运算结果
  • 如果值为false,表达式2的值就是运算结果

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TernaryoperatorDemo1 {
public static void main(String[] args) {
//需求:使用三元运算符.获取两个数的较大值;

//分析:
//1.定义两个变量记录两个整数
int number1 = 10;
int number2 = 20;

//2.使用三元运算符获取两个整数的较大值
//格式: 关系表达式?表达式1:表达式2;
//整个三元运算符的结果必须要被使用

int max = number1 >number2 ? number1 : number2;
System.out.println(max);
}
}

优先级 运算符
1 . () {}
2 !、++、–
3 *、/、%
4 +、-
5 <<、>>、>>>、
6 <、<=、>、>=、instanceof
7 ==、!=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 =、+=、-=、*=、/=、%=、&=

判断和循环

判断结构

if语句

格式1:

1
2
3
if(关系表达式){
语句体;
}

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package If;

import java.util.Scanner;

public class IfDemo1 {
public static void main(String[] args) {
/*需求:
键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入女婿的酒量:");
int ability = sc.nextInt();
if (ability > 2){
System.out.println("渣渣,喝不倒我,就别想穿我的小棉袄!");
}
}
}


在语句体中只有一句代码时,大括号可以省略不写**(不建议这么写)**

1
2
if(关系表达式)
语句体;

格式2

1
2
3
4
5
if(关系表达式){
语句体1;
}else{
语句体2;
}

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package If;

import java.util.Scanner;

public class IfDemo2 {
public static void main(String[] args) {
/*需求
键盘录入一个整数,表示身上的钱.
如果大于等于100块,就吃网红餐厅.
否则,就吃经济实惠的沙县小吃
*/

//分析
//定义一个变量price表示身上的钱
Scanner sc = new Scanner(System.in);
System.out.println("请输入身上的钱数:");
int price = sc.nextInt();
if(price >= 100){
System.out.println("网红餐厅我™来辣");
}else{
System.out.println("还是去吃便宜的沙县小吃吧...");
}
}
}

格式3

1
2
3
4
5
6
7
8
9
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体二
}
...
else{
语句体 n + 1;
}

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package If;

import java.util.Scanner;

public class IfDemo3 {
public static void main(String[] args) {
/*需求
根据不同的需求送不同的礼物
如果是95~100分,送自行车一辆
如果是90~94分,游乐场玩一天
如果是80~89分,送变形金刚一个
如果是80分,揍一顿
*/

//定义变量score记录分数
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
//对分数进行校验
if (score < 0 && score > 100){
//判断
if (score >= 95 && score <= 100){
System.out.println("给你买个自行车");
} else if (score >= 90 && score <= 94) {
System.out.println("带你去游乐场玩一天");
} else if (score > 80 && score <= 89) {
System.out.println("给你买一个变形金刚");
}else {
System.out.println("揍一顿");
}
}else {
System.out.println("您输入的分数有问题!");
}

}
}

switch语句

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
switch(){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;

...
default:
语句体 n + 1;
break;
}

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package switchl;

import java.util.Scanner;

public class switchDemo1 {
public static void main(String[] args) {
/*需求:
键盘录入星期数,显示今天的减肥活动
周一: 跑步
周二: 游泳
周三: 慢走
周四: 动感单车
周五: 拳击
周六: 爬山
周日: 好好吃一顿
*/

//1.定义变量day记录星期数
System.out.println("请输入今天星期几:");
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
//判断星期数的合法性
switch (day){
case 1:
System.out.println("去跑步!");
break;
case 2:
System.out.println("去游泳!");
break;
case 3:
System.out.println("慢走!");
break;
case 4:
System.out.println("动感单车!");
break;
case 5:
System.out.println("打拳击!");
break;
case 6:
System.out.println("去爬山");
break;
case 7:
System.out.println("好好吃一顿!");
break;
default:
System.out.println("您输入的星期数不合法!");
break;
}
}
}

default的位置和省略:

  • 位置:default不一定是写在最下面,我们可以写在任意位置,只不过习惯写在最下面
  • 省略:default可以省略,语法不会有问题,但是不建议省略

**case穿透:**就是语句体中没有写break导致的。

执行流程:

  • 首先还是会拿着小括号中的表达式的值跟下面每一个case进行匹配。
  • 如果匹配上了,就会执行对应的语句体,如果此时发现了break,那么结束整个switch语句。
  • 如果没有发现break,那么程序会继续执行下一个case的语句体,一直遇到break或者右大括号为止。

switch的新特性

只在JDK12版本之后有效

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package switchl;

public class Switchdemo3 {
public static void main(String[] args) {
/*需求
1 2 3 -> 一 二 三
*/
int number = 1;
switch (number){
case 1 -> {
System.out.println("一");
}
case 2 -> {
System.out.println("三");
}
case 3 -> {
System.out.println("三");
}
default -> {
System.out.println("没有这种选项");
}
}
}
}

如果case后面的大括号中只有一句代码,那么这个大括号可以省略

Demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package switchl;

public class Switchdemo3 {
public static void main(String[] args) {
/*需求
1 2 3 -> 一 二 三
*/
int number = 1;
switch (number){
case 1 -> System.out.println("一");
case 2 -> System.out.println("三");
case 3 -> System.out.println("三");
default -> System.out.println("没有这种选项");
}
}
}

循环结构

什么是循环?

  • 重复的做某件事情
  • 具有明确的开始和停止标记

for循环

格式:

1
2
3
for(初始化语句;条件判断语句;条件控制语句){
循环体语句;
}

demo

1
2
3
4
5
6
7
8
9
10
package Circulate;

public class ForDemo1 {
public static void main(String[] args) {
for (int i = 1;i <= 10;i++){
System.out.println("HelloWorld!");
}
}
}

while循环

1
2
3
4
5
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}

Demo

1
2
3
4
5
6
7
8
9
10
11
12
package Circulate;

public class WhileDemo1 {
public static void main(String[] args) {
//利用while循环打印1~100
int i = 1;
while(i <= 100){
System.out.println(i);
i++;
}
}
}

for循环和while循环对比

相同点:

  • 运行规则都是一样的

不同点:

  • for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束之后,就不能再次访问了
  • while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用。

for循环和while循环的使用习惯

  • for循环:知道循环次数或者循环范围
  • while循环:不知道循环的次数和范围,只知道循环的结束条件

dowhile循环

格式:

1
2
3
4
5
初始化语句:
do{
循环体语句;
条件控制语句;
}while(条件判断语句);

无限循环

  • 循环一直停不下来

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for语句的无限循环:
for( ; ; ){
循环体语句;
}

while语句的无限循环:
while(true){
循环体语句;
}

do hliwe的循环体语句:
do{
循环体语句;
}while(true);

跳转控制语句

Demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Circulate;

public class CirculateTest4 {
public static void main(String[] args) {
/*需求:
小老虎吃包子,第三个包子有虫子,跳过。
*/
for (int i = 1; i <= 5;i++){
if (i == 3){
continue; //continue表示结束这一次循环
}
System.out.println("小老虎吃了第" + i + "个包子");
}
}
}

Demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Circulate;

public class CirculateTest5 {
public static void main(String[] args) {
/*需求:
小老虎吃包子,第三个包子就饱了。
*/
for (int i = 1; i <= 5;i++){
if (i == 3){
System.out.println("小老虎吃了第" + i + "个包子,饱了!");
break; //break表示结束整个循环
}
System.out.println("小老虎吃了第" + i + "个包子");
}
}
}

获取随机数

怎么获取随机数?

Java帮我们写好一个类叫Random,这个类就可以生成一个随机数。

使用步骤:

  1. 导包 — Random这个类在哪

    1
    import java.util.Random
  2. 创建对象 — 表示我要开始用Random这个类了

    1
    Random r = new Random();
  3. 生成随机数 — 真正开始干活了

    1
    int number = r.nextInt(随机数范围);

    Demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Random;

public class CirculateTest9 {
public static void main(String[] args) {
//先获取一个随机数
//范围0~10

//1.导包
//2.创建对象
Random r = new Random();
//3.生成随机数
int number = r.nextInt(11);//随机数范围 0 ~ 10
}
}

Demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Random;

public class CirculateTest9 {
public static void main(String[] args) {
//先获取一个随机数
//范围7~15

//1.导包
//2.创建对象
Random r = new Random();
//3.生成随机数
int number = r.nextInt(9) + 7;//随机数范围 0 ~ 10
}
}

数组

什么是数组?

  • 数组指的是一种容器,可以用来储存同种数据类型的多个值

一维数组

一维数组的定义:

格式1

1
2
3
数据类型[] 数组名
例:
int [] array

格式2

1
2
3
数据类型 数组名[]

int array[]

一维数组的静态初始化

  • 初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
  • 完整格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
  • 简化格式:数据类型[] 数组名 = {元素1,元素2,元素3…};
  • 例: int[] array = new int[]{11,22,33};
  • 例: int[] array = {11,22,33};

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Array;

public class ArrayDemo1 {
public static void main(String[] args) {
//需求1:定义数组储存5个学生的年龄
int[] arr1 = new int[]{11,12,13,14,15};
int[] arr2 = {21,22,23,24,25};
//需求2:定义数组储存5个学生的姓名
String[] arr3 = new String[]{"老大","老二","老三","老四","老五"};
String[] arr4 = {"laoda","laoer","laosan","laosi","laowu"};
//需求3:定义数组储存5个学生的身高
double[] arr5 = new double[]{1.71,1.72,1.73,1.74,1.75};
double[] arr6 = {1.81,1.82,1.83,1.84,1.85};
}
}

一维数组的遍历

  • **数组遍历:**将数组中所有的内容取出来,取出来之后可以(打印,求和,判断..)
  • **注意:**遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印!

在java中,关于数组的一个长度属性,length

  • 调用方式: 数组名.length

1
2
3
4
5
6
7
8
9
10
package Array;

public class ArrayDemo3 {
public static void main(String[] args) {
//1.定义数组
int[] arr = {1,2,3,4,5};
System.out.println(arr.length);
}
}

一维数组的动态初始化

  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

    1
    2
    3
    4
    格式:
    数据类型[] 数组名 = new 数据类型[数组长度];
    例:
    int[] arr = new int[3];

二维数组

二维数组的静态初始化

格式:

1
数据类型[][] 数组名 = new 数据类型[][] {{元素1,元素2},{元素1,元素2}};

范例:

1
int[][] arr = new int[][] {{11,22},{33,44}};
  • 简化格式: 数据类型[][] 数组名 = {{元素1,元素2},{元素1,元素2}};
  • 范例: 数据类型[][] 数组名 = {{元素1,元素2},{元素1,元素2}};

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package twoDimension;

public class twoDimensionDemo1 {
public static void main(String[] args) {
//一维数组的静态初始化格式
// 数据类型[][] 数组名 = new 数据类型[][] {{元素1,元素2}.{元素1,元素2}};
int[][] arr1 = new int[][]{{1,2,3},{4,5,6,7,8,9}};
int[][] arr2 = {{1,2,3},{4,5,6,7,8,9}};
int[][] arr3 = {
{1,2,3},
{4,5,6,7,8,9}
};
//2.获取元素
System.out.println(arr1[0][0]);
System.out.println(arr1[0][2]);
//3.遍历二维数组
for (int i = 0; i < arr3.length; i++) {
for (int i1 = 0; i1 < arr3[i].length; i1++) {
System.out.print(arr3[i][i1] + " ");
}
System.out.println();
}
}
}

二维数组的动态初始化

格式:

1
数据类型]]数组名= new数据类型[m][n];

范例:

1
int[][] arr = new int[2][3];

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package twoDimension;

public class twoDimensionDemo2 {
public static void main(String[] args) {
//1.利用动态初始化创建二维数组
int[][] arr = new int [3][5];
//3:表示二维数组长度为3,可以装3个一维数组
//5:表示每一个一维数组的长度都是5,可以装5个int类型的元素


//给二维数组赋值一个元素
arr[0][0] = 10;
//遍历
for (int i = 0; i < arr.length; i++) {
for (int i1 = 0; i1 < arr[i].length; i1++) {
System.out.print(arr[i][i1] + " ");
}
System.out.println();
}
}
}

方法

  • 方法( method)是程序中最小的执行单元。

**方法的定义:**把一些代码打包在一起,该过程称为方法的定义

**方法的调用:**方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用。

最简单的方法的定义和调用

定义

格式:

1
2
3
public static void 方法名(){
方法体(就是打包起来的代码);
}

范例:

1
2
3
public static void playGame ( ) {
七个打印语句;
}

调用

格式:

1
方法名();

范例:

1
playGame();

注意:方法必须先定义后调用,否则程序将报错

带参数的方法的定义和调用

定义

单个参数:

1
2
3
public static void 方法名(参数){
...
}

多个参数:

1
2
3
public static void 方法名(参数1,参数2,参数3){
...
}

调用

单个参数:

1
方法名(参数);

范例:

1
2
3
method(10);

method(变量);

多个参数:

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

范例:

1
2
getSum(10,20);
getSum(变量1,变量2);

注意:方法调用时,参数的数量与类型必须与方法定义中小括号里面的变量一一对应,否则程序将报错。

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package method;

import java.util.Scanner;

public class methodDemo2 {
public static void main(String[] args) {
//目标:掌握带参数方法定义的格式和调用格式
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数字");
int num1 = sc.nextInt();
System.out.println("请输入第二个数字");
int num2 = sc.nextInt();
getSum(num1,num2);
}
public static void getSum(int num1, int num2){
System.out.println("两个数的和为:" + (num1 + num2));
}
}

形参和实参

  • 形参:全称形式参数,是指方法定义中的参数
  • 实参:全称实际参数,方法调用中的参数

注意:方法调用时,形参和实参必须一一对应,否则程序将报错。

带返回值的方法的定义和调用

什么是返回值?

  • 方法的返回值其实就是方法的运行结果。

定义

格式:

1
2
3
4
public static 返回值类型 方法名(参数1){
方法体;
return 返回值;
}

范例:

1
2
3
4
public static int getSum(int a,int b){
int c = a + b;
return c;
}

调用

直接调用:

1
方法名(实参);

复制调用:

1
整数类型 变量名 = 方法名(实参);

输入调用:

1
System.out.println(方法名(实参));

什么时候用到有返回值的方法?

在调用处要根据方法的结果,去编写另外一段代码。

方法的注意事项

  • 方法不调用就不执行
  • 方法与方法之间是平级关系,不能互相嵌套定义
  • 方法的编写顺序和执行顺序无关
  • 方法的返回值类型为void,表示该方法没有返回值。没有返回值的方法可以省略return语句不写。如果要编写return,后面不能跟具体的数据。
  • return语句下面,不能编写代码,因为永远执行不到,属于无效的代码

关于return:

  • 方法没有返回值:可以省略不写。如果书写,表示结束方法
  • 方法有返回值:必须要写。表示结束方法和返回结果

方法的重载

  • 在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。
  • 每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系

**简单记:**同一个类中,方法名相同,参数不同的方法。与返回值无关。

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package method;

public class methodTest7 {
public static void main(String[] args) {
/*需求:
使用方法重载的思想,设计比较两个整数是否相同的方法。
要求:兼容全整数类型( byte,short,int,long)
*/
compare(20,20);
}
public static void compare(byte num1,byte num2){
System.out.println(num1 == num2);
}
public static void compare(short num1,short num2){
System.out.println(num1 == num2);
}
public static void compare(int num1,int num2){
System.out.println(num1 == num2);
}
public static void compare(long num1,long num2){
System.out.println(num1 == num2);
}

}

类和对象

什么是类?

是共同特征的描述(设计图);

什么是对象?

是真实存在的具体实例。

如何得到对象?

1
2
3
4
5
6
public class 类名{

1.成员变量(代表属性的,一般是名词)
2、成员方法(代表行为的,一般是动词)

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Classes;

public class GirlFriend {
//属性
String name;
int age;
String gender;
//行为
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}

创建对象:

1
类名 对象名 = new 类名();

拿到对象能做什么?

  • 对象.成员变量
  • 对象.成员方法(…)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Classes;

public class GirlFriendTest {
public static void main(String[] args) {
//创建女朋友的对象
GirlFriend gf1 = new GirlFriend();
gf1.name = "红豆";
gf1.age = 18;
gf1.gender = "female";
System.out.println(gf1.name);
System.out.println(gf1.age);
System.out.println(gf1.gender);
gf1.eat();
gf1.sleep();
}
}

定义类的注意事项

  • 用来描述一类事物的类,专业叫做:Javabean类。

    在Javabean类中,是不写main方法的。

  • 在以前,编写main方法的类,叫做测试类。

    我们可以在测试类中创建javabean类的对象并进行赋值调用。

private关键字

  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 被private修饰的成员只能在本类中才能访问

用private关键字优化上面demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package Classes;

public class GirlFriend {
//属性
private String name;
private int age;
private String gender;
//针对与每一个私有化的成员变量,都要提供get和set方法
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值

//作用:给成员变量name进行赋值的
public void setName(String n){
name = n;
}

//作用:对外提供name属性
public String getName(){
return name;
}

public void setAge(int a) {

if(a >= 18 && a <= 50){
age = a;
}else {
System.out.println("非法参数");
}
}
public int getAge(){
return age;
}

public void setGender(String c){
gender = c;
}

public String getGender(){
return gender;
}

//行为
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Classes;

public class GirlFriendTest {
public static void main(String[] args) {
//创建女朋友的对象
GirlFriend gf1 = new GirlFriend();
gf1.setName("红豆");
gf1.setAge(18);
gf1.setGender("女");
System.out.println(gf1.getName());
System.out.println(gf1.getAge());
System.out.println(gf1.getGender());
gf1.eat();
gf1.sleep();
}
}

this关键字

**this的作用:**区分局部变量和成员变量

**this的本质:**所在方法调用者的地址值

image-20240201221017911

用this关键字优化上面代码的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package Classes;

public class GirlFriend {
//属性
private String name;
private int age;
private String gender;
//针对与每一个私有化的成员变量,都要提供get和set方法
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值

//作用:给成员变量name进行赋值的
public void setName(String name){
this.name = name;
}

//作用:对外提供name属性
public String getName(){
return name;
}

public void setAge(int age) {

if(age >= 18 && age <= 50){
this.age = age;
}else {
System.out.println("非法参数");
}
}
public int getAge(){
return age;
}

public void setGender(String gender){
this.gender = gender;
}

public String getGender(){
return gender;
}

//行为
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}

构造方法的格式

1
2
3
4
5
6
7
public class 类名{

修饰符 类名(参数){
方法体;
}

}
  • 方法名与类名相同,大小写也要一致
  • 方法没有返回值类型,连void都没有
  • 没有具体的返回值(不能由retrun带回结果数据)

构造方法的定义

  • 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
  • 如果定义了构造方法,系统将不再提供默认的构造方法

构造方法的重载

  • 带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载

推荐的使用方式

  • 无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法

构造方法的作用?

  • 创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的。

构造方法有几种,各自的作用是什么?

  • 无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
  • 有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。

标准的JavaBean类

  1. 类名需要见名知意
  2. 成员变量使用private修饰
  3. 提供至少两个构造方法
    • 无参构造方法
    • 带全部参数的构造方法
  4. 成员方法
    • 提供每一个成员变量对应的setXxx()/getXxx()
    • 如果还有其他行为,也需要写上

键盘录入

第一套体系

  • nextInt(); 接收整数
  • nextDouble(); 接收小数
  • next(); 接收字符串

个人认为类似c语言中的scanf

**第一套体系的特点:**遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了

第二套体系

  • nextLine; 接收字符串

**第二体系的特点:**可以接收空格,制表符,遇到回车才停止接受数据

字符串

字符串比较:

  • boolean equals方法(要比较的字符串) 完全一样结果才是true,否则为false
  • boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Stringcompare {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = "Abc";
System.out.println(s1 == s2);

boolean result = s1.equals(s2);
System.out.println(result);

boolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result2);
}
}

字符串的截取:

  • 返回Sting类型的substring(int start,int end) 方法 (包头不包尾)表示截取从start开始到end的字符
  • 返回Sting类型的substring(int num) 方法 表示截取num以后的所有字符

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package String;

public class subString {
public static void main(String[] args) {
String phonenum = "12345678910";
//接取手机号前三位
String start = phonenum.substring(0,3);
System.out.println(start);
//接取手机号后四位
String end = phonenum.substring(7);
System.out.println(end);
}
}

字符串替换:

  • 返回Sting类型的replace(旧值,新值) 方法

Demo1

1
2
3
4
5
6
7
8
package String;

public class replace {
public static void main(String[] args) {
String talk = "你玩的真好啊!TMD!";
System.out.println(talk.replace("TMD","***"));
}
}

Demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package String;

public class replace {
public static void main(String[] args) {
String talk = "CNMD你这个SB玩的真好啊!TMD!";

String[] ku = {"TMD","SB","MLGB","CNMD"};
for (int i = 0; i < ku.length; i++) {
talk = talk.replace(ku[i],"***");
}
System.out.println(talk);
}
}

StringBuilder

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

  • **作用:**提高字符串的操作效率

image-20240203164606552

StringBuilder常用方法

方法名 说明
public StringBuilder append(任意类型) 添加数据,并返回对象本身
public StringBuilder reverse() 反转容器中的内容
public int length() 返回长度(字符出现的个数)
public String toString(任意类型) 通过toSting()就可以实现吧StringBulider转换为String

StingJoiner

StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。

  • **作用:**提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用(JDK 8 之后才有的)

image-20240203171614687

StringJoiner的成员方法

方法名 说明
pubilc StingJoiner add(添加的内容) 添加数据,并返回对象本身
public int length() 返回长度(字符出现的个数)
public String toString() 返回一个字符串(该字符串就是拼接之后的结果)

Demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package StringJoiner;

import java.util.StringJoiner;

public class StringJoinerDemo1 {
public static void main(String[] args) {
//创建一个对象并制定中间的间隔符号.
StringJoiner sj = new StringJoiner("---");
sj.add("a");
sj.add("1");
sj.add("8");
sj.add("6");
sj.toString();
System.out.println(sj);
}
}

Demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package StringJoiner;

import java.util.StringJoiner;

public class StringjoinerDemo2 {
public static void main(String[] args) {
//定义变量并制定开始和中间间隔的符号
StringJoiner sj = new StringJoiner(",","{","}");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
sj.toString();
System.out.println(sj);
}
}

集合

ArrayList成员方法:

方法名 说明
boolean add(E e) 添加元素,返回值表示是否添加成功
boolean remove(E e) 删除指定元素,返回值表示是否删除成功
E remove(int index) 删除指定索引的元素,返回被删除元素
E set(int index,E e) 修改指定索引下的元素,返回原来的元素
E get(int index) 获取指定索引的元素
int size() 集合的长度,也就是集合中元素的个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package Arraylist;

import java.util.ArrayList;

public class ArrayListDemo2 {
public static void main(String[] args) {
/*
boolean add(E e) 添加

boolean remove(E e) 删除
E remove(int index)

E set(int index,E e) 修改

E get(int index) 查询
int size() 获取长度
*/


//1.创建一个集合
ArrayList<String> list = new ArrayList<>();

//2.添加元素
boolean result = list.add("aaa");//list.add返回布尔类型的结果.表示是否添加成功
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
System.out.println(result);
System.out.println(list);

//3.删除元素
boolean result1 = list.remove("aaa");//list.remove返回布尔类型的结果表示是否删除成功
System.out.println(result1);
String str = list.remove(0);//根据索引删除数据,并返回被删除的数据
System.out.println(str);
System.out.println(list);

//4.修改元素
String result2 = list.set(0,"zzz");//删除索引处的元素,并返回被删除的元素
System.out.println(result2);

//5.查询元素
String s = list.get(0);
System.out.println(s);//查询集合中某处的元素

//6.获取长度
int length = list.size();
System.out.println(length);
}
}

基本数据类型对应的包装类

基本数据类型 其对应的包装类
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
boolean Boolean

集合和数组的对比:

  • 长度
    • 数组长度固定
    • 集合长度可变
  • 存储类型
    • 数组可以既可以存基本数据类型也可以存引用数据类型
    • 集合可以存引用数据类型,但是如果要存基本数据类型则要将其变成”包装类”

集合遍历demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package Arraylist;

import java.util.ArrayList;

public class ArrayListTest1 {
public static void main(String[] args) {
/*需求:
定义一个集合,添加字符串,并进行遍历
遍历格式参照:[元素1,元素2,元素3]
*/

//1.创建集合
ArrayList<String> list = new ArrayList<>();

//2.添加元素
list.add("不听不听");
list.add("就玩福星");
list.add("福星福星");
list.add("神志不清");
list.add("塔姆带福");
list.add("思路全无");

//3.遍历
System.out.print("[");
for (int i = 0; i < list.size(); i++) {
if(i == list.size() - 1){
System.out.print(list.get(i));
}else {
System.out.print(list.get(i) + ",");
}
}
System.out.println("]");
}
}

static

static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量

  • 被static修饰的成员变量,叫做静态变量
  • 被static修饰的成员方法,叫做静态方法

静态变量

特点:

  • 被该类所有对象共享
  • 不属于对象,属于类
  • 随着类的加载而加载, 优先与对象存在

调用方式:

  • 类名调用(推荐)
  • 对象名调用

静态方法

特点:

  • 多用在测试类和工具类中
  • Javabean类中很少会用

调用方式:

  • 类名调用(推荐)
  • 对象名调用

工具类

能帮我们做一些事情的, 但是不描述任何事物的类

static的注意事项

  • 静态方法只能访问静态变量和静态方法
  • 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
  • 静态方法中午this关键字

继承

  • Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。

    1
    public class student extends Person {}
  • Student称为子类(派生类),Person称为父类(基类或超类)。

继承的格式:

1
public class子类extends父类{}

使用继承的好处:

可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性。

继承后子类的特点?

子类可以得到父类的属性和行为,子类可以使用。

注意事项:

  • Java只能单继承,不能多继承、但是可以多层继承。

  • Java中所有的类都直接或者间接继承于Object类。

  • 子类只能访问父类中非私有的成员

  • 子类只能访问父类中非私有的成员

继承中成员方法的访问特点:

  • this调用:就近原则。

  • super调用:直接找父类。

什么是方法重写?

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类的这个方法是重写的方法。

方法重写建议加上哪个注解,有什么好处?

@override 注解可以校验重写是否正确,同时可读性好。

方法重写的注意事项

  1. 重写方法的名称、形参列表必须与父类中的一致。
  2. 子类重写父类方法时,访问权限子类必须大于等于父类
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类
  4. 建议:重写的方法尽量和父类保持一致。
  5. 只有被添加到虚方法表中的方法才能被重写

多态

什么是多态?

同类型的对象,表现出的不同形态。

多态的表现形式

1
父类类型对象名称=子类对象;

多态的前提

  • 有继承关系
  • 有父类引用指向子类对象
  • 有方法的重写

多态的好处

使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

Demo:

父类Person:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Person {
private String name;
private int age;

public Person() {
}

public Person(String name, int age) {

this.name = name;
this.age = 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;
}
public void show(){
System.out.println(name + ". " + age + "岁");
}
}

子类,Student、Teacher、administrator

1
2
3
4
5
6
public class Student extends Person{
@Override
public void show(){
System.out.println("学生的信息为: " + getName() + ", " + getAge());
}
}
1
2
3
4
5
6
7
public class Teacher extends Person{
@Override
public void show(){
System.out.println("老师的信息为: " + getName() + ", " + getAge());
}

}
1
2
3
4
5
6
public class administrator extends Person{
@Override
public void show(){
System.out.println("管理员的信息为: " + getName() + ", " + getAge());
}
}

Test类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test {
public static void main(String[] args) {
//创建三个对象,并调用register方法
Student s = new Student();
s.setName("zhangsan");
s.setAge(18);
Teacher t = new Teacher();
t.setName("aTai");
s.setAge(38);
administrator a = new administrator();
a.setName("liumou");
a.setAge(30);

register(s);
register(t);
register(a);
}

//这个方法技能接收老师,又能接收学生,还能接收管理员
//只能把参数写成这三个类型的父类
public static void register(Person p){
p.show();
}
}

多态中成员的特点

  • 变量调用:编译看左边,运行也看左边
  • 方法调用:编译看左边,运行看右边

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package polymorphismDemo2;

public class Test {
public static void main(String[] args) {
//创建对象(多态方式)
//Fu f = new Zi();
Animal a = new Dog();
//调用成员变量:编译看左边
//编译看左边: javac 编译代码的时候,会看左边父类中有没有这个变量,如果有,编译成功,如果没有编译失败
//运行也看左边: java运行代码的时候,实际获取的就是左边父类中成员变量的值
System.out.println(a.name);

//调用成员方法:编译看左边.运行看右边
//编译看左边:javac编译代码的时候.会看左边的父类中有没有这个方法,如果有,编译成功.如果没有,编译失败.
//运行看右边:java运行代码的时候,实际上运行的是子类中的方法
a.show();
//理解:
//Animal a = new Dog();
//现在用a去调用变量和方法的呀? 是的
//而a 是Animal类型的,所以默认都会从Animal这个类中去找

//成员变量:在子类的对象中,会把父类的成员变量也继承下的.父: name 子: name
//成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
}
static class Animal{
String name = "动物";
public void show(){
System.out.println("Animal --- show方法");
}
}
static class Dog extends Animal{
String name = "狗";
public void show(){
System.out.println("Dog --- show方法");
}
}
static class Cat extends Animal{
String name = "猫";
public void show(){
System.out.println("Cat --- show方法");
}
}
}

多态的优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护

    image-20240325182835397

  • 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

多态的弊端

  • 不能使用子类的特有方法
  • 若要使用要进行数据类型转换
    • 自动类型转换
    • 强制类型转换
  • 强制类型转换能解决什么问题?
    • 可以转换成真正的子类类型,从而调用子类独有功能。
    • 转换类型与真实对象类型不一致会报错
    • 转换的时候用Instanceof关键字进行判断

什么是包?

  • 包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。

使用其它类的规则

  • 使用同一个包中的类时,不需要导包。

  • 使用java.lang包中的类时,不需要导包。

  • 其他情况都需要导包

  • 如果同时使用两个包中的同名类,需要用全类名。

final关键字

  • 如果用final修饰方法:表明该方法是最终方法,不能被重写
  • 如果用final修饰类:表明该类是最终类,不能被继承
  • 如果用final修饰变量:叫估常量,只能被赋值一次

权限修饰符

  • 权限修饰符:是用来控制一个成员能够被访问的范围的。
  • 可以修饰成员变量,方法,构造方法,内部类。

权限修饰符的分类:

有四种,作用分为由小到大分为:(private < 空着不写 < protected < public)

修饰符 同一个类中 同一个包中其它类 不同包下的子类 不同包下的无关类
private
空着不写
protected
public

权限修饰符的使用规则

实际开发中,一般只用private和public

  • 成员变量私有
  • 方法公开

**特例:**如果方法中的代码是抽取其他方法中共性代码.这个方法一般也私有

代码块

分类:

  • 局部代码块
    • 作用提前结束变量的生命周期(已淘汰)
  • 构造代码块
    • 抽取构造方法中的重复代码(不够灵活)
  • 静态代码块
    • **格式:**static{}
    • **特点:**需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
    • **使用场景:**在类加载的时候,做一些数据初始化的时候使用。

抽象类

  • 抽象类∶如果一个类中存在抽象方法,那么该类就必须声明为抽象类
  • 抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

抽象类的定义格式:public abstract class 类名{}

抽象方法的定义格式:public abstract 返回值类型 方法名(参数列表);

抽象类的作用:

  • 抽取共性时,无法确定方法体,就把方法定义为抽象的。
  • 强制让子类按照某种格式重写。

抽象类和抽象方法的注意事项:

  • 抽象类不能实例化(皇家翻译: 抽象类不能创建对象)
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类可以有构造方法
  • 抽象类的子类
    • 要么重写抽象类中的所有抽象方法(更多采用)
    • 要么是抽象子类

接口

接口的定义和使用

  • 接口用关键字interface来定义

    public interface 接口名{}

  • 接口不能实例化(皇家翻译: 接口不能创建对象)

  • 接口和类之间是实现关系,通过implements关键字表示

    public class 类名 implements 接口名 {}

  • 接口的子类(实现类)

    在实现类中

    • 要么重写接口中所有的抽象方法(更多使用)
    • 要么是抽象类

注意:

  • 接口和类的实现关系.可以单实现,也可以多实现。

    public class 类名 implements 接口名1, 接口名2 {}

  • 实现类还可以在继承一个类的同时实现多个接口

    public class 类名 extends 父类 implements 接口名1, 接口名2{}

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
父类Animal

package interfaceDemo1;

public abstract class Animal {
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;
}

public Animal(String name, int age) {
this.name = name;
this.age = age;
}

public Animal() {
}
public abstract void eat();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
子类青蛙:
package interfaceDemo1;

public class Frog extends Animal implements Swim{

@Override
public void eat() {
System.out.println("青蛙再吃虫子");
}

public Frog(String name, int age) {
super(name, age);
}

public Frog() {
}

@Override
public void swim() {
System.out.println("青蛙在蛙泳");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
子类兔子

package interfaceDemo1;

public class Rabbit extends Animal{

public Rabbit(String name, int age) {
super(name, age);
}

public Rabbit() {
}

@Override
public void eat() {
System.out.println("兔子再吃胡萝卜");
}
}

1
2
3
4
5
6
7
游泳接口:
package interfaceDemo1;

public interface Swim {
public abstract void swim();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
测试类:
package interfaceDemo1;

public class Test {
public static void main(String[] args) {
//创建青蛙对象
Frog f = new Frog("GuaGua",1);
System.out.println(f.getName() + ", " + f.getAge());
f.eat();
f.swim();

//创建兔子对象
Rabbit r = new Rabbit("xiaobai",3);
System.out.println(r.getName() + ", " + r.getAge());
r.eat();
//r.swim; //会报错
}
}

接口中成员的特点

  • 成员变量
    • 只能是常量
    • 默认修饰符: public static final
  • 构造犯法
    • 接口中没有构造方法
  • 成员方法
    • 只能是抽象方法
    • 默认修饰符:public abstract
    • JDK7以前:接口中只能定义抽象方法。
    • JDK8的新特性:接口中可以定义有方法体的方法。
    • JDK9的新特性︰接口中可以定义私有方法。

接口和类之间的关系

  • 类和类的关系
    • 继承关系,只能单继承,不能多继承,但是可以多层继承
  • 类和接口的关系
    • 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系
    • 继承关系,可以单继承,也可以多继承
    • **注意:**如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法

JDK8以后接口中新增的方法

  • 允许在接口中定义默认方法,需要使用关键字default修饰
    • 作用:解决接口升级的问题
  • 允许在接口中定义定义静态方法,需要用static修饰

接口中默认方法的定义格式:

  • 格式:public default 返回值类型 方法名(参数列表){}
    • 范例: public default void show(){}

接口中静态方法的定义格式:

  • 格式:public static 返回值类型 方法名(参数列表){}
    • 范例:public static void show(){}

接口中默认方法的注意事项:

  • 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
  • public可以省略,default不能省略
  • 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

接口中静态方法的注意事项:

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
  • public可以省略,static不能省略

JDK9以后接口中新增的方法

JDK9以后接口中新增了私有方法

接口中私有方法的定义格式:

  • 格式1:private 返回值类型 方法名(参数列表){} //这种方法服务于默认方法
    • 范例1: private void show(){}
  • 格式2:private static 返回值类型 方法名 (参数列表){} ////这种方法服务于静态方法
    • 范例2 : private static void method(){}

总结

  • 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
  • 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。

内部类

类的五大成员:

属性、方法、构造方法、代码块、内部类

什么是内部类?

  • 在一个类的里面,在定义一个类

    • 举例:在A类的内部定义B类,B类就被称为内部类

      1
      2
      3
      4
      5
      public class Outer{                   //外部类
      public class Inner{ //内部类

      }
      }

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类成员,必须创建对象

一个内部类demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package InclassDemo1;

public class Car {
private String carName;
private int carAge;
private String carColor;

public String getCarName() {
return carName;
}

public void setCarName(String carName) {
this.carName = carName;
}

public int getCarAge() {
return carAge;
}

public void setCarAge(int carAge) {
this.carAge = carAge;
}

public String getCarColor() {
return carColor;
}

public void setCarColor(String carColor) {
this.carColor = carColor;
}

public Car(String carName, int carAge, String carColor) {
this.carName = carName;
this.carAge = carAge;
this.carColor = carColor;
}

public Car() {
}

public void show(){
System.out.println(carName);
Engine e = new Engine();

System.out.println(e.engineName);
}
class Engine{
String engineName;
int engineAge;

public void show(){
System.out.println(engineName);
System.out.println(carName);
}
}
}

内部类分类

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

  • 写在成员位置的,属于外部类的成员.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Car{
    String carName;
    int carAge;
    int carColor;
    class Engine{
    String engineName;
    int engineAge;
    }
    }
  • 成员内部类可以被一些修饰符所修饰,比如: private, 默认(空着不写), protected(本包和其他包中的子类使用), public static等

  • 在成员内部类里面,JDK16之前不能定义静态变量, JDK 16才开始可以定义静态变量

创建成员内部类的对象

方式一:

  • 在外部类中编写方法,对外提供内部类的对象

方式二:

  • 直接创建格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
  • 范例: Outer.Inner oi = new Outer().new Inner();

成员内部类如何获取外部类的成员变量

  • 对于变量名字不同的,直接用即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package InclassDemo2;

    public class Outer {
    private int a = 10;
    class Inner{
    private int b =20;
    public void show (){
    int c = 30;
    System.out.println(a);//要求打印10
    System.out.println(b);//要求打印20
    System.out.println(c);//要求打印30
    }
    }
    }


  • 对于变量名字相同的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package InclassDemo2;

    public class Outer {
    private int a = 10;
    class Inner{
    private int a =20;
    public void show (){
    int a = 30;
    System.out.println(Outer.this.a);//要求打印10
    System.out.println(this.a);//要求打印20
    System.out.println(a);//要求打印30
    }
    }
    }

静态内部类

  • 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建外部类的对象。
  • 城建静态内部类对象的格式:
    • 外部类名.内部类名 对象名 = new 外部类名.内部类名();
  • 调用静态党发的格式:
    • 外部类名.内部类名.方法名();

注意事项:

  1. 静态内部类也是成员内部类中的一种
  2. 静态内部类只能访问外部类中的静态变量和静态方法

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package InnerClassDemo3;

public class Outer {
int a = 10;
static int b = 20;
static class Inner{
public void show1(){
System.out.println("非静态的方法被调用了");
}
public static void show2(){
System.out.println("静态的方法被调用了");
}
}
}

test类

1
2
3
4
5
6
7
8
9
package InnerClassDemo3;

public class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner();
oi.show1();
Outer.Inner.show2();
}
}

局部内部类

  1. 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
  2. 外界是无法直接使用,需要在方法内部创建对象并使用。
  3. 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package InnerClassDemo4;

public class Outer {
int b = 20;
public void show(){
int a = 10;
class Inner{
String name;
int age;
public void method(){
System.out.println(b);
System.out.println(a);
System.out.println("局部有内部类中的method方法");
}
public static void method2(){
System.out.println("局部有内部类中的method2静态方法");
}

}
Inner i = new Inner();
System.out.println(i.name);
System.out.println(i.age);
i.method();
Inner.method2();

}
}

1
2
3
4
5
6
7
8
9
10
package InnerClassDemo4;


public class Test {
public static void main(String[] args) {
Outer o = new Outer();
o.show();
}
}

匿名内部类

  • 匿名内部类本质上就是隐藏了名字的内部类。

    1
    2
    3
    4
    格式:
    new 类名或者接口名() {
    重写方法;
    };
    1
    2
    3
    4
    5
    6
    举例:
    new Inter(){
    public void show(){

    }
    }

常用API

Math

  • 是一个帮助我们用于进行数学计算的工具类

Math中常用的方法

方法名 说明
abs(int a) 获取参数的绝对值 abs(-1) => 1
ceil(double b) 向上取整 1.1 => 2
floor(double b) 向下取整 1.7=>1
round(float a) 四舍五入
max(int a, int b) 取两个整数的最大值 max(2,3) = >3
pow(double a, double b) 求a的b次幂 pow(2,3) = >8.0
random() 返回值为double的随机值,范围[0.0, 1.0)
min(int a, int b) 取两个整数的最小值 min(2,3)=>0
sqrt(double b), cbrt(double b) sqrt开平方,cbrt开立方 sqrt(4) => 2, cbrt(27)=>3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class MathDemo1 {
public static void main(String[] args) {
//abs
//int -2147483648~2147483647
//存在bug,如果没有正数和负数对应,那么传递负数结果有误
System.out.println(Math.abs(-88));//88
System.out.println(Math.abs(-2147483648));//-2147483648
//absExact 数据过长会报错
// System.out.println(Math.absExact(-2147483648));
//celi
//进一法,往数轴的正方向取整
System.out.println(Math.ceil(1.1));//2.0
System.out.println(Math.ceil(-1.1));//-1.0
//floor
//去尾法,往数轴的负方向取整
System.out.println(Math.floor(1.8));//1
System.out.println(Math.floor(-1.8));//-2.0
//round
System.out.println(Math.round(1.5));//2
System.out.println(Math.round(1.4));//1
System.out.println(Math.round(-1.6));//-2
System.out.println(Math.round(-1.4));//-1
//max
System.out.println(Math.max(1.8,3.8));//3.8

//min
//获取两个整数中的较小值
System.out.println(Math.min(3.8,9.1));//3.8
//pow
//细节: 如果第二个数是0~1之间的小数,那么就是开根号了
System.out.println(Math.pow(2,3));//8.0
System.out.println(Math.pow(4,0.5));//2.0
//sqrt开平方
//cbrt开立方
System.out.println(Math.sqrt(16));//4
System.out.println(Math.cbrt(27));//3

//random
System.out.println(Math.random());//范围[0.0, 1.0)

}
}

System

  • System也是一个工具类,提供了一些与系统相关的方法
方法名 说明
exit(int status) 终止当前运行的Java虚拟机
currentTimeMillis() 返回当前系统的时间的毫秒值形式
arraycopy(数据源数组,起始索引,目的数组,起始索引,拷贝个数) 数组拷贝

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SystemDemo1 {
public static void main(String[] args) {
//currentTimeMillis 返回当前时间的毫秒值
System.out.println(System.currentTimeMillis());

//arraycopy 数组拷贝
int[] arr1 ={1,2,3,4,5,6,7,8,9};
int[] arr2 = {11,22,33,66,55,44,77,88,99};
System.arraycopy(arr1,0,arr2,0,9);
//验证
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + ", ");
}
//exit
//状态码
//0:程序正常退出
//非0: 程序非正常退出
System.exit(0);
System.out.println("看看我执行了吗?");

}
}

Runtime

  • Runtime表示当前虚拟机的运行环境
方法名 说明
getRuntime() 当前系统的运行环境对象
exit(int status) 停止虚拟机
availableProcessors() 获得CPU的线程数
maxMemory() JVM能从系统中获取总内存的大小(单位byte)
totalMemory() JVM已经从系统中获取的总内存大小(单位byte)
freeMemory() JVM剩余内存大小
exec(String command) 运行cmd命令

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class RuntimeDemo1 {
public static void main(String[] args) throws IOException {
// 1.获取Runtime的对象
Runtime r1 = Runtime.getRuntime();
Runtime r2 = Runtime.getRuntime();
System.out.println(r1 == r2);//true r1和r2获取的是同一个对象,即只存在一个虚拟机

//获取当前CPU的线程数
System.out.println(r1.availableProcessors());

//查看虚拟机能获得的总内存的大小, 单位byte
System.out.println(r1.maxMemory());

//查看虚拟机已经获取的内存大小, 单位byte
System.out.println(r1.totalMemory());

//查看虚拟机剩余内存的大小, 单位byte
System.out.println(r1.freeMemory());

//运行cmd命令 用不了dir
//shutdown : 关机
//加上参数才能运行
// -s : 默认在一分钟后关机
// -s -t 指定时间 : 指定关机时间, 如果"指定时间是3600"则在一小时后关机
// -a : 取消关机操作
// -r : 关机并重启
r1.exec("shutdown -s -t 0");

//exit 可以停止虚拟机
//状态码
//0: 正常停止
// 非 0 ;异常停止
r1.exit(0);
System.out.println("看看我执行了吗?");
}
}

Object

  • Object是Java中的顶级父类。所有的类都直接或间接的继承于Object类。

  • object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法。

构造方法名 说明
Object() 空参构造
  • Object中只有空参构造
成员方法名 说明
toString() 返回对象的字符串表示形式
equals(Object obj) 比较两个对象是否相等
clone(int a) 对象克隆

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ObjectDemo1 {
public static void main(String[] args) {
//toString 返回对象的字符串表示形式
Object obj = new Object();
Object obj1 = new Object();
String str1 = obj.toString();
String str2 = obj1.toString();
System.out.println(str1);//java.lang.Object@4eec7777 "@"前是包名+类名 后面是对象的地址值
System.out.println(str2);
//equals
String s = "abc";
String b = "abc";
StringBuilder sb = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(s.equals(b));
System.out.println(s.equals(sb));
//因为equals方法是被s调用的,而s是字符串所以equals要看string类中的
//字符串中的equals方法,先判断参数是否为字符串'如果是字符串,再比较内部的属性
//但是如果参数不是字符串,直接返回false
System.out.println(sb.equals(s));
System.out.println(sb.equals(sb2));
///因为equals方法是被sb调用的,而sb是stringBuilder所以这里的equals方法要看stringBuilder中的equals方法
// 那么在StringBuilder当中,没有重写equals方法
///使用的是object中的
///在object当中默认是使用==号比较两个对象的地址值
///而这里的s和sb记录的地址值是不一样的,所以结果返回false
}
}

BigInteger

BigInteger常见构造方法

构造方法 说明
BigInteger(int num,Random rnd) 获取随机最大整数,范围[0 , 2的num次方 - 1]
BigInteger(String val) (字符串val必须是整数) 获取指定的大整数
BigInteger(String val , int radix) 获取指定进制的大整数
静态方法:public static BigInteger valueOf(long) 静态方法获取BigInteger的对象,内部有优化

BigInteger构造方法小结

  • 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
  • 如果BigInteger表示的超出long的范围,可以用构造方法获取。
  • 对象一旦创建,BigInteger内部记录的值不能发生改变。
  • 只要进行计算都会产生一个新的BigInteger对象

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class BigIntergerDemo1 {
public static void main(String[] args) {
//获取一个随机的大整数,范围[0 , 2的4次方-1] => [0, 15]
BigInteger bi = new BigInteger(4,new Random());
System.out.println(bi);

//获取一个指定的大整数
BigInteger bi2 = new BigInteger("100000000000000000000");
System.out.println(bi2);

//获取指定进制的大整数
BigInteger bi3 = new BigInteger("100",10); // 十进制的100
System.out.println(bi3);
BigInteger bi4 = new BigInteger("100",2);
System.out.println(bi4);//将2进制的100转换成10进制的4并打印出来
}
}

BigInteger常见成员方法

方法名 说明
add(BigInteger val) 加法
subtract(BigInteger val) 减法
multiply(BigInteger val) 乘法
divide(BigInteger val) 除法,获取商
divideAndRemainder(BigInteger val) 除法,获取商和余数
max/min(BigInteger val) 返回最大值,最小值
intValue(BigInteger val) 转为int类型整数,超出范围数据有误
equals(Object x) 比较是否相同
pow(int exponent) 次幂

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.math.BigInteger;

public class BigIntegerDemo2 {
public static void main(String[] args) {

//创建两个BigInteger对象
BigInteger bi1 = BigInteger.valueOf(10);
BigInteger bi2 = BigInteger.valueOf(5);

//加法
BigInteger bi3 = bi1.add(bi2);
System.out.println(bi3);

//除法,获取商和余数
BigInteger[] arr1 = bi1.divideAndRemainder(bi2);
System.out.println(arr1.length);//2 商和余数
System.out.println(arr1[0]); //2 商
System.out.println(arr1[1]); //0 余数

//equals BigInteger中的equals比较的是值,不是地址值
System.out.println(bi1.equals(bi2)); // false 不相同
bi2 = BigInteger.valueOf(10);
System.out.println(bi1.equals(bi2)); // true 相同

//pow次幂
System.out.println(bi1.pow(2));//100 10的平方

// max/min
System.out.println(bi1.max(bi3));// 15 返回最大值
System.out.println(bi1.min(bi3));// 10 返回最大值

//intValue()转为int类型的整数,超出范围数据有误
int i = bi1.intValue();
System.out.println(i); // 10
BigInteger bi4 = BigInteger.valueOf(9999999999999999L);
int i1 = bi4.intValue();
System.out.println(i1); // 1874919423 超出int类型范围,数据有误

//longValue()转为long类型的整数
long l = bi4.longValue();
System.out.println(l);// 9999999999999999

//doubleValue()转为double类型的小数
double v = bi1.doubleValue();
System.out.println(v); // 10.0

}
}

BigDecimal

  • 用于小数的精确计算
  • 用来表示很长的小数

BigDecimal的作用是什么?

  • 表示较长的小数和解决小数运算精度失真问题。

BigDecimal对象获取方法

构造方法 说明
BigDecimal(double val) 通过传递double类型的小数来创建对象(有可能不准确)
BigDecimal(String val) 通过传递字符串类型的小数来创建对象
静态方法 说明
public static BigDecimal valueOf(double val) 通过静态方法获取对象

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.math.BigDecimal;

public class BigDecimalDemo1 {
public static void main(String[] args) {

//通过传递double类型的小数来创建对象
BigDecimal bd1 = new BigDecimal(8.08);//8.0800000000000000710542735760100185871124267578125
BigDecimal bd2 = new BigDecimal(8.01);//8.0099999999999997868371792719699442386627197265625
System.out.println(bd1);
System.out.println(bd2);

//通过传递字符串类型的小数来创建对象
BigDecimal bd3 = new BigDecimal("8.01");
BigDecimal bd4 = new BigDecimal("8.09");
BigDecimal bd5 = bd3.add(bd4);
System.out.println(bd3);//8.01
System.out.println(bd4);//8.09
System.out.println(bd5);//16.10

//通过静态方法获取对象
BigDecimal bd6 = BigDecimal.valueOf(10);
System.out.println(bd6);

/*
如果要表示的数字不大,建议用静态方法
如果要表示的数字比较大,建议用构造方法
.如果我们传递的是0~10之间的整数,包含0,包含10,那么方法会返回已经创建好的对象,不会重新new
*/
}
}

BigDecimal常见成员方法

方法名 说明
public static BigDecimal valueOf(double val) 获取对象
add(BigDecimal val) 加法
subtract(BigDecimal val) 减法
multiply(BigDecimal val) 乘法
divide(BigDecimal val) 除法 (如果除不尽,程序报错)
divide(BigDecimal val, 精确几位, 舍入模式) 除法

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDemo3 {
public static void main(String[] args) {
//加法
BigDecimal bd1 = BigDecimal.valueOf(10.0);
BigDecimal bd2 = BigDecimal.valueOf(2.0);
BigDecimal bd3 = bd1.add(bd2);
System.out.println(bd3); // 12.0

//减法
BigDecimal bd4 = bd1.subtract(bd2);
System.out.println(bd4);//8.0

//乘法
BigDecimal bd5 = bd1.multiply(bd2);
System.out.println(bd5); // 20.00

//除法
BigDecimal bd6 = bd1.divide(bd2);
System.out.println(bd6);//5

//有舍入模式的除法
BigDecimal bd7 = BigDecimal.valueOf(3.0);
// bd1.divide(bd7); //除不尽,程序报错
BigDecimal bd8 = bd1.divide(bd7, 2, RoundingMode.HALF_UP);//RoundingMode.HALF_UP四舍五入
System.out.println(bd8);//3.33
}
}

正则表达式

作用:

  • 校验字符串是否满足规则
  • 在一段文本中查找满足要求的内容

字符类(只匹配一个字符)

说明
[abc] 只能是a,b或c
[^abc] 除了a,b,c之外的任何字符
[a-zA-Z] a 到 z, A 到 Z(范围)
[a-d[m-p]] a 到 d, 或 m 到 p
[a - z && [def]] a 到 z和def的交集。为: d, e, f
[a - z && [^bc]] a 到 z和非bc的交际 ( 等同于[ad-z] )
[a-z&&[^m-p]] a 到 z和除了m到p的交集

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class RegexDemo1 {
public static void main(String[] args) {

System.out.println("-------------1----------------");
String str1 = "a";
System.out.println(str1.matches("[abc]"));//true
System.out.println(str1.matches("[a-c]"));//true
System.out.println(str1.matches("[^a-c]"));//true
System.out.println("ab".matches("[a-c]"));//false 原因: [a-c]只能匹配一个,有两个字符要去匹配两次
System.out.println("ab".matches("[a-c][a-c]"));//true

System.out.println("-------------2----------------");
System.out.println("n".matches("[a-d[m-p]]"));//true
System.out.println("nn".matches("[a-d[m-p]]"));//false
System.out.println("nn".matches("[a-d[m-p]][a-d[m-p]]"));//true

System.out.println("-------------3----------------");
//如果要表示两个范围的交集, 要用 &&
//如果只写一个 & ,则仅仅是表示一个字符 &
System.out.println("a".matches("[a-z&&[def]]"));//false
System.out.println("d".matches("[a-z&&[def]]"));//true
System.out.println("a".matches("[a-z&[def]]"));//true

System.out.println("-------------4----------------");
System.out.println("a".matches("[a-z&&[^def]]"));//true
System.out.println("d".matches("[a-z&&[^def]]"));//false



}
}

预定义字符(只匹配一个字符)

表达式 字符
. 任何字符
\d 一个数字: [0-9]
\D 非数字: [^0-9]
\s 一个空白字符: [\t\n\x0B\f\r]
\S 非空白字符: [^\s]
\w [a-zA-Z_0-9]英文、数字、下划线
\W [^\w]一个非单词字符

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class RegexDemo2 {
public static void main(String[] args) {
System.out.println("-------------1----------------");
//.表示一个任意字符
System.out.println("你".matches("."));//true
System.out.println("你n".matches("."));//false
System.out.println("你n".matches(".."));//true

System.out.println("-------------2----------------");
// \d表示一个数字
System.out.println("9".matches("\\d"));//true
System.out.println("a".matches("\\d"));//false
System.out.println("99".matches("\\d"));//false
System.out.println("99".matches("\\d\\d"));//true

System.out.println("-------------3----------------");
// \D 表示非数字
System.out.println("9".matches("\\D"));//false
System.out.println("a".matches("\\D"));//true
System.out.println("ab".matches("\\D"));//false
System.out.println("ab".matches("\\D\\D"));//true

System.out.println("-------------3----------------");
// \s一个空白字符
System.out.println("\t".matches("\\s"));//true
System.out.println("\t\t".matches("\\s"));//false
System.out.println(" ".matches("\\s"));//true
System.out.println(" ".matches("\\s"));//false

System.out.println("9".matches("\\s"));//false
System.out.println("a".matches("\\s"));//false

System.out.println("-------------4----------------");
// \S非空白字符
System.out.println("\t".matches("\\S"));//false
System.out.println(" ".matches("\\S"));//false
System.out.println("a".matches("\\S"));//true
System.out.println("9".matches("\\S"));//true

System.out.println("-------------5----------------");
// \w [a-zA-Z_0-9]英文、数字、下划线
System.out.println("a".matches("\\w"));//true
System.out.println("A".matches("\\w"));//true
System.out.println("0".matches("\\w"));//true
System.out.println("_".matches("\\w"));//true

System.out.println("-------------5----------------");
// \W 一个非单词字符
System.out.println("&".matches("\\W")); //true
System.out.println("a".matches("\\W")); //false
System.out.println("A".matches("\\W")); //false
System.out.println("0".matches("\\W")); //false
System.out.println("_".matches("\\W")); //false
}
}

数量词(表中的 ‘X’ 代表任意内容)

表达式 说明
X? X,一次或0次
X* X,零次或多次
X+ X,一次或多次
X{n} X,正好n次
X{n, } X,至少n次
X{n, m} X,至少n次但不超过m次

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class RegexDemo3 {
public static void main(String[] args) {
System.out.println("a".matches("[abc]?"));//true 一次或0次
System.out.println("".matches("[abc]?"));//true

System.out.println("aaa".matches("[abc]*"));//true 零次或多次
System.out.println("".matches("[abc]*"));//true

System.out.println("".matches("[abc]+"));//false 一次或多次
System.out.println("a".matches("[abc]+"));//true
System.out.println("aa".matches("[abc]+"));//true

System.out.println("aaa".matches("[abc]{3}"));//true 刚好三次
System.out.println("aaaa".matches("[abc]{3}"));//false
System.out.println("aa".matches("[abc]{3}"));//false

System.out.println("aa".matches("[abc]{3,}"));//false 至少三次
System.out.println("aaa".matches("[abc]{3,}"));//true
System.out.println("aaaa".matches("[abc]{3,}"));//true

System.out.println("aaa".matches("[abc]{3,4}"));//true//至少三次但不超过四次
System.out.println("aaaa".matches("[abc]{3,4}"));//true
System.out.println("aa".matches("[abc]{3,4}"));//false
System.out.println("aaaaa".matches("[abc]{3,4}"));//false


}
}

爬虫

正则表达式的对象:Pattern

文本匹配器对象:Matcher

Pattern常见方法:

(待完善)

Matcher常见方法:

(待完善)

方法名 说明
find() 拿着文本匹配器从头开始读取, 寻找是否有满足规则的字符串.如果没有,方法返回false,如果有,返回true
m.group() 该方法底层会根据find方法记录的索引进行字符串的截取,会把截取的小字符串进行返回

Demo1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package RegexDemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class crawler {
public static void main(String[] args) {
/*有如下文本,请按照要求爬取数据。
Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是ava8和ava11,
因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
要求:找出里面所有的JavaXX
*/
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";


// method1(str);

//1.获取正则表达式的对象,也就是Pattern的对象
Pattern p = Pattern.compile("Java\\d{0,2}");
//2.获取文本匹配器的对象
Matcher m = p.matcher(str);
//3.利用循环
while (m.find()){
String s = m.group();
System.out.println(s);
}



}

private static void method1(String str) {
//Pattern: 表示正则表达式
//Matcher: 文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。在大串中去找符合匹配规则的子串。


//1.获取正则表达式的对象,也就是Pattern的对象
Pattern p = Pattern.compile("Java\\d{0,2}");
//2.获取文本匹配器的对象
//m: 文本匹配器的对象
//str: 大的字符串
//p: 规则
//m要在str中找符号p规则的小的字符串
Matcher m = p.matcher(str);

//拿着文本匹配器从头开始读取, 寻找是否有满足规则的字符串
//如果没有,方法返回false
//如果有,返回true,在底层记录子串的起始索引和结束索引+1
boolean b = m.find();

//该方法底层会根据find方法记录的索引进行字符串的截取
//会把截取的小字符串进行返回
String s1 = m.group();
System.out.println(s1);
}
}

Demo2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package RegexDemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class crawlerTwo {
public static void main(String[] args) {
String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是java8和Java11," +
"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

//定义正则表达式
//? 理解为前面的数据Java
//= 表示后面要跟随的数据
//但是在获取的时候只获取前半部分
// (?i) : 忽略大小写
String regex1 = "((?i)Java)(?=8|11|17)";

//下面两个效果相同
//使用 " : " 时获取数据的时候获取全部
String regex2 = "((?i)Java)(8|11|17)";
String regex3 = "((?i)Java)(?:8|11|17)";

//去掉Java后面后 8/11/17 的数据
String regex4 = "((?i)Java)(?!8|11|17)";

Pattern p = Pattern.compile(regex1);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.print(m.group() + " ");
}
System.out.println();
Pattern p1 = Pattern.compile(regex2);
Matcher m1 = p1.matcher(s);
while (m1.find()) {
System.out.print(m1.group() + " ");
}
System.out.println();
Pattern p2 = Pattern.compile(regex3);
Matcher m3 = p2.matcher(s);
while (m3.find()) {
System.out.print(m3.group() + " ");
}
System.out.println();
Pattern p3 = Pattern.compile(regex4);
Matcher m4 = p3.matcher(s);
while (m4.find()) {
System.out.print(m4.group() + " ");
}

}
}

Demo3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package RegexDemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class crawlerThree {
public static void main(String[] args) {
/*需求1∶按照ab+的方式爬取ab,b尽可能多获取
需求2:按照ab+的方式爬取ab,b尽可能少获取
*/
String s ="Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +
"经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";


//贪婪爬取 (Java默认)
String regex = "ab+";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while (m.find()){
System.out.println(m.group());
}

//非贪婪爬取 (在 " + " 后面加一个问号就行了)
String regex1 = "ab+?";
Pattern p2 = Pattern.compile(regex1);
Matcher m2 = p2.matcher(s);
while (m2.find()){
System.out.println(m2.group());
}
}
}

正则表达式在字符串方法中的使用:

方法名 说明
matches(String regex) 判断字符串是否满足正则表达式规则
replaceAll(String regex, String newstr) 按照正则表达式规则进行替换
split(String regex) 按照正则表达式的规则切割字符串

Demo4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package RegexDemo;

public class crawlerFour {
public static void main(String[] args) {
/*有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠
要求1:把字符串中三个姓名之间的字母替换为vs
要求2:把字符串中的三个姓名切割出来
*/

String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";
String result1 = s.replaceAll("[\\w && [^_]]+", "vs");
System.out.println(result1);

String[] s1 = s.split("[\\w &&[^_]]+");
for (int i = 0; i < s1.length; i++) {
System.out.println(s1[i]);
}
}
}

捕获分组

后续还要继续使用本组的数据

可以获取每组中的内容反复使用。

  • 正则内部使用:\\组号
  • 正则外部使用: $组号

组号特点:

  • 从1开始, 连续不间断
  • 以左括号为基准,最左边的是第一组,

非捕获分组

分组之后不需要再用本组数据,仅仅是把数据括起来。(不占用组号)

符号 含义 举例
(? : 正则) 获取所有 Java(?:8|11|17)
(? = 正则) 获取前面的部分 Java(?=8|11|17)
( ? ! 正则) 获取不止指定内容的部分 Java(?! 8|11|17)

时间相关类

JDK7以前的时间相关类

类名 说明
Date 时间
SimpleDateFormat 格式化时间
Calendar 日历

Date类

Date类是一个JDK写好的Javabean类,用来描述时间,精确到毫秒.

  • 若用空参构造创造对象,默认表示当前的系统时间
  • 若用有参构造创造对象,默认表示指定的时间
方法名 说明
public Date() 创建Date对象, 表示当前时间
public Date(long date) 创建Date对象, 表示指定时间
public void setTime(long time) 设置/修改毫秒值
public long getTime() 获取时间对象的毫秒值

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package Time;

import java.util.Date;

public class DateDemo1 {
public static void main(String[] args) {
//创建一个对象表示时间
Date d1 = new Date();
System.out.println(d1);

//创建一个对象表示一个指定时间
Date d2 = new Date(0L);
System.out.println(d2); // 就是时间原点

//修改时间
d2.setTime(1100000000000L);
System.out.println(d2);

//获取对象表时间的毫秒值
System.out.println(d1.getTime());
System.out.println(d2.getTime());


}
}

SimpleDateFormat类

作用:

  • 格式化:把时间变成我们常用的格式
  • 解析:把字符串表示的时间变成Date对象
构造方法 说明
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认格式
public SimpleDateFormat 构造一个SimpleDateFormat, 使用指定格式

常用方法:

方法名 说明
format(Date date) 格式化(日期对象 ==> 字符串)
public Date parse(String source) 解析(字符串 ==> 日期对象)

格式化的时间形式的常用的模式对应关系如下:

1
2
3
4
5
6
y ==> 年   M ==> 月  d ==> 日 H ==> 时  m ==> 分 s ==> 秒

若想把时间变成 2024-04-25 18:37:00 则写法如下
yyyyy-MM-dd HH:mm:ss
若想把时间变成 2024年04月25日 18:37:00 则写法如下
yyyyy年MM月dd日 HH:mm:ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package Time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo1 {
public static void main(String[] args) throws ParseException {
//利用空参构造创建对象
SimpleDateFormat sdf1 = new SimpleDateFormat();
Date d1 = new Date();
System.out.println(sdf1.format(d1));

//利用带参的方式构造对象
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 EE");
Date d2 = new Date();
System.out.println(sdf2.format(d2));


//定义一个字符串表示时间
String str = "2024-04-25 19:01:00";
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = sdf3.parse(str);
System.out.println(parse);
}
}

Calendar

  • Calendar代表了系统当前时间的日历对象,可以单独修改、获取时间中的年,月,日
  • 细节:Calendar是一个抽象类,不能直接创建对象。

获取Calendar日历类对象的方法

方法名 说明
public static Calendar getInstance() 获取当前时间的对象

Calendar常用方法

方法名 说明
public final Date getTime() 获取日期对象
public final setTime(Date date) 给日历设置对象
public long getTimeInMillis() 拿到时间毫秒值
public void setTimeInMillis(long millis) 给日历设置时间毫秒值
public int get(int field) 取日历中某个字段的信息
public void set(int field, int value) 修改日历的某个字段信息
public void add(int field, int amount) 为某个字段增加/减少指定的纸

get方法注意事项:

1
2
3
4
5
6
7
8
9
10
11
12
获取日历对象 Calendar是一个静态类, 不能直接new, 而是通过一个静态方法获取到子类对象
会根据系统的不同时区获取不同的日历对象, 默认表示当前时间
会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
0 : 时代 时代值为 0 表示 BCE(公元前)时代,时代值为 1 表示 CE(公元)时代.
1 : 年
2 : 月
3 : 一年中的第几周
4 : 一个月中的第几周
5 : 一个月中的第几天(日期)
日历对象中月份的范围是 0 ~ 11, 如果获取的月数是 n 实际上是 n + 1 月
星期:在老外的眼里,星期日是一周中的第一天
1(星期日) 2(星期一)3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package Time;

import java.util.Calendar;
import java.util.Date;

public class CalendarDemo1 {
public static void main(String[] args) {
//获取日历对象 Calendar是一个静态类, 不能直接new, 而是通过一个静态方法获取到子类对象
//会根据系统的不同时区获取不同的日历对象, 默认表示当前时间
//会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
// 0 : 时代 时代值为 0 表示 BCE(公元前)时代,时代值为 1 表示 CE(公元)时代.
// 1 : 年
// 2 : 月
// 3 : 一年中的第几周
// 4 : 一个月中的第几周
// 5 : 一个月中的第几天(日期)
//日历对象中月份的范围是 0 ~ 11, 如果获取的月数是 n 实际上是 n + 1 月
//星期:在老外的眼里,星期日是一周中的第一天
//1(星期日) 2(星期一)3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

Calendar c = Calendar.getInstance();
System.out.println(c);

//修改一下日历代表时间
Date d = new Date(0L);
c.setTime(d);
System.out.println(c);
// c.set(1,2000); // 取消注释之后 下面年份变成2000
// c.set(2,2); //取消注释后 下面月份变成2 实际上是3月
// c.set(5,6); //取消注释后 下面日期变成 6

int Time = c.get(0);
System.out.println(Time);//1
int year = c.get(1);
System.out.println(year);//1970
int mon = c.get(2);
System.out.println(mon);//0 实际上是 1月
int day = c.get(5);
System.out.println(day); // 1
int yearweek = c.get(3);
System.out.println(yearweek);//一年中第一周

c.add(1,20);//增加20年
year = c.get(1);
System.out.println(year);

}
}

File的成员方法

常见成员方法(判断、获取)

方法名 说明
public boolean isDirectory() 判断此路径名表示的Flie是否为文件夹
public boolean isFile() 判断此路径名表示的File是否为文件
public boolean esists() 判断此路径名表示的File是否存在
public long length() 返回文件的大小(字节数量)
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间毫秒值)

Demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.File;

public class FileDemo1 {
public static void main(String[] args) {
/*
public boolean isDirectory() //判断此路径名表示的File是否为文件夹
public boolean isFile() //判断此路径名表示的File是否为文件
public boolean exists() //判断此路径名表示的File是否存在
*/
//对一个路径进行判断
File f1 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\awd\\src\\Main.java");
System.out.println(f1.isDirectory()); //false
System.out.println(f1.isFile()); //true
System.out.println(f1.exists()); //true

//对一个文件夹进行判断
File f2 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\awd\\src");
System.out.println(f2.isDirectory());//true
System.out.println(f2.isFile());//false
System.out.println(f2.exists());//true

//对一个不存在的路径进行判断
File f3 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\awd\\src2");
System.out.println(f3.isDirectory()); //false
System.out.println(f3.isFile()); //false
System.out.println(f3.exists()); //false
}
}

Demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.File;

public class FileDemo2 {
public static void main(String[] args) {
/*
public long length() 返回文件的大小(字节数量)
public string getAbsolutePath() 返回文件的绝对路径
public string getPath() 返回定义文件时使用的路径
public string getName( ) 返回文件的名称,带后缀
public long lastModified( ) 返回文件的最后修改时间(时间毫种值>
*/
File f1 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\File\\src\\FileDemo1.java");
System.out.println(f1.length()); //单位字节

//判断文件夹的大小
File f2 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\File\\src");
System.out.println(f2.length());//返回4096 结果不争取, length()方法无法获取文件夹的大小

File f3 = new File("myAPI\\File\\src\\FileDemo1.java"); //相对路径是从 项目文件夹下开始找
System.out.println(f3.getAbsoluteFile()); //D:\javaprogram\blackhorse\idea\basic-code\basic-code\myAPI\File\FileDemo1
System.out.println(f3.getPath());//返回定义文件是的路径 也就是new File() 时括号里面的值

System.out.println(f3.lastModified());//获取文件最后一次修改的时间

}
}

常见成员方法(创建、删除)

方法名 说明
public boolean createNewFile() 创建一个新的空文件
public boolean mkdir() 创建单击文件夹
public boolean mkdirs() 创建多级文件夹
public boolean delete 删除文件,空文件夹
  • delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.File;
import java.io.IOException;

public class FileDemo3 {
public static void main(String[] args) throws IOException {
/*
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 创建单级文件夹
public boolean mkdirs( ) 创建多级文件夹
public boolean delete() 删除文件、空文件夹
*/

File f1 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\File\\src\\FileDemo1.java");
System.out.println(f1.createNewFile());
//如果文件存在创建失败,返回false 如果文件不存在,创建成功, 返回true 如果
//如果父级路径不存在,也返回false 文件创建失败
//createNewFile()创建的一定是文件,如果不包含文件后缀名 则创建一个不含有后缀名的文件

}
}

常见成员方法(获取并遍历)

方法名 说明
public File[] listFiles() 获取当前路径下所有内容
  • 当调用者File表示的路径不存在的时候,返回null
  • 当调用者File表示的路径是文件的时候,返回null
  • 当调用者File表示的路径是空文件夹的时候,返回长度为0的数组
  • 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
  • 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.File;

public class FileDemo4 {
public static void main(String[] args) {
//public File[] listFiles() 获取当前该路径下所有内容

File f1 = new File("D:\\javaprogram\\blackhorse\\idea\\basic-code\\myAPI\\File\\src");

File[] files = f1.listFiles(); //将f1文件夹下的文件存到 files 数组中
for (int i = 0; i < files.length; i++) { //遍历
System.out.println(files[i]);
}
}
}

常见成员方法(获取并遍历)

方法名 说明
public static File[] listRoots() 列出可用的文件系统根
public String[] list() 获取的当前路径下的所有内容
public Sting[] list(FilenameFilter filter) 利用文件名过滤器。获取当前路径下所有的内容
public File[] listFiles() 获取当前该路径下所有内容
public File[] listFiles(FileFilter filter) 利用文件名过滤器。获取当前路径下所有的内容
public File[] listFiles(FilenameFilter filter) 利用文件名过滤器。获取当前路径下所有的内容

IO流

什么是IO流?

存储和读取数据的解决方案

I: input O:output

IO流的作用?

用于读写数据,(本地文件,网络)

IO流按照操作文件的类型可以分类哪两种流?

  • 字节流,可以操作所有类型的文件
  • 字符流,只能操作纯文本文件

FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。

用法

1
2
3
1. 创建对象
2.写数据
3.释放资源

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
/*
*演示:字节输出流Fileoutputstream
*实现需求:写出一段文字到本地文件中。(暂时不写中文)
*
*实现步骤:
*创建对象
*写出数据释放资源
*/

//创建对象
FileOutputStream fops = new FileOutputStream("1.txt");

//写出数据
fops.write(97); // ==> 写入到文件中以后,文件内容是a
//释放
fops.close();
}
}

FileOutputStream写数据的三种方式

方法名称 说明
void write(int b) 一次写一个字节的数据
void write(byte[] b) 一节写一个字节数组的数据
void write(byte[] b, int off , int len) 一次写一个字节数组的部分数据

FileOutputStream

操作本地文件的字节输出流,可以把本地文件中的数据读取到程序中。

用法

1
2
3
1. 创建对象
2.写数据
3.释放资源

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
/*
*演示:字节输入流FileInputStream
* 实现需求:读取文件中的数据。(暂时不写中文)
*实现步骤:
*创建对象
*读取数据
*释放资源
*/

FileInputStream fips = new FileInputStream("1.txt");
int r1 = fips.read(); //只会读第一个字节
System.out.println(r1);



//循环读取
int b;
while ((b =fips.read()) != -1){
System.out.print((char)b);

}
System.out.println();
fips.close();



}
}