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 逻辑运算符
- 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 多态的三个前提
多态并不是随便写就能生效的,必须同时满足下面三个条件,缺一不可:
- 存在继承(或实现)关系:子类必须继承父类,或者实现某个接口,两者之间要有「is-a」的关系。没有继承关系,就谈不上父类引用指向子类对象。
- 子类重写父类方法:子类需要对父类中已有的方法重新实现(方法签名保持一致)。如果子类没有重写,调用时执行的仍然是父类的版本,多态就体现不出来。
- 父类引用指向子类对象:也就是「向上转型」,写法形如
父类类型 变量 = 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 更清晰。