javaSE阶段性学习简单总结

发布时间:2026/11/2 1:58:02
javaSE阶段性学习简单总结

javaSE阶段性学习总结

  • 1初识 Java
    • 1.1 Java 是什么
    • 1.2 JDK、JRE、JVM 的关系
  • 2数据类型与变量
    • 2.1 两类数据类型
    • 2.2 变量的声明与赋值
    • 2.3 类型转换
  • 3运算符
    • 3.1 算术运算符
    • 3.2 赋值与复合赋值运算符
    • 3.3 关系(比较)运算符
    • 3.4 逻辑运算符![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3ea8c3bc8c2a45249a10620ad898c107.png#pic_center)
    • 3.5 位运算符(了解)
    • 3.6 三元运算符
    • 3.7 运算符优先级
  • 4程序逻辑控制
    • 4.1 分支结构:if / else if / else
    • 4.2 分支结构:switch
    • 4.3 循环结构:for
    • 4.4 循环结构:while 与 do-while
    • 4.5 break 与 continue
  • 5Java 输入输出
    • 5.1 标准输出
    • 5.2 键盘输入:Scanner
  • 6方法的使用
    • 6.1方法定义格式
    • 6.2 方法的参数与返回值
    • 6.3方法重载(Overload)
    • 6.4 方法的参数传递:值传递
  • 7数组的定义与使用
    • 7.1 什么是数组
    • 7.2 三种定义方式
    • 7.3 访问与遍历
  • 8类和对象
    • 8.1面向对象思想
    • 8.2 类的定义
    • 8.3 对象的创建与使用
    • 8.4构造方法(构造器)
    • 8.5 this 关键字
    • 8.6 封装
    • 8.6 static 关键字
  • 9 继承
    • 9.1 什么是继承
    • 9.2 继承的规则
    • 9.3 super 关键字
    • 9.4方法重写(Override)
  • 10 多态
    • 10.1 多态的概念
    • 10.2 多态的三个前提
    • 10.3 成员访问特点
    • 10.3向上转型与向下转型
  • 11 抽象类和接口
    • 11.1 抽象类
    • 11.2 接口
    • 11.3 抽象类 vs 接口
  • 12 字符串 String 类
    • 12.1 String 的特点
    • 12.2 创建字符串的两种方式
    • 12.3 常用方法
  • 13 异常
    • 13.1 异常的概念
    • 13.2 异常体系
    • 13.3 五个关键字:try / catch / finally / throw / throws
    • 13.4 自定义异常类
  • 14 常用工具类介绍
    • 14.1 Object 类
    • 14.2 Math 类
    • 14.3 Random 类
    • 14.4 Arrays 工具类
    • 14.5 日期时间类

1初识 Java

1.1 Java 是什么

Java 是一门面向对象、静态类型、跨平台的高级编程语言。跨平台能力来自 JVM(Java Virtual Machine,Java 虚拟机):源代码 .java 编译成与平台无关的字节码 .class,再由对应操作系统上的 JVM 解释执行。

1.2 JDK、JRE、JVM 的关系

2数据类型与变量

2.1 两类数据类型

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

(2)引用数据类型

2.2 变量的声明与赋值

intage=18;doubleprice=9.9;charc='A';booleanok=true;Stringname="张三";// String 是引用类型,双引号包裹
  • 局部变量:定义在方法或代码块中,使用前必须手动赋值,没有默认值
  • 成员变量:定义在类中,未赋值时自动赋予类型默认值(0 / 0.0 / null / false)

2.3 类型转换

  • 自动类型转换(小转大):byte → short → int → long → float → double,char 可与 int 互通;
  • 强制类型转换(大转小):必须显式写出目标类型,可能丢失精度:int n = (int) 3.99;。
    易错点
    long 字面量要加 L,float 字面量要加 F;两个整数相除结果仍是整数(5 / 2 = 2),想得到小数必须先把其中一个转成 double。

3运算符

3.1 算术运算符

+、-、*、/、%(取余)、++、–

3.2 赋值与复合赋值运算符

=、+=、-=、*=、/=、%=。复合赋值会自动做强制类型转换,例如 short s = 1; s += 1; 编译通过,等价于 s = (short)(s + 1)。

3.3 关系(比较)运算符

==、!=、>、<、>=、<=,运算结果都是 boolean 值。注意比较基本类型用 == 比较值;比较字符串内容必须用 equals()。

3.4 逻辑运算符

3.5 位运算符(了解)

&、|、^(异或)、~(取反)、<<(左移,乘 2 的 n 次方)、>>(右移)、>>>(无符号右移)。

3.6 三元运算符

数据类型 变量=条件?值1:值2;intmax=a>b?a:b;// 求两个数较大值

3.7 运算符优先级

优先级从高到低大致:括号 () → 一元 ++ – ! → 乘除取余 → 加减 → 移位 → 关系 → 相等 → 位与/异或/或 → 逻辑与 → 逻辑或 → 三元 → 赋值。实际开发中不确定时直接加括号,不要依赖记忆优先级。

4程序逻辑控制

4.1 分支结构:if / else if / else

if(条件1){// 条件1成立执行}elseif(条件2){// 条件2成立执行}else{// 以上都不成立执行}

4.2 分支结构:switch

switch(表达式){case值1:// 执行语句break;case值2:// 执行语句break;default:// 兜底分支}
  • 表达式支持 byte / short / int / char、枚举、String
  • break 跳出 switch;漏写 break 会发生「case 穿透」,从匹配位置依次向下执行
  • default 位置不强制在最后,所有 case 都不匹配时执行

4.3 循环结构:for

for(初始化;循环条件;迭代){// 循环体}// 输出 1~5for(inti=1;i<=5;i++){System.out.println(i);}

4.4 循环结构:while 与 do-while

// while:先判断,条件成立再执行while(条件){// 循环体}// do-while:先执行一次,再判断,循环体至少执行一次do{// 循环体}while(条件);

4.5 break 与 continue

  • break:立即跳出当前所在的一层循环或 switch
  • continue:跳过本次循环剩余语句,直接进入下一次循环判断
  • 嵌套循环中两者都只作用于最内层;需要跳出外层循环时可使用带标签的 外层标签: … break 外层标签

5Java 输入输出

5.1 标准输出

System.out.println("输出并换行");System.out.print("输出不换行");System.out.printf("姓名:%s,年龄:%d",name,age);

常用格式符:%d 整数、%f 小数、%s 字符串、%c 字符、%b 布尔

5.2 键盘输入:Scanner

使用 java.util.Scanner 读取控制台输入,使用前必须导包:import java.util.Scanner

importjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.print("请输入姓名:");Stringname=sc.next();System.out.print("请输入年龄:");intage=sc.nextInt();System.out.println(name+","+age+" 岁");sc.close();}}


易错点
nextInt() 之后直接调用 nextLine() 会读到残留的回车换行,导致字符串读空。解决方式:要么统一用 next(),要么在中间补一次 sc.nextLine() 吃掉换行;输入类型与方法不匹配会抛出 InputMismatchException

6方法的使用

6.1方法定义格式

修饰符 返回值类型 方法名(参数列表){// 方法体return返回值;}
publicclassMethodDemo{// 无返回值、无参数方法publicstaticvoidsayHello(){System.out.println("Hello");}// 带参数、带返回值方法:求两个数之和publicstaticintadd(inta,intb){returna+b;}publicstaticvoidmain(String[]args){sayHello();intr=add(3,5);System.out.println(r);}}

6.2 方法的参数与返回值

  • 形参:方法定义时括号里的变量;实参:调用方法时传入的具体值;
  • 返回值类型为 void 表示方法不返回数据,方法内可以不写 return,或只写 return; 结束方法;
  • 返回值类型非 void 时,方法内必须保证所有分支都有 return。

6.3方法重载(Overload)

publicstaticintadd(inta,intb){returna+b;}publicstaticdoubleadd(doublea,doubleb){returna+b;}publicstaticintadd(inta,intb,intc){returna+b+c;}

6.4 方法的参数传递:值传递

Java 只有值传递:

  • 基本类型传递的是变量值的副本,方法内修改形参不影响实参;
  • 引用类型传递的是地址值的副本,通过形参修改对象内部属性会影响原对象,但把形参重新指向新对象不会影响原引用。

7数组的定义与使用

7.1 什么是数组

数组是相同数据类型元素的有序集合,长度一旦确定不可改变,元素在内存中连续存放,通过下标访问,下标从 0 开始。

7.2 三种定义方式

// 方式一:声明并指定长度,元素自动赋默认值int[]arr1=newint[5];// 方式二:静态初始化,省略长度int[]arr2=newint[]{1,2,3};// 方式三:简化写法int[]arr3={1,2,3,4};

7.3 访问与遍历

arr1[0]=10;// 按下标赋值intx=arr1[0];// 按下标取值intlen=arr1.length;// 长度属性(没有括号)// 普通 for 遍历for(inti=0;i<arr3.length;i++){System.out.println(arr3[i]);}// 增强 for(for-each)遍历,拿不到下标for(intn:arr3){System.out.println(n);}

8类和对象

8.1面向对象思想

面向对象(OOP)把程序看成一个个对象,类是对一类事物的抽象模板,对象是类的具体实例。先描述模板(类),再根据模板创建对象,让对象协作完成功能

8.2 类的定义

类由两部分组成:**成员变量(属性)**描述对象状态,成员方法描述对象行为。

publicclassStudent{// 成员变量(属性)Stringname;intage;// 成员方法(行为)publicvoidstudy(){System.out.println(name+" 在学习");}}

8.3 对象的创建与使用

publicclassTestStudent{publicstaticvoidmain(String[]args){// 1. 创建对象Students=newStudent();// 2. 给属性赋值s.name="张三";s.age=18;// 3. 调用方法s.study();}}

8.4构造方法(构造器)

创建对象时自动调用的特殊方法,用于给属性初始化。方法名与类名完全一致,没有返回值类型。

publicclassStudent{Stringname;intage;// 无参构造方法publicStudent(){}// 有参构造方法publicStudent(Stringname,intage){this.name=name;this.age=age;}}
  • 类中不写任何构造方法时,编译器自动提供一个无参构造;
  • 一旦手写有参构造,默认无参构造会消失,需要手动补写;
  • 构造方法之间可以通过 this(参数) 互相调用。

8.5 this 关键字

this 代表当前对象引用,作用:区分成员变量与同名局部变量(参数和属性重名时,this.属性 表示成员变量);调用本类构造方法 this(…)。

8.6 封装

封装是面向对象三大特征之一:把属性用 private 隐藏起来,对外提供 public 的 getter / setter 方法,在方法内部校验数据合法性,保护对象内部状态。

privateintage;publicintgetAge(){returnage;}publicvoidsetAge(intage){if(age>=0&&age<=120){this.age=age;}else{System.out.println("年龄不合法");}}

8.6 static 关键字

  • 静态成员变量:被所有对象共享,属于类本身,类名直接调用;
  • 静态方法:属于类,静态方法中不能直接使用 this,不能直接访问非静态成员;
  • 静态代码块:static { … },类加载时执行一次,常用于初始化静态资源;
  • 静态内容优先于对象存在,非静态方法可以直接访问静态成员,反之不行。

9 继承

9.1 什么是继承

多个类存在公共属性和方法时,抽取到父类中,子类通过 extends 关键字继承父类,自动拥有父类非私有成员,达到代码复用、为多态做准备的目的。

classAnimal{Stringname;publicvoideat(){System.out.println("吃东西");}}classDogextendsAnimal{// 自动拥有 name 和 eat(),可再定义自己的成员publicvoidwatchHome(){System.out.println("看家");}}

9.2 继承的规则

  • Java 只支持单继承:一个类只能有一个直接父类;支持多层继承(子类 → 父类 → 祖父类);
  • 所有类的根父类是 java.lang.Object;
  • 父类 private 成员子类不能直接访问,可通过父类提供的 getter/setter 间接访问;
  • 子类构造方法第一行默认调用 super()(父类无参构造);父类没有无参构造时,必须在子类构造中显式 super(参数)。

9.3 super 关键字

super 指向父类对象引用:

  • super.属性:调用父类成员变量;
  • super.方法():调用父类成员方法;
  • super(参数):调用父类构造方法,必须写在子类构造方法第一行。

9.4方法重写(Override)

子类对父类已有方法重新实现,方法名、参数列表、返回值类型(基本类型和 void 必须一致,引用类型可以相同或其子类)保持一致,访问权限不能比父类更严格。重写方法上常加 @Override 注解让编译器校验。
重载 vs 重写(高频辨析)
重载 Overload:同一个类中,方法名相同、参数列表不同,与返回值无关,是编译期行为;重写 Override:子类与父类之间,方法签名一致,是运行期多态的基础。

10 多态

10.1 多态的概念

同一个方法调用,不同对象表现出不同行为,称为多态。通俗理解:父类引用指向子类对象,调用方法时执行的是子类重写后的版本。

10.2 多态的三个前提

多态并不是随便写就能生效的,必须同时满足下面三个条件,缺一不可:

  1. 存在继承(或实现)关系:子类必须继承父类,或者实现某个接口,两者之间要有「is-a」的关系。没有继承关系,就谈不上父类引用指向子类对象。
  2. 子类重写父类方法:子类需要对父类中已有的方法重新实现(方法签名保持一致)。如果子类没有重写,调用时执行的仍然是父类的版本,多态就体现不出来。
  3. 父类引用指向子类对象:也就是「向上转型」,写法形如父类类型 变量 = new 子类类型();。编译期看父类类型,运行期看实际创建的子类对象。

10.3 成员访问特点

10.3向上转型与向下转型

classAnimal{publicvoidspeak(){System.out.println("动物发出声音");}}classDogextendsAnimal{@Overridepublicvoidspeak(){System.out.println("汪汪汪");}}classCatextendsAnimal{@Overridepublicvoidspeak(){System.out.println("喵喵喵");}}publicclassTestPolymorphism{publicstaticvoidmain(String[]args){// 父类引用指向子类对象Animala1=newDog();Animala2=newCat();a1.speak();// 输出:汪汪汪a2.speak();// 输出:喵喵喵}}

运行结果

汪汪汪 喵喵喵

从上面的例子可以看出:a1和a2的编译类型都是Animal,但运行时分别指向Dog和Cat对象,因此调用speak()时执行的是各自子类重写后的版本,这就是「同一个方法调用,不同对象表现出不同行为」。

补充说明

  • 成员变量不参与多态:多态只针对方法。通过父类引用访问成员变量时,取到的仍是父类中定义的值。
  • 静态方法不参与多态:静态方法属于类本身,编译期就确定了调用目标,不会根据实际对象类型动态绑定。
Animala=newDog();a.speak();// 多态:调用 Dog 重写后的 speak()if(ainstanceofDog){Dogd=(Dog)a;// 向下转型,安全d.speak();}

11 抽象类和接口

11.1 抽象类

用 abstract 修饰的类称为抽象类,
abstract 修饰的方法只有方法声明、没有方法体,称为抽象方法。

abstractclassShape{// 抽象方法:没有方法体publicabstractdoublearea();// 抽象类中也可以有普通成员变量和普通方法Stringcolor;publicvoidshow(){}}classCircleextendsShape{privatedoubler;@Overridepublicdoublearea(){returnMath.PI*r*r;}}
  • 抽象类不能直接 new 对象,必须由子类继承;
  • 子类继承抽象类后,必须重写父类所有抽象方法,否则子类也得声明为抽象类;
  • 抽象类可以有构造方法,供子类创建对象时调用父类初始化。

11.2 接口

接口是一种行为规范,用 interface 定义,类通过 implements 实现接口

interfaceSwim{// 常量:默认 public static finalintLEVEL=1;// 抽象方法:默认 public abstractvoidswim();}classDuckimplementsSwim{@Overridepublicvoidswim(){System.out.println("鸭子游泳");}}
  • 接口成员变量默认 public static final,成员方法默认 public abstract;
  • 一个类可以实现多个接口,弥补 Java 单继承的限制;
  • 接口之间可以多继承(interface B extends A, C);
  • JDK 8 之后接口允许有 default 默认方法和 static 静态方法。

11.3 抽象类 vs 接口

12 字符串 String 类

12.1 String 的特点

java.lang.String 表示字符串,不可变:字符串对象一旦创建,内容不能修改,每次拼接、替换都会生成新的 String 对象。

12.2 创建字符串的两种方式

Strings1="abc";// 字符串常量池Strings2=newString("abc");// 在堆中创建新对象

12.3 常用方法

13 异常

13.1 异常的概念

异常:程序执行过程中发生的一种特殊情况或错误状态,它打断了程序的正常流程,需要特别处理。
代码写得再完善,运行时也难免出现问题,有些问题很难靠代码提前控制,比如:数据格式不对、网络不通畅、内存报警等。在 Java 中,把程序执行过程中发生的不正常行为称为异常。

13.2 异常体系

.3 五个关键字:try / catch / finally / throw / throws

13.3 五个关键字:try / catch / finally / throw / throws

  • try:包裹可能出错的代码;
  • catch:捕获并处理指定类型异常;多个 catch 从小到大(子类在前,父类在后);
  • finally:无论是否异常都会执行,常用于释放资源;
  • throw:方法内部手动抛出异常对象;
  • throws:方法签名上声明可能抛出的受检异常,交给调用者处理。
publicstaticintdivide(inta,intb)throwsArithmeticException{if(b==0){thrownewArithmeticException("除数不能为 0");}returna/b;}publicstaticvoidmain(String[]args){try{intr=divide(10,0);}catch(ArithmeticExceptione){System.out.println("捕获异常:"+e.getMessage());}finally{System.out.println("资源清理");}}

13.4 自定义异常类

实现步骤:
1.自定义异常类,继承 Exception(受查异常)或 RuntimeException(非受查异常)。
2.实现一个带有 String 参数的构造方法。

// 1. 自定义异常类classUserNameExceptionextendsException{publicUserNameException(Stringmessage){super(message);}}classPasswordExceptionextendsException{publicPasswordException(Stringmessage){super(message);}}// 2. 业务逻辑类publicclassLogIn{privateStringuserName="admin";privateStringpassword="123456";// 声明可能抛出的异常publicvoidloginInfo(StringuserName,Stringpassword)throwsUserNameException,PasswordException{if(!this.userName.equals(userName)){thrownewUserNameException("用户名错误!");}if(!this.password.equals(password)){thrownewPasswordException("密码错误!");}System.out.println("登录成功");}publicstaticvoidmain(String[]args){LogInlogin=newLogIn();try{login.loginInfo("admin111","123456");}catch(UserNameExceptione){e.printStackTrace();}catch(PasswordExceptione){e.printStackTrace();}}}

14 常用工具类介绍

14.1 Object 类

所有类都直接或间接继承 Object,常用方法:

  • toString():返回对象字符串描述,建议重写后输出属性信息;
  • equals(Object obj):默认比较地址,类中通常按业务重写为比较内容;
  • hashCode():返回对象哈希码;
  • getClass():获取运行时类对象。

14.2 Math 类

全部为静态方法,直接 Math.方法名() 调用:

14.3 Random 类

Randomr=newRandom();intn=r.nextInt(100);// 生成 0~99 的整数doubled=r.nextDouble();// [0.0, 1.0) 小数

14.4 Arrays 工具类

专门操作数组的工具类,常用静态方法:

  • Arrays.sort(arr):升序排序;
  • Arrays.binarySearch(arr, key):二分查找(要求先排序);
  • Arrays.toString(arr):数组转字符串输出;
  • Arrays.copyOf(arr, newLength):数组复制并指定新长度;
  • Arrays.fill(arr, value):用指定值填充整个数组。

14.5 日期时间类

java.util.Date 表示某一时刻;SimpleDateFormat 用于日期与字符串之间格式化转换。JDK 8 推荐使用新的 LocalDate、LocalTime、LocalDateTime、DateTimeFormatter,线程安全、API 更清晰。