javaSE阶段性学习简单总结
javaSE阶段性学习总结1初识 Java1.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 / else4.2 分支结构switch4.3 循环结构for4.4 循环结构while 与 do-while4.5 break 与 continue5Java 输入输出5.1 标准输出5.2 键盘输入Scanner6方法的使用6.1方法定义格式6.2 方法的参数与返回值6.3方法重载Overload6.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方法重写Override10 多态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 / throws13.4 自定义异常类14 常用工具类介绍14.1 Object 类14.2 Math 类14.3 Random 类14.4 Arrays 工具类14.5 日期时间类1初识 Java1.1 Java 是什么Java 是一门面向对象、静态类型、跨平台的高级编程语言。跨平台能力来自 JVMJava Virtual MachineJava 虚拟机源代码 .java 编译成与平台无关的字节码 .class再由对应操作系统上的 JVM 解释执行。1.2 JDK、JRE、JVM 的关系2数据类型与变量2.1 两类数据类型1基本数据类型8 种2引用数据类型2.2 变量的声明与赋值intage18;doubleprice9.9;charcA;booleanoktrue;Stringname张三;// String 是引用类型双引号包裹局部变量定义在方法或代码块中使用前必须手动赋值没有默认值成员变量定义在类中未赋值时自动赋予类型默认值0 / 0.0 / null / false2.3 类型转换自动类型转换小转大byte → short → int → long → float → doublechar 可与 int 互通强制类型转换大转小必须显式写出目标类型可能丢失精度int n (int) 3.99;。易错点long 字面量要加 Lfloat 字面量要加 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;intmaxab?a:b;// 求两个数较大值3.7 运算符优先级优先级从高到低大致括号 () → 一元 – ! → 乘除取余 → 加减 → 移位 → 关系 → 相等 → 位与/异或/或 → 逻辑与 → 逻辑或 → 三元 → 赋值。实际开发中不确定时直接加括号不要依赖记忆优先级。4程序逻辑控制4.1 分支结构if / else if / elseif(条件1){// 条件1成立执行}elseif(条件2){// 条件2成立执行}else{// 以上都不成立执行}4.2 分支结构switchswitch(表达式){case值1:// 执行语句break;case值2:// 执行语句break;default:// 兜底分支}表达式支持 byte / short / int / char、枚举、Stringbreak 跳出 switch漏写 break 会发生「case 穿透」从匹配位置依次向下执行default 位置不强制在最后所有 case 都不匹配时执行4.3 循环结构forfor(初始化;循环条件;迭代){// 循环体}// 输出 1~5for(inti1;i5;i){System.out.println(i);}4.4 循环结构while 与 do-while// while先判断条件成立再执行while(条件){// 循环体}// do-while先执行一次再判断循环体至少执行一次do{// 循环体}while(条件);4.5 break 与 continuebreak立即跳出当前所在的一层循环或 switchcontinue跳过本次循环剩余语句直接进入下一次循环判断嵌套循环中两者都只作用于最内层需要跳出外层循环时可使用带标签的 外层标签: … 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.Scannerimportjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);System.out.print(请输入姓名);Stringnamesc.next();System.out.print(请输入年龄);intagesc.nextInt();System.out.println(nameage 岁);sc.close();}}易错点nextInt() 之后直接调用 nextLine() 会读到残留的回车换行导致字符串读空。解决方式要么统一用 next()要么在中间补一次 sc.nextLine() 吃掉换行输入类型与方法不匹配会抛出 InputMismatchException6方法的使用6.1方法定义格式修饰符 返回值类型 方法名(参数列表){// 方法体return返回值;}publicclassMethodDemo{// 无返回值、无参数方法publicstaticvoidsayHello(){System.out.println(Hello);}// 带参数、带返回值方法求两个数之和publicstaticintadd(inta,intb){returnab;}publicstaticvoidmain(String[]args){sayHello();intradd(3,5);System.out.println(r);}}6.2 方法的参数与返回值形参方法定义时括号里的变量实参调用方法时传入的具体值返回值类型为 void 表示方法不返回数据方法内可以不写 return或只写 return; 结束方法返回值类型非 void 时方法内必须保证所有分支都有 return。6.3方法重载Overloadpublicstaticintadd(inta,intb){returnab;}publicstaticdoubleadd(doublea,doubleb){returnab;}publicstaticintadd(inta,intb,intc){returnabc;}6.4 方法的参数传递值传递Java 只有值传递基本类型传递的是变量值的副本方法内修改形参不影响实参引用类型传递的是地址值的副本通过形参修改对象内部属性会影响原对象但把形参重新指向新对象不会影响原引用。7数组的定义与使用7.1 什么是数组数组是相同数据类型元素的有序集合长度一旦确定不可改变元素在内存中连续存放通过下标访问下标从 0 开始。7.2 三种定义方式// 方式一声明并指定长度元素自动赋默认值int[]arr1newint[5];// 方式二静态初始化省略长度int[]arr2newint[]{1,2,3};// 方式三简化写法int[]arr3{1,2,3,4};7.3 访问与遍历arr1[0]10;// 按下标赋值intxarr1[0];// 按下标取值intlenarr1.length;// 长度属性没有括号// 普通 for 遍历for(inti0;iarr3.length;i){System.out.println(arr3[i]);}// 增强 forfor-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. 创建对象StudentsnewStudent();// 2. 给属性赋值s.name张三;s.age18;// 3. 调用方法s.study();}}8.4构造方法构造器创建对象时自动调用的特殊方法用于给属性初始化。方法名与类名完全一致没有返回值类型。publicclassStudent{Stringname;intage;// 无参构造方法publicStudent(){}// 有参构造方法publicStudent(Stringname,intage){this.namename;this.ageage;}}类中不写任何构造方法时编译器自动提供一个无参构造一旦手写有参构造默认无参构造会消失需要手动补写构造方法之间可以通过 this(参数) 互相调用。8.5 this 关键字this 代表当前对象引用作用区分成员变量与同名局部变量参数和属性重名时this.属性 表示成员变量调用本类构造方法 this(…)。8.6 封装封装是面向对象三大特征之一把属性用 private 隐藏起来对外提供 public 的 getter / setter 方法在方法内部校验数据合法性保护对象内部状态。privateintage;publicintgetAge(){returnage;}publicvoidsetAge(intage){if(age0age120){this.ageage;}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){// 父类引用指向子类对象Animala1newDog();Animala2newCat();a1.speak();// 输出汪汪汪a2.speak();// 输出喵喵喵}}运行结果汪汪汪 喵喵喵从上面的例子可以看出a1和a2的编译类型都是Animal但运行时分别指向Dog和Cat对象因此调用speak()时执行的是各自子类重写后的版本这就是「同一个方法调用不同对象表现出不同行为」。补充说明成员变量不参与多态多态只针对方法。通过父类引用访问成员变量时取到的仍是父类中定义的值。静态方法不参与多态静态方法属于类本身编译期就确定了调用目标不会根据实际对象类型动态绑定。AnimalanewDog();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 finalintLEVEL1;// 抽象方法默认 public abstractvoidswim();}classDuckimplementsSwim{Overridepublicvoidswim(){System.out.println(鸭子游泳);}}接口成员变量默认 public static final成员方法默认 public abstract一个类可以实现多个接口弥补 Java 单继承的限制接口之间可以多继承interface B extends A, CJDK 8 之后接口允许有 default 默认方法和 static 静态方法。11.3 抽象类 vs 接口12 字符串 String 类12.1 String 的特点java.lang.String 表示字符串不可变字符串对象一旦创建内容不能修改每次拼接、替换都会生成新的 String 对象。12.2 创建字符串的两种方式Strings1abc;// 字符串常量池Strings2newString(abc);// 在堆中创建新对象12.3 常用方法13 异常13.1 异常的概念异常程序执行过程中发生的一种特殊情况或错误状态它打断了程序的正常流程需要特别处理。代码写得再完善运行时也难免出现问题有些问题很难靠代码提前控制比如数据格式不对、网络不通畅、内存报警等。在 Java 中把程序执行过程中发生的不正常行为称为异常。13.2 异常体系.3 五个关键字try / catch / finally / throw / throws13.3 五个关键字try / catch / finally / throw / throwstry包裹可能出错的代码catch捕获并处理指定类型异常多个 catch 从小到大子类在前父类在后finally无论是否异常都会执行常用于释放资源throw方法内部手动抛出异常对象throws方法签名上声明可能抛出的受检异常交给调用者处理。publicstaticintdivide(inta,intb)throwsArithmeticException{if(b0){thrownewArithmeticException(除数不能为 0);}returna/b;}publicstaticvoidmain(String[]args){try{intrdivide(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{privateStringuserNameadmin;privateStringpassword123456;// 声明可能抛出的异常publicvoidloginInfo(StringuserName,Stringpassword)throwsUserNameException,PasswordException{if(!this.userName.equals(userName)){thrownewUserNameException(用户名错误);}if(!this.password.equals(password)){thrownewPasswordException(密码错误);}System.out.println(登录成功);}publicstaticvoidmain(String[]args){LogInloginnewLogIn();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 类RandomrnewRandom();intnr.nextInt(100);// 生成 0~99 的整数doubledr.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 更清晰。