Java基础总结篇--JavaSE你必须要知道的基础 爱被打了一巴掌 2022-07-21 01:59 189阅读 0赞 <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">01.Java概述与语法</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; table-layout:fixed; margin-left:0px; width:840px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="font-size:19px"><span style="color:rgb(77,206,29)">java发展概述</span></span> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、 </div> <div style="margin:0px; padding:0px"> Java由SUN公司研发,SUN 被 Oracle 收购 </div> <div style="margin:0px; padding:0px"> Java 由1995年发布,正式版本由1996年1月发布(jdk1.0) </div> <div style="margin:0px; padding:0px"> Java之父: James Gosling </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、 </div> <div style="margin:0px; padding:0px"> 面向对象 </div> <div style="margin:0px; padding:0px"> 分布式 </div> <div style="margin:0px; padding:0px"> 多线程 </div> <div style="margin:0px; padding:0px"> 简单化 </div> <div style="margin:0px; padding:0px"> 安全 </div> <div style="margin:0px; padding:0px"> 跨平台移植 ------ JVM Java Virtual Machine Java虚拟机 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、 </div> <div style="margin:0px; padding:0px"> JavaSE Java Standard Edition : Java标准版本 </div> <div style="margin:0px; padding:0px"> JavaEE Java Enterprise Edition : Java企业版本 </div> <div style="margin:0px; padding:0px"> JavaME Java Micro Edition : Java微型版 ---------------- Android </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、搭建开发环境 </div> <div style="margin:0px; padding:0px"> JVM Java Virtual Machine Java虚拟机 : 用于与操作系统进行交互 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> JRE Java Runtime Enviroment Java运行环境: JVM + Java核心类库 </div> <div style="margin:0px; padding:0px"> JDK Java Development Kit Java开发工具包 : JRE + Java开发工具集(java.exe javac.exe javadoc.exe) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. </div> <div style="margin:0px; padding:0px"> ①下载安装JDK </div> <div style="margin:0px; padding:0px"> ②通过命令提示符到JDK安装路径的bin路径下,执行 javac </div> <div style="margin:0px; padding:0px"> ③配置path环境变量:JDK安装路径的bin路径下 </div> <div style="margin:0px; padding:0px"> 流程:先在当前路径下找是否有 javac.exe,若没有再到 path 环境变量中从前往后依次查找 </div> <div style="margin:0px; padding:0px"> 目的:在任意路径下执行 javac </div> <div style="margin:0px; padding:0px"> ④JAVA_HOME : JDK安装根路径 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 五、开发第一个应用程序 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 步骤: </div> <div style="margin:0px; padding:0px"> ①创建一个 .java 结尾的文件,被称为 java源文件。 如: 【HelloWorld.java】 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public class HelloWorld{ </div> <div style="margin:0px; padding:0px"> public static void main(String[] args){ </div> <div style="margin:0px; padding:0px"> System.out.println("HelloWorld!"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ②编译: 通过 javac + 源文件名称 命令进行编译, 生成一个或多个 .class 字节码文件。 如:【javac HelloWorld.java】 </div> <div style="margin:0px; padding:0px"> ③运行: 通过 java + .class 字节码文件名 命令进行运行。(JVM会将一个或多个.class 字节码文件加载到内存中)。 如:【java HelloWorld】 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 开发第一个应用程序的注意: </div> <div style="margin:0px; padding:0px"> ①以 .java 结尾的文件,被称为 java源文件。 </div> <div style="margin:0px; padding:0px"> ②一个 .java 源文件中可以有多个类,但是,只能有一个 public 修饰的类 </div> <div style="margin:0px; padding:0px"> ③public 修饰类的名称必须与 .java 源文件名称一致 </div> <div style="margin:0px; padding:0px"> ④每条语句以 “;” 结束 </div> <div style="margin:0px; padding:0px"> ⑤Java 严格区分大小写 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 六、注释语句: 不会被JVM解释执行的语句 </div> <div style="margin:0px; padding:0px"> //单行注释 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> /* </div> <div style="margin:0px; padding:0px"> 多行注释:不能嵌套 </div> <div style="margin:0px; padding:0px"> */ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> /** </div> <div style="margin:0px; padding:0px"> 文档注释: 可以通过 javadoc -d mydoc -author -version HelloWorld.java 命令生成说明文档 </div> <div style="margin:0px; padding:0px"> */ </div> </td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(107,231,72)"><span style="font-size:21px">Java基础语法</span></span> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、 </div> <div style="margin:0px; padding:0px"> 标识符:凡是自己命名的地方都叫标识符。 如: 包名、类名、接口名、方法名、变量名、常量名 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 关键字:被Java赋予了特殊含义的单词。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 命名的规则 (必须遵守,若不遵守编译不能通过) </div> <div style="margin:0px; padding:0px"> ①可使用 字母 A-Z a-z 数字 0-9 特殊字符 下划线 "_" 和 美元符 “$” </div> <div style="margin:0px; padding:0px"> ②数字不能开头 </div> <div style="margin:0px; padding:0px"> ③其中不能包含空格 </div> <div style="margin:0px; padding:0px"> ④不能使用关键字和保留字,但是可以包含关键字和保留字 </div> <div style="margin:0px; padding:0px"> ⑤Java严格区分大小写,但是长度无限制。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 命名的规范 (可以不遵守,但是会收到鄙视) </div> <div style="margin:0px; padding:0px"> ①包名: 所有字母都小写。 如: xxxyyyzzz </div> <div style="margin:0px; padding:0px"> ②类名、接口名:若出现多个单词,每个单词首字母都大写。如: XxxYyyZzz </div> <div style="margin:0px; padding:0px"> ③方法名、变量名: 若出现多个单词,第一个单词的首字母小写,其余单词首字母都大写。如: xxxYyyZzz </div> <div style="margin:0px; padding:0px"> ④常量名: 所有字母都大写,每个单词之间以 "_" 分隔。 如: XXX_YYY_ZZZ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、 </div> <div style="margin:0px; padding:0px"> 变量:用于保存数据 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 局部变量 & 成员变量 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 变量的格式: 数据类型 变量名 = 值; </div> <div style="margin:0px; padding:0px"> //声明一个变量 </div> <div style="margin:0px; padding:0px"> 数据类型 变量名; 如: int var; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //为变量赋值 </div> <div style="margin:0px; padding:0px"> 变量名 = 值; 如: var = 10; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //声明一个变量并赋值 </div> <div style="margin:0px; padding:0px"> int var = 10; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 变量的概念: </div> <div style="margin:0px; padding:0px"> ①在内存中开辟一块内存空间 </div> <div style="margin:0px; padding:0px"> ②该空间有名称(变量名)有类型(数据类型) </div> <div style="margin:0px; padding:0px"> ③变量可以在指定的范围内不断的变化 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 变量的注意: </div> <div style="margin:0px; padding:0px"> ①作用域:变量作用在所属的那对 {} 内 </div> <div style="margin:0px; padding:0px"> ②局部变量在使用前必须赋初始值 </div> <div style="margin:0px; padding:0px"> ③先声明,后使用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、进制之间的转换(了解) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、变量的数据类型 </div> <div style="margin:0px; padding:0px"> 基本数据类型(8种): </div> <div style="margin:0px; padding:0px"> 整型: byte(8位) short(16位) int(32位)-默认类型 long(64位) </div> <div style="margin:0px; padding:0px"> 浮点型: float(32位) double(64位)---默认类型 </div> <div style="margin:0px; padding:0px"> 字符型: char(2个字节---16位) </div> <div style="margin:0px; padding:0px"> 布尔型: boolean </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 引用数据类型: </div> <div style="margin:0px; padding:0px"> |---类(class) -------------------- String 字符串 </div> <div style="margin:0px; padding:0px"> |---接口(interface) </div> <div style="margin:0px; padding:0px"> |---数组([]) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 声明变量的注意: </div> <div style="margin:0px; padding:0px"> ①声明 long 型变量,值后需要加 L 或 l . 如: long l = 123456l; long l1 = 123456L; </div> <div style="margin:0px; padding:0px"> ②声明 float 型变量,值后必须加 F 或 f 。 如: float f = 15.6f; </div> <div style="margin:0px; padding:0px"> ③声明 double 型变量,值后可以加 D 或 d 。 如: double d1 = 167.7D; </div> <div style="margin:0px; padding:0px"> ④声明 char 型变量,值必须使用单引号。只能存储单个字符 </div> <div style="margin:0px; padding:0px"> 存储 Unicode 编码(ASCII 、 中文、日文、特殊字符等等) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ⑤声明 String 变量,值必须使用双引号 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 五、变量的运算 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 数据类型的转换: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 自动类型转换(自动升级):小容量转大容量。(系统自动完成) </div> <div style="margin:0px; padding:0px"> ①byte short char ---> int ---> long ---> float ---> double </div> <div style="margin:0px; padding:0px"> ②byte short char 三者之间不进行运算,若运算自动提升成 int 再做运算 </div> <div style="margin:0px; padding:0px"> char c1 = 'A'; </div> <div style="margin:0px; padding:0px"> char c2 = 'B'; </div> <div style="margin:0px; padding:0px"> int i = c1 + c2; </div> <div style="margin:0px; padding:0px"> ③boolean 不参与运算 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ④String与任何基本数据类型使用连接符(+) 进行运算,都将自动串接成 String 类型 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 强制类型转换:大容量转小容量。需要使用强转符 "(需要转换的类型)" </div> <div style="margin:0px; padding:0px"> 但是可能损失精度。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 六、运算符 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 算数运算符 : + - + - * / % 前++ 后++ 前-- 后-- +(连接符) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //除法 </div> <div style="margin:0px; padding:0px"> int a = 12; </div> <div style="margin:0px; padding:0px"> int b = 5; </div> <div style="margin:0px; padding:0px"> int c = a / b; //2 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //取模 </div> <div style="margin:0px; padding:0px"> int c = 12 % 5; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //前后++ </div> <div style="margin:0px; padding:0px"> int i = 10; </div> <div style="margin:0px; padding:0px"> int j = i++; </div> <div style="margin:0px; padding:0px"> System.out.println(i);//11 </div> <div style="margin:0px; padding:0px"> System.out.println(j);//10 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.out.println(++i); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> int i = 10; </div> <div style="margin:0px; padding:0px"> i = i++; //10 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 赋值运算符: = += -= *= /= %= </div> <div style="margin:0px; padding:0px"> int i = 10; </div> <div style="margin:0px; padding:0px"> i += 5; //i = i + 5; </div> <div style="margin:0px; padding:0px"> System.out.println(i); //15 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 【面试题】 </div> <div style="margin:0px; padding:0px"> short s = 5; </div> <div style="margin:0px; padding:0px"> s = s + 1;//编译? NO </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> s += 1; //编译? YES s = (short)(s + 1); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 比较运算符(关系运算符) : == != > < >= <= (运算后结果都为 boolean 型) </div> <div style="margin:0px; padding:0px"> int a = 10; </div> <div style="margin:0px; padding:0px"> int b = 20; </div> <div style="margin:0px; padding:0px"> boolean b1 = a == b; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 逻辑运算符: && -短路与 ||-短路或 !-逻辑非 &-逻辑与 |-逻辑或 ^-异或 (运算后结果都为 boolean 型) </div> <div style="margin:0px; padding:0px"> //需求:判断一个数是否大于10 小于20 </div> <div style="margin:0px; padding:0px"> int a = 10; </div> <div style="margin:0px; padding:0px"> //10 < a < 20; 错误的做法 </div> <div style="margin:0px; padding:0px"> boolean b2 = a > 10 && a < 20; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 【面试题】 && 和 & 的区别? </div> <div style="margin:0px; padding:0px"> && : 称为短路与,当左边表达式结果为 false 时,右边表达式将不再运算 </div> <div style="margin:0px; padding:0px"> & : 是位运算符,当用于逻辑运算时,无论左边表达式结果为true还是false,右边都运算 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 位运算符 : ~ | & ^ << >> >>> 注意:没有 <<< </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三元运算符(三目运算符) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 条件表达式 ? 表达式1 : 表达式2; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ①当条件表达式结果为 true 时,执行表达式1 ,否则执行表达式2 </div> <div style="margin:0px; padding:0px"> ②表达式1和表达式2的结果类型需要保持一致! </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、流程控制: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 顺序结构 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 分支结构 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 条件判断: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> if(条件表达式){ </div> <div style="margin:0px; padding:0px"> //当条件表达式结果为 true 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> if(条件表达式){ </div> <div style="margin:0px; padding:0px"> //当条件表达式结果为 true 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> }else{ </div> <div style="margin:0px; padding:0px"> //当条件表达式结果为 false 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> if(条件表达式1){ </div> <div style="margin:0px; padding:0px"> //当条件表达式1 结果为 true 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> }else if(条件表达式2){ </div> <div style="margin:0px; padding:0px"> //当条件表达式2 结果为 true 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> }else if(条件表达式3){ </div> <div style="margin:0px; padding:0px"> //当条件表达式3 结果为 true 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> …… </div> <div style="margin:0px; padding:0px"> else{ </div> <div style="margin:0px; padding:0px"> //当上述条件表达式结果都为 false 时,需要执行的语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 注意: </div> <div style="margin:0px; padding:0px"> ①当某个条件表达式结果为true, 执行相应的语句,其他 else if 将不再执行 </div> <div style="margin:0px; padding:0px"> ②if-else 语句可以嵌套的 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 选择结构: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> switch(表达式){ </div> <div style="margin:0px; padding:0px"> case 值1 : </div> <div style="margin:0px; padding:0px"> //执行的语句 </div> <div style="margin:0px; padding:0px"> break; </div> <div style="margin:0px; padding:0px"> case 值2 : </div> <div style="margin:0px; padding:0px"> //执行的语句 </div> <div style="margin:0px; padding:0px"> //break; </div> <div style="margin:0px; padding:0px"> case 值3 : </div> <div style="margin:0px; padding:0px"> //执行的语句 </div> <div style="margin:0px; padding:0px"> break; </div> <div style="margin:0px; padding:0px"> …… </div> <div style="margin:0px; padding:0px"> default : </div> <div style="margin:0px; padding:0px"> //执行的语句 </div> <div style="margin:0px; padding:0px"> break; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 注意: </div> <div style="margin:0px; padding:0px"> ①表达式结果的数据类型,只能是 byte short char int 枚举 String(jdk1.7后) </div> <div style="margin:0px; padding:0px"> ②表达式结果的数据类型要与case后值的类型需要保持一致! </div> <div style="margin:0px; padding:0px"> ③default 是可选的 </div> <div style="margin:0px; padding:0px"> ④break 也是可选的,若与某个case后的值匹配成功,依次向下执行,直到遇到break为止。' </div> <div style="margin:0px; padding:0px"> ⑤case 后只能写常量值,不能写表达式 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //需求:若一个数大于2 小于5 打印 “2-5” </div> <div style="margin:0px; padding:0px"> int i = 2; </div> <div style="margin:0px; padding:0px"> switch(i){ </div> <div style="margin:0px; padding:0px"> case 1: </div> <div style="margin:0px; padding:0px"> System.out.println("一"); </div> <div style="margin:0px; padding:0px"> break; </div> <div style="margin:0px; padding:0px"> case 2: </div> <div style="margin:0px; padding:0px"> case 3: </div> <div style="margin:0px; padding:0px"> case 4: </div> <div style="margin:0px; padding:0px"> case 5: </div> <div style="margin:0px; padding:0px"> System.out.println("2-5"); </div> <div style="margin:0px; padding:0px"> break; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 循环结构: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ①初始化值 </div> <div style="margin:0px; padding:0px"> ②循环条件 </div> <div style="margin:0px; padding:0px"> ③迭代条件 </div> <div style="margin:0px; padding:0px"> ④循环体 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> for(① ; ② ; ③){ </div> <div style="margin:0px; padding:0px"> ④ </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ①②④③②④③②④③②……④③② </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ① </div> <div style="margin:0px; padding:0px"> while(②){ </div> <div style="margin:0px; padding:0px"> ④ </div> <div style="margin:0px; padding:0px"> ③ </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ① </div> <div style="margin:0px; padding:0px"> do{ </div> <div style="margin:0px; padding:0px"> ④ </div> <div style="margin:0px; padding:0px"> ③ </div> <div style="margin:0px; padding:0px"> }while(②); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> while 和 do-while 的区别? </div> <div style="margin:0px; padding:0px"> while : 先判断循环条件,再执行循环体 </div> <div style="margin:0px; padding:0px"> do-while : 先执行循环体,再判断循环条件。(至少执行一次) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、嵌套循环: 一个循环充当了另一个循环的循环体 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 打印100以内的质数: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> boolean flag = true; </div> <div style="margin:0px; padding:0px"> for(int i = 2; i <= 100; i++){ </div> <div style="margin:0px; padding:0px"> for(int j = 2; j < i; j++){ </div> <div style="margin:0px; padding:0px"> if(i % j == 0){ </div> <div style="margin:0px; padding:0px"> flag = false; </div> <div style="margin:0px; padding:0px"> break; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> if(flag){ </div> <div style="margin:0px; padding:0px"> System.out.println(i); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> flag = true; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、特殊流程控制语句 </div> <div style="margin:0px; padding:0px"> break: 结束“当前”循环 。当用于switch-case语句时,用于结束当前 switch-case 语句 </div> <div style="margin:0px; padding:0px"> continue: 结束“当次”循环 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> label:for(int i = 0; i < 100; i++){ </div> <div style="margin:0px; padding:0px"> for(int j = 0; j < 100; j++){ </div> <div style="margin:0px; padding:0px"> if(j == 13){ </div> <div style="margin:0px; padding:0px"> System.out.println(j); </div> <div style="margin:0px; padding:0px"> break label; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> </td> </tr> </tbody> </table> <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">02.方法的声明和使用</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">方法的声明和使用</span></span> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、方法:也叫函数,是一个功能的定义。是一个类中最基本的功能单元 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //需求: 计算一个数 * 2 + 1 的结果 </div> <div style="margin:0px; padding:0px"> int a = 10; </div> <div style="margin:0px; padding:0px"> System.out.println(a * 2 + 1); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> a = 5; </div> <div style="margin:0px; padding:0px"> System.out.println(a * 2 + 1); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> a = 8; </div> <div style="margin:0px; padding:0px"> System.out.println(a * 2 + 1); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1.方法的格式: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 修饰符 返回值类型 方法名(参数列表){ </div> <div style="margin:0px; padding:0px"> //功能语句 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> return 返回值; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 返回值类型:说明方法运行后有结果,那个结果的数据类型。 </div> <div style="margin:0px; padding:0px"> 参数列表:就是局部变量,可以有0个或多个,每个参数之间以 “,” 分隔 </div> <div style="margin:0px; padding:0px"> return : 用于结束当前方法 </div> <div style="margin:0px; padding:0px"> 返回值:方法运行结束后,返回具体结果的值 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public static int result(int a){ //形式参数: 用于接收调用者传递的实际参数 </div> <div style="margin:0px; padding:0px"> return a * 2 + 1; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> result(10);//实际参数 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 方法的注意: </div> <div style="margin:0px; padding:0px"> ①“返回值类型”与 “返回值”的数据类型需要保持一致 </div> <div style="margin:0px; padding:0px"> ②调用方法通过方法名和参数列表,注意方法名和参数列表(参数的个数、参数的类型)必须一致 </div> <div style="margin:0px; padding:0px"> ③若声明了“返回值类型”说明该方法运行后有结果,若调用者需要用到该结果 </div> <div style="margin:0px; padding:0px"> 可以声明同类型变量接收。 </div> <div style="margin:0px; padding:0px"> ④若方法运行结束后,不需要返回任何结果给调用者时,方法“返回值类型”处声明为 void </div> <div style="margin:0px; padding:0px"> void : 表示没有返回值 </div> <div style="margin:0px; padding:0px"> ⑤方法中只能调用方法,不能声明其他方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 声明方法的两点明确 </div> <div style="margin:0px; padding:0px"> ①方法是否需要返回结果给调用者 </div> <div style="margin:0px; padding:0px"> 明确是否需要返回值类型,返回值类型是什么 </div> <div style="margin:0px; padding:0px"> ②方法是否有未知的数据参与运算 </div> <div style="margin:0px; padding:0px"> 明确是否需要参数列表,需要几个 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、跨类调用方法: </div> <div style="margin:0px; padding:0px"> 通过“类名.方法名" 方式调用。 (暂时使用static修饰的方法为例) </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、参数的值传递</span></span> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 基本数据类型:将基本数据类型作为参数,传递给方法,方法运行结束后,原值不会发生改变 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //改变两个数的值 </div> <div style="margin:0px; padding:0px"> public static void add(int a, int b){ </div> <div style="margin:0px; padding:0px"> a += 1; </div> <div style="margin:0px; padding:0px"> b += 2; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public static void main(String[] args){ </div> <div style="margin:0px; padding:0px"> int a = 10; </div> <div style="margin:0px; padding:0px"> int b = 20; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> add(a, b); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.out.println("a=" + a + " b=" + b);//a=10, b=20 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 引用数据类型: </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(107,231,72)"><span style="font-size:21px">方法重载 Overload :</span></span> </div> <div style="margin:0px; padding:0px"> 前提:在同一个类中 </div> <div style="margin:0px; padding:0px"> ①方法名相同 </div> <div style="margin:0px; padding:0px"> ②参数列表不同(参数的个数、参数的类型) </div> <div style="margin:0px; padding:0px"> 注意:与返回值类型无关 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(char c, int a){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(int a, char c){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(int a, char c, double d){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(String str, int a){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void shows(char c, int a){} </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> </tbody> </table> <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">03. 面向对象编程(上)</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(107,231,72)"><span style="font-size:21px">一、面向对象编程(OOP)</span></span> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 面向对象和面向过程: </div> <div style="margin:0px; padding:0px"> 面向过程:强调的是功能行为 </div> <div style="margin:0px; padding:0px"> 面向对象:将功能行为封装进对象,强调的是具备了功能行为的对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> (理解)把大象装冰箱一共分几步? </div> <div style="margin:0px; padding:0px"> ①打开冰箱 ②把大象装进去(存储大象) ③关闭冰箱 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 如何使用面向对象思想思考上述问题呢? </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 人{ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 拉(冰箱){ </div> <div style="margin:0px; padding:0px"> 冰箱.打开() </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 指挥(动物){ </div> <div style="margin:0px; padding:0px"> 动物.进入() </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 推(冰箱){ </div> <div style="margin:0px; padding:0px"> 冰箱.关闭() </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 冰箱{ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 打开(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 存储(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 关闭(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 大象{ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 进入(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 猴{ </div> <div style="margin:0px; padding:0px"> 进入(){} </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 狮子{ </div> <div style="margin:0px; padding:0px"> 进入(){} </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 面向对象更加注重前期的设计 </div> <div style="margin:0px; padding:0px"> ①就是对类的设计 </div> <div style="margin:0px; padding:0px"> ②设计类就是设计类的成员:属性 & 方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 面向对象:将现实生活中一类事物的共性内容进行提取,抽象成相应Java类,用Java中类对其进行描述 </div> <div style="margin:0px; padding:0px"> 现实生活中的事物: 小猫 小狗 大象 </div> <div style="margin:0px; padding:0px"> 共性内容: 名称 性别 年龄 吃饭的功能 睡觉的功能 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Animal{ </div> <div style="margin:0px; padding:0px"> //属性 </div> <div style="margin:0px; padding:0px"> String name; </div> <div style="margin:0px; padding:0px"> char gender; </div> <div style="margin:0px; padding:0px"> int age; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //方法-行为 </div> <div style="margin:0px; padding:0px"> public void eat(){ </div> <div style="margin:0px; padding:0px"> System.out.println("吃饭"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void sleep(){ </div> <div style="margin:0px; padding:0px"> System.out.println("睡觉"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 若需要具体到某一个事物,通过 new 关键字创建对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Animal a1 = new Animal(); // </div> <div style="margin:0px; padding:0px"> a1.name = "大象"; </div> <div style="margin:0px; padding:0px"> a1.gender = '男'; </div> <div style="margin:0px; padding:0px"> a1.age = 2; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> a1.eat(); </div> <div style="margin:0px; padding:0px"> a1.sleep(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.out.println(a1.name + "," + a1.age); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 类和对象: </div> <div style="margin:0px; padding:0px"> 类:对现实生活中一类事物的描述,抽象的 </div> <div style="margin:0px; padding:0px"> 对象:是一个实实在在的个体 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、属性:也叫成员变量,也叫实例变量 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 成员变量 & 局部变量 的区别? </div> <div style="margin:0px; padding:0px"> ①作用域不同 </div> <div style="margin:0px; padding:0px"> ②内存中的位置不同 </div> <div style="margin:0px; padding:0px"> ③成员变量有默认值,而局部变量没有默认值(局部变量使用前必须赋初始值) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 成员变量的默认值: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 基本数据类型: </div> <div style="margin:0px; padding:0px"> byte short int ---> 0 </div> <div style="margin:0px; padding:0px"> long ---> 0L </div> <div style="margin:0px; padding:0px"> float ---> 0.0F </div> <div style="margin:0px; padding:0px"> double ---> 0.0D </div> <div style="margin:0px; padding:0px"> char ---> '\u0000' </div> <div style="margin:0px; padding:0px"> boolean ---> false </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 引用数据类型: ---> null </div> <div style="margin:0px; padding:0px"> |-- 类(class) </div> <div style="margin:0px; padding:0px"> |-- 接口(interface) </div> <div style="margin:0px; padding:0px"> |-- 数组([]) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2.为属性赋初始化值的方式 </div> <div style="margin:0px; padding:0px"> ①使用默认值 </div> <div style="margin:0px; padding:0px"> ②直接显示赋值 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、参数的值传递: </div> <div style="margin:0px; padding:0px"> 基本数据类型: 将基本数据类型作为参数,传递给方法,方法运行结束后,原值不会发生改变 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 引用数据类型: 将引用数据类型作为参数,传递给方法,方法运行结束后,原值会发生改变 </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 内存管理: </div> <div style="margin:0px; padding:0px"> 分配: JVM自动为其分配内存空间 </div> <div style="margin:0px; padding:0px"> 释放:JVM通过垃圾回收机制自动的释放内存空间 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 垃圾回收机制: 将内存中的垃圾对象释放 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 垃圾对象:不再被任何引用指向的对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p = new Person(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> p = null; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.gc(); //通知垃圾回收机制可以释放内存,但是并不能保证立即释放,加快释放。 </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(107,231,72)">一、面向对象的特性之一:封装性</span></span> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 封装的理解: 该隐藏的隐藏起来,该暴露的暴露出来 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 访问控制修饰符: </div> <div style="margin:0px; padding:0px"> public : 公共的,可用于修饰属性、方法、类。 在任何地方都可以访问 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> private : 私有的,可用于修饰属性、方法。 只能在本类中访问 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 封装的步骤: </div> <div style="margin:0px; padding:0px"> ①属性私有化(private) </div> <div style="margin:0px; padding:0px"> ②提供公共的(public) get/set 方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Animal{ </div> <div style="margin:0px; padding:0px"> //1. </div> <div style="margin:0px; padding:0px"> private String name; </div> <div style="margin:0px; padding:0px"> private int legs; //描述腿的个数 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //2. </div> <div style="margin:0px; padding:0px"> public void setName(String n){ </div> <div style="margin:0px; padding:0px"> name = n; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public String getName(){ </div> <div style="margin:0px; padding:0px"> return name; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public ovid setLegs(int l){ </div> <div style="margin:0px; padding:0px"> if(l > 0 && l <= 4){ </div> <div style="margin:0px; padding:0px"> legs = l; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public int getLegs(){ </div> <div style="margin:0px; padding:0px"> return legs; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Animal ani = new Animal(); </div> <div style="margin:0px; padding:0px"> ani.name = "大象"; </div> <div style="margin:0px; padding:0px"> ani.legs = -1000; </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(107,231,72)">一、this 关键字:</span></span>使用在本类中,代表当前对象。可以用于调用属性、方法、构造器 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> this.属性 </div> <div style="margin:0px; padding:0px"> this.方法 </div> <div style="margin:0px; padding:0px"> this(……): </div> <div style="margin:0px; padding:0px"> ①this调用本类构造器,必须写在构造器中可执行代码的首行 </div> <div style="margin:0px; padding:0px"> ②若一个类中有多个构造器,至少有一个构造器中不使用this (避免递归构造器调用) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 谁让拥有this关键字的方法运行,谁就是当前对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Person{ </div> <div style="margin:0px; padding:0px"> private String name; </div> <div style="margin:0px; padding:0px"> private int age; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void setName(String name){ </div> <div style="margin:0px; padding:0px"> this.name = name;//可以区分局部变量和成员变量 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p = new Person(); </div> <div style="margin:0px; padding:0px"> p.setName("张三"); </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(107,231,72)"><span style="font-size:21px">一、构造器:</span></span>也叫构造器方法,是类的成员之一。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 属性 </div> <div style="margin:0px; padding:0px"> 方法 </div> <div style="margin:0px; padding:0px"> 构造器 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 构造器的格式 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 访问控制修饰符 类名(参数列表){ </div> <div style="margin:0px; padding:0px"> //初始化语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 构造器的作用 </div> <div style="margin:0px; padding:0px"> ①创建对象 </div> <div style="margin:0px; padding:0px"> ②为对象进行初始化 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 构造器的注意: </div> <div style="margin:0px; padding:0px"> ①构造器的名称必须与类名一致! </div> <div style="margin:0px; padding:0px"> ②若一个类中没有显示提供任何构造器,系统会自动提供一个默认无参构造器 </div> <div style="margin:0px; padding:0px"> public Person(){} </div> <div style="margin:0px; padding:0px"> ③若一个类中显示的提供了任何构造器,系统默认构造器将不再提供 </div> <div style="margin:0px; padding:0px"> ④构造器只能调用一次,并且是在创建对象时调用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 4. 构造器的重载 </div> <div style="margin:0px; padding:0px"> ①构造器的名称必须相同 </div> <div style="margin:0px; padding:0px"> ②构造器的参数列表必须不同(参数的个数、参数的类型) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 5. 为属性赋初始值的方式 </div> <div style="margin:0px; padding:0px"> ①使用默认赋值 </div> <div style="margin:0px; padding:0px"> ②直接显示赋值 </div> <div style="margin:0px; padding:0px"> ③构造器 </div> <div style="margin:0px; padding:0px"> 顺序:①②③ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Person{ </div> <div style="margin:0px; padding:0px"> private String name; </div> <div style="margin:0px; padding:0px"> private int age; </div> <div style="margin:0px; padding:0px"> private char gender; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Person(){ </div> <div style="margin:0px; padding:0px"> cry(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Person(String name){ </div> <div style="margin:0px; padding:0px"> this.name = name; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Person(String name, int age){ </div> <div style="margin:0px; padding:0px"> this(name); </div> <div style="margin:0px; padding:0px"> this.age = age; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Person(String name, int age, char gender){ </div> <div style="margin:0px; padding:0px"> this(name, age); </div> <div style="margin:0px; padding:0px"> this.gender = gender; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void setName(String name){ </div> <div style="margin:0px; padding:0px"> this.name = name;//可以区分局部变量和成员变量 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void cry(){ </div> <div style="margin:0px; padding:0px"> System.out.println("哭"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p = new Person("张三"); </div> <div style="margin:0px; padding:0px"> //p.cry(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p1 = new Person(); </div> <div style="margin:0px; padding:0px"> //p1.cry(); </div> </td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、包的作用:</span></span> </div> <div style="margin:0px; padding:0px"> ①用于区分重命名 </div> <div style="margin:0px; padding:0px"> ②用于控制访问权限 </div> <div style="margin:0px; padding:0px"> ③用于划分项目的结构层次,通常将功能相近的类划分到同一个包中。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> package : 用于确定当前类的位置 </div> <div style="margin:0px; padding:0px"> ①使用在当前 .java 源文件可执行代码的首行 </div> <div style="margin:0px; padding:0px"> ②包的命名规范:所有字母都小写。 (通常将所在公司域名的倒置) </div> <div style="margin:0px; padding:0px"> 如: com.atguigu.项目名.模块名; </div> <div style="margin:0px; padding:0px"> ③每个“.”代表一层目录 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> import : 用于确定需要引入那个类的位置 </div> <div style="margin:0px; padding:0px"> ①使用在 package 和 class 之间 </div> <div style="margin:0px; padding:0px"> ②可以有多条,并排列出 </div> <div style="margin:0px; padding:0px"> ③ import com.atguigu.aaa.* : 代表导入 aaa 包中所有的类或接口。 注意:包除外 </div> <div style="margin:0px; padding:0px"> ④ 若在一个类中使用了两个相同类名不同包名的两个类。 如: java.util.Date; java.sql.Date; </div> <div style="margin:0px; padding:0px"> 选择一个使用导入的方式: import java.util.Date; </div> <div style="margin:0px; padding:0px"> 选择另外一个使用全限定类名(全类名)的方式: java.sql.Date date = new java.sql.Date(); </div> <div style="margin:0px; padding:0px"> ⑤静态导入: </div> <div style="margin:0px; padding:0px"> import static com.atguigu.aaa.StaticClass.*; // 导入一个类中所有的静态内容 </div> </td> </tr> </tbody> </table> <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">04.声明和使用数组</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> 一、数组:用于批量保存一类数据。是引用数据类型之一。 //变量的格式 : 数据类型 变量名 = 值; int j = 0; int j; j = 0; 2. 声明数组 int\[\] scores; String\[\] names; Person\[\] persons; 3.为数组初始化并赋值 //静态初始化: 初始化操作和赋值操作同时进行 scores = new int\[\]\{0,1,2,3,4,5\}; //动态初始化:初始化操作和赋值操作分开进行 names = new String\[5\]; //\{null, "张三", null, "李四", null\} names\[1\] = "张三"; names\[3\] = "李四"; 4. 获取数组中的元素 String str = names\[0\]; System.out.println(str); System.out.println(names\[1\]); System.out.println(names\[2\]); System.out.println(names\[3\]); System.out.println(names\[4\]); 5. 遍历数组的两种方式 方式一:使用普通for循环遍历数组 for(int i = 0; i < names.length; i++)\{ System.out.println(names\[i\]); \} 方式二:使用增强for循环遍历数组 for(被遍历数组中元素的数据类型 变量名 : 被遍历的数组)\{ \} for(String s : names)\{ System.out.println(s); \} 6. 数组的注意: ①无论是静态初始化还是动态初始化必须指明长度 ②数组中每个元素都有索引值(下角标、下标),索引值从0开始,到 数组的长度 - 1 ③数组的属性: length 用于获取数组的长度 7. 数组的默认值 基本数据类型: byte shor int ---> 0 long ---> 0L float ---> 0.0F double ---> 0.0D char ---> '\\u0000' boolean ---> false 引用数据类型: ---> null |-- 类(class) |-- 接口(interface) |-- 数组(\[\]) 二、二维数组 //声明一个二维数组 int\[\]\[\] arr; //为二维数组初始化并赋值 //静态初始化:初始化和赋值操作同时进行 arr = new int\[\]\[\]\{ \{1,2,3\}, \{4,5,6\}, \{7,8\} \} //动态初始化 //动态初始化-1 arr = new int\[5\]\[6\]; //\{ \{0,0,11,0,0,0\}, \{0,0,0,0,0,0\}, \{0,0,0,0,0,0\}, \{0,0,0,15,0,0\}, \{0,0,0,0,0,0\} \} arr\[0\]\[2\] = 11; arr\[3\]\[3\] = 15; //动态初始化-2 arr = new int\[5\]\[\]; //\{ null, \{0,11,0\}, null, \{0,0,0,22,0\}, null \}; arr\[1\] = new int\[3\]; arr\[3\] = new int\[5\]; arr\[1\]\[1\] = 11; arr\[3\]\[3\] = 22; //遍历二维数组 for(int i = 0; i < arr.length; i++)\{ for(int j = 0; j < arr\[i\].length; j++)\{ System.out.prin for(int a : as)\{t(arr\[i\]\[j\] + "\\t"); \} System.out.println(); \} for(int\[\] as : arr)\{ for(int a : as)\{ System.out.print(a + "\\t"); \} System.out.println(); \} 三、用于操作数组的工具类: java.util.Arrays; 四、命令行参数 通过: java HelloWorld abc ddd eee "Jane Smith" public static void main(String\[\] args)\{ for(int i = 0; i < args.length; i++)\{ System.out.println(args\[i\]); \} \} 五、可变参数 //需求:计算两个整数的和 /\*public int add(int a, int b)\{ return a + b; \} public int add(int a, int b, int c)\{ return a + b + c; \}\*/ /\*public int add(int\[\] arr)\{//可变参数与数组参数之间不能构成重载 int sum = 0; for(int i = 0; i < arr.length; i++)\{ sum += arr\[i\]; \} return sum; \}\*/ public int add(int ... args)\{ //当调用方法时,可以传递0个或多个 int 型实际参数 int sum = 0; for(int i = 0; i < args.length; i++)\{ sum += args\[i\]; \} return sum; \} public int add(String str, int ... args)\{//可变参数要写在参数列表的末尾 \} <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">05.面向对象编程(下)</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(77,206,29)">一、面向对象的特性之二: 继承</span></span> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 为什么使用继承 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ①提高代码的复用性 </div> <div style="margin:0px; padding:0px"> ②提高维护性 </div> <div style="margin:0px; padding:0px"> ③有了继承让类与类之间产生了关系,能够创建出更加特殊的类型(多态) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 如何使用继承 </div> <div style="margin:0px; padding:0px"> 关键字: extends ----- "扩展" 明确子类是父类的扩展 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> class A extends B{ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 子类: A 父类(超类、基类、SuperClass):B </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 通过继承,子类可以继承父类中所有的属性和方法。(包括私有的) </div> <div style="margin:0px; padding:0px"> 私有的属性也会被继承,但是因为 private 修饰符的作用,子类不能直接访问 </div> <div style="margin:0px; padding:0px"> 需要通过 公共的 get / set 方法进行访问 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 4. 继承的注意: </div> <div style="margin:0px; padding:0px"> ①不能为了简化代码,获取某功能而继承,若要完成继承两个类之间要有一定的所属关系:is a </div> <div style="margin:0px; padding:0px"> ②Java只支持单继承,不支持多继承。(一个父类可以有多个子类,但是一个子类只能有一个父类) </div> <div style="margin:0px; padding:0px"> ③Java支持多层继承。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class A{ </div> <div style="margin:0px; padding:0px"> void test1(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> void test2(){} </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class B extends A{ </div> <div style="margin:0px; padding:0px"> //void test1(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //void test2(){} </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> --------------------------- </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class A{ </div> <div style="margin:0px; padding:0px"> void test1(){ </div> <div style="margin:0px; padding:0px"> //111111111111 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class B{ </div> <div style="margin:0px; padding:0px"> void test1(){ </div> <div style="margin:0px; padding:0px"> //22222222222 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class C extends A, B{} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> C c = new C(); </div> <div style="margin:0px; padding:0px"> c.test1(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、方法的重写:当父类中的方法对于子类来说不适用的情况下,子类可以对父类中方法进行“重写” </div> <div style="margin:0px; padding:0px"> 前提: 要有继承关系,使用在子类中 </div> <div style="margin:0px; padding:0px"> ①方法名和参数列表必须相同 </div> <div style="margin:0px; padding:0px"> ②返回值类型可以不同,但是有规则(若重写方法返回值类型是父类被重写方法返回值类型的子类) </div> <div style="margin:0px; padding:0px"> ③子类重写方法的访问控制修饰符不能小于父类被重写方法的访问控制修饰符 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 【面试题】 Override 和 Overload 的区别? </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、super 和 this 的使用方式完全一致! </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> this : 使用在本类中,代表当前对象的引用 </div> <div style="margin:0px; padding:0px"> super : 使用在子类中,代表父类对象的引用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> super.属性 </div> <div style="margin:0px; padding:0px"> super.方法 </div> <div style="margin:0px; padding:0px"> super(……); 调用父类构造器 </div> <div style="margin:0px; padding:0px"> ①当子类继承父类后,子类“所有”构造器中默认第一行第一句都有一句: super() </div> <div style="margin:0px; padding:0px"> super : 当子类继承父类后,子类继承父类中所有的属性和方法,子类需要知道父类如何为对象进行初始化 </div> <div style="margin:0px; padding:0px"> ②若父类中没有提供无参构造器,子类“所有”构造器中必须显示调用父类有参构造器 </div> <div style="margin:0px; padding:0px"> (无论如何必须保证创建子类对象前,先初始化父类) </div> <div style="margin:0px; padding:0px"> ③super() 调用父类构造器,必须写在构造器中可执行代码的首行 </div> <div style="margin:0px; padding:0px"> 因此,this() 和 super() 不能同时出现 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、四种访问控制修饰符 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public : 公共的,可用于修饰 属性、方法、类。 在任何地方都可以使用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> protected: 受保护的,可用于修饰 属性、方法。 可以在 本类中、本包中、子类中 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> default : 默认的(缺省的) ,可用于修饰 属性、方法、类。 可以在 本类中、本包中 </div> <div style="margin:0px; padding:0px"> 注意:default 并不是访问控制修饰符的关键字,在什么都不加的情况下就是 default </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> private : 私有的,可用于修饰 属性、方法。 只能在 本类中 使用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、多态:一类事物的多种表现形态。</span></span> 人 - 男人 女人 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 多态的体现: ①方法的重载与重写 ②对象的多态性 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2.对象的多态性:父类的引用指向子类的对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p = new Man(); // 多态-向上转型 </div> <div style="margin:0px; padding:0px"> p.eat(); </div> <div style="margin:0px; padding:0px"> p.walk(); //虚拟方法调用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //p.smoking(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Man man = (Man)p; //向下转型 </div> <div style="margin:0px; padding:0px"> man.smoking(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Java程序的运行分为两种状态: </div> <div style="margin:0px; padding:0px"> 在多态的情况下,编译时, “看左边”,看的是父类的引用(父类中不具备子类特有的方法) </div> <div style="margin:0px; padding:0px"> 运行时,“看右边”,看的是子类对象,实际运行的是子类重写父类的方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ———— 以上过程被称为“虚拟方法调用(动态绑定)” </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 多态的前提:①要有继承关系 ②方法的重写(完成虚拟方法调用) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 4. 引用数据类型之间的转换: </div> <div style="margin:0px; padding:0px"> 前提:要有继承关系 </div> <div style="margin:0px; padding:0px"> 向上转型: 子类转父类。系统自动完成转换 </div> <div style="margin:0px; padding:0px"> 向下转型: 父类转子类。需要使用强转符 “(需要转换的类型)” </div> <div style="margin:0px; padding:0px"> 可能引发 java.lang.ClassCastException </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p = new Man(); </div> <div style="margin:0px; padding:0px"> Woman woman = (Woman)p; //编译? YES 运行? NO </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 5. Java 为了解决上述问题,提供了相应的解决办法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> instanceof 运算符: </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> p instanceof Man : 判断 p 引用指向的对象是不是 Man 的本类类型及 Man 的子类类型,如果是返回 true </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p = new Man(); </div> <div style="margin:0px; padding:0px"> if(p instanceof Woman){ </div> <div style="margin:0px; padding:0px"> Woman woman = (Woman)p; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、多态的应用 </div> <div style="margin:0px; padding:0px"> 多态的应用之一:多态数组 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person[] persons = new Person[3];//该多态数组中可以存放Person本类类型的对象及Person子类类型的对象 </div> <div style="margin:0px; padding:0px"> persons[0] = new Person(); </div> <div style="margin:0px; padding:0px"> persons[1] = new Man(); </div> <div style="margin:0px; padding:0px"> persons[2] = new Woman(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> for(int i = 0; i < persons.length; i++){ </div> <div style="margin:0px; padding:0px"> persons[i].eat();//虚拟方法调用 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 多态的应用之二: 多态参数 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //需求:展示一个男人吃饭和走路的功能 </div> <div style="margin:0px; padding:0px"> /*public void show(Man man){ </div> <div style="margin:0px; padding:0px"> man.eat(); </div> <div style="margin:0px; padding:0px"> man.walk() </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(Woman woman){ </div> <div style="margin:0px; padding:0px"> woman.eat(); </div> <div style="margin:0px; padding:0px"> woman.walk(); </div> <div style="margin:0px; padding:0px"> }*/ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(Person p){ //多态参数:当调用方法时,可以传递Person本类类型的对象及Person子类类型的对象 </div> <div style="margin:0px; padding:0px"> p.eat(); </div> <div style="margin:0px; padding:0px"> p.walk();//虚拟方法调用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> if(p instanceof Man){ </div> <div style="margin:0px; padding:0px"> Man man = (Man)p; </div> <div style="margin:0px; padding:0px"> man.smoking(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、对象的关联:</span></span>简单的说,是指一个对象中使用了另一个对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Teacher{ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> String name; </div> <div style="margin:0px; padding:0px"> int age; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Computer com; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Computer{ </div> <div style="margin:0px; padding:0px"> String cpu; </div> <div style="margin:0px; padding:0px"> String ram; </div> <div style="margin:0px; padding:0px"> String hdd; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、java.lang.Object 类: 是所有类的父类。若一个类没有显示的 extends 任何类时,默认的 extends java.lang.Object </div> <div style="margin:0px; padding:0px"> ①既然 java.lang.Object 类是所有类的父类,那么Object类中的内容是最具共性的,所有类都适用 </div> <div style="margin:0px; padding:0px"> ②既然 java.lang.Object 类是所有类的父类,那么Object类中方法都会被“继承” </div> <div style="margin:0px; padding:0px"> ③既然 java.lang.Object 类是所有类的父类,若Object类中的方法对于子类来说不适用,子类可以重写Object类中的方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. public boolean equals(Object obj) : 用于比较当前对象与参数对象是否相等 </div> <div style="margin:0px; padding:0px"> ①在 java.lang.Object 类中 </div> <div style="margin:0px; padding:0px"> ②只能比较引用数据类型是否相等 </div> <div style="margin:0px; padding:0px"> ③Object类中的equals方法比较两个对象的地址值。(通过查看源代码发现实际上使用 == 完成) </div> <div style="margin:0px; padding:0px"> ④若Object类中的equals() 方法对于我们来说不适用,我们可以重写 Object类中 equals() </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> “==”运算符: </div> <div style="margin:0px; padding:0px"> 基本数据类型: 比较两个基本数据类型的值是否相等,若相等返回 true </div> <div style="margin:0px; padding:0px"> 引用数据类型: 比较两个引用数据类型的地址值是否相等,若相等返回 true </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Person /* extends java.lang.Object*/{ </div> <div style="margin:0px; padding:0px"> String name; </div> <div style="margin:0px; padding:0px"> int age; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Person(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Person(String name, int age){ </div> <div style="margin:0px; padding:0px"> this.name = name; </div> <div style="margin:0px; padding:0px"> this.age = age; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //重写 </div> <div style="margin:0px; padding:0px"> public boolean equals(Object obj){ </div> <div style="margin:0px; padding:0px"> if(this == obj){ </div> <div style="margin:0px; padding:0px"> return true; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> if(obj instanceof Person){ </div> <div style="margin:0px; padding:0px"> Person p = (Person)obj; </div> <div style="margin:0px; padding:0px"> if(this.name.equals(p.name) && this.age == p.age){ </div> <div style="margin:0px; padding:0px"> return true; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> return false; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public String toString(){ </div> <div style="margin:0px; padding:0px"> return "姓名:" + name + “年龄:” + age; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //需求:若两个人的姓名年龄都一样,视为同一个人 </div> <div style="margin:0px; padding:0px"> Person p1 = new Person("张三", 18); </div> <div style="margin:0px; padding:0px"> Person p2 = new Person("张三", 18); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.out.println(p1.equals(p2)); //重写equals之前- false----重写后:true </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.out.println(p1); </div> <div style="margin:0px; padding:0px"> System.out.println(p1.toString()); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. public String toString() : 返回当前对象的字符串表现形式 </div> <div style="margin:0px; padding:0px"> ①在 java.lang.Object 类中 </div> <div style="margin:0px; padding:0px"> ②Object类中的toString方法返回的格式为: </div> <div style="margin:0px; padding:0px"> getClass.getName() + '@' + Integer.toHexString(hashCode()); </div> <div style="margin:0px; padding:0px"> 因此,Object类中的toString() 方法对于我们来说不适用,我们可以重写toString() </div> <div style="margin:0px; padding:0px"> ③当直接输出对象的引用时,默认调用 toString(); </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、static 修饰符:</span></span>代表静态的,可用于修饰 属性、方法、代码块、**内部类 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. static 修饰的属性(静态变量或类变量) </div> <div style="margin:0px; padding:0px"> ①随着类的加载而加载,随着类的消失而消失(生命周期最长) </div> <div style="margin:0px; padding:0px"> ②静态变量被该类所有对象所共享 </div> <div style="margin:0px; padding:0px"> ③一旦某个对象修改该属性值,其他对象也会随之改变 </div> <div style="margin:0px; padding:0px"> ④静态变量的存在优先于对象 </div> <div style="margin:0px; padding:0px"> ⑤可以通过 “类名.类变量”的方式调用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. static 修饰的方法(静态方法或类方法) </div> <div style="margin:0px; padding:0px"> ①随着类的加载而加载 </div> <div style="margin:0px; padding:0px"> ②静态方法的存在优先于对象 </div> <div style="margin:0px; padding:0px"> ③通过“类名.类方法”的方式调用 </div> <div style="margin:0px; padding:0px"> ④静态方法中不能调用非静态成员,非静态方法中可以调用静态成员 </div> <div style="margin:0px; padding:0px"> ⑤静态方法中不能使用 this 和 super </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 类变量和实例变量的区别? </div> <div style="margin:0px; padding:0px"> ①生命周期不同 </div> <div style="margin:0px; padding:0px"> ②内存中的位置不同 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、类的成员之一: 代码块 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 非静态代码块: </div> <div style="margin:0px; padding:0px"> ①格式: 类的一对 { } </div> <div style="margin:0px; padding:0px"> ②每次创建对象时执行 </div> <div style="margin:0px; padding:0px"> ③非静态代码块的执行优先于构造器 </div> <div style="margin:0px; padding:0px"> ④用于为对象进行初始化。(通常为共性内容进行初始化) </div> <div style="margin:0px; padding:0px"> ⑤代码块可以有多个,依次向下的顺序执行 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 静态代码块: </div> <div style="margin:0px; padding:0px"> ①格式:static{ } </div> <div style="margin:0px; padding:0px"> ②随着类的加载而加载,并且只加载一次 </div> <div style="margin:0px; padding:0px"> ③静态代码块的执行优先于非静态代码块 </div> <div style="margin:0px; padding:0px"> ④静态代码块中不可以调用非静态成员 </div> <div style="margin:0px; padding:0px"> ⑤静态代码块可以有多个,依次向下的顺序执行 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、final 修饰符: 代表最终的,可用于修饰 变量、方法、类。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> final 修饰的类不能被继承 </div> <div style="margin:0px; padding:0px"> final 修饰的方法不能被重写 </div> <div style="margin:0px; padding:0px"> final 修饰的变量叫常量,一旦被赋值,值不能改变 </div> <div style="margin:0px; padding:0px"> ①常量的命名规范:所有字母都大写,每个单词之间以 "_" 分隔 </div> <div style="margin:0px; padding:0px"> ②常量没有默认值,因此在使用前必须为常量赋初始值 </div> <div style="margin:0px; padding:0px"> 赋值方式(直接显示赋值、构造器、代码块) </div> <div style="margin:0px; padding:0px"> 若选择使用构造器为常量赋值,必须保证“所有”构造器都为该常量赋值 </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> </tbody> </table> <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">06. 高级类特性</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、抽象类</span></span> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 创建类用于描述现实生活中一类事物,类中有属性有方法,方法都有方法体。 </div> <div style="margin:0px; padding:0px"> 某种情况下,父类只能知道子类应该具备一个怎样的方法,但是不能明确知道子类如何实现该方法。 </div> <div style="margin:0px; padding:0px"> 例如:几何图形(多态练习),所有几何图形都应该具备一个计算面积的方法,但是不同几何图形计算面积的方式不同 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Java为上述问题提供了相应的解决办法 </div> <div style="margin:0px; padding:0px"> Java允许父类中只是提供一个方法的声明,不提供具体的实现 </div> <div style="margin:0px; padding:0px"> 具体的实现交给子类来完成,该方法被称“抽象方法” </div> <div style="margin:0px; padding:0px"> 拥有一个或多个抽象方法的类,称为“抽象类” </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、如何使用抽象 : abstract 关键字 </div> <div style="margin:0px; padding:0px"> 1. 使用 abstract 修饰的类称为“抽象类” </div> <div style="margin:0px; padding:0px"> ①格式: 访问控制修饰符 abstract class 类名{} </div> <div style="margin:0px; padding:0px"> ②拥有一个或多个抽象方法的类必须是抽象类 </div> <div style="margin:0px; padding:0px"> ③抽象类中可以有非抽象方法 </div> <div style="margin:0px; padding:0px"> ④抽象类中可以没有抽象方法的 </div> <div style="margin:0px; padding:0px"> ⑤***抽象类不能创建实例 </div> <div style="margin:0px; padding:0px"> ⑥抽象类中可以声明构造器。作用:当子类继承父类后继承父类中所有的属性和方法,因此子类需要知道父类如何为对象进行初始化 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 使用 abstract 修饰的方法称为“抽象方法” </div> <div style="margin:0px; padding:0px"> ①格式: 访问控制修饰符 abstract 返回值类型 方法名(参数列表); </div> <div style="margin:0px; padding:0px"> 注意:抽象方法没有方法体,因此也不需要那对 {} </div> <div style="margin:0px; padding:0px"> ②当子类继承父类后,若重写了父类中“所有”的抽象方法,该类为具体类,可以创建实例 </div> <div style="margin:0px; padding:0px"> ③当子类继承父类后,若没有重写父类中“所有”的抽象方法,该类必须是抽象类,不可以创建实例 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. </div> <div style="margin:0px; padding:0px"> abstract 和 static 不能同时使用 </div> <div style="margin:0px; padding:0px"> abstract 和 final 不能同时使用 </div> <div style="margin:0px; padding:0px"> abstract 和 private 不能同时使用 </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、接口:</span></span>可以定义多个不相关事物的相同功能 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、如何使用接口 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ①接口与类是平级的 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 关键字: interface </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public interface Flyer{} </div> <div style="margin:0px; padding:0px"> ②可以把接口理解为一个特殊的抽象类,因为接口中只能定义“全局静态常量”和“抽象方法” </div> <div style="margin:0px; padding:0px"> //全局静态常量 </div> <div style="margin:0px; padding:0px"> int NUM = 10;//public static final </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //抽象方法 </div> <div style="margin:0px; padding:0px"> void fly();//public abstract </div> <div style="margin:0px; padding:0px"> ③接口中不能定义一般方法、变量、构造器、代码块 </div> <div style="margin:0px; padding:0px"> ④**接口不能创建实例 </div> <div style="margin:0px; padding:0px"> ⑤接口就是用来被实现的 </div> <div style="margin:0px; padding:0px"> 关键字 : implements </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public class Bird implements Flyer{} </div> <div style="margin:0px; padding:0px"> ⑥实现接口的类被称为“实现类”,实现类的功能和“继承”功能一致, 都可以获取接口中所有的成员 </div> <div style="margin:0px; padding:0px"> ⑦若实现类实现了接口中“所有”的抽象方法,该类为具体类,可以创建实例 </div> <div style="margin:0px; padding:0px"> 若实现类没有实现接口中“所有”的抽象方法,该类必须是抽象类,不能创建实例 </div> <div style="margin:0px; padding:0px"> ⑧接口可以多实现 ----- 解决了Java中单继承的局限性 </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> public class Bird implements Flyer, Runner{} </div> <div style="margin:0px; padding:0px"> ⑨接口不可以继承任何类, 接口可以继承接口,接口可以多继承接口 </div> <div style="margin:0px; padding:0px"> ⑩一个类可以继承另一个类,同时实现多个接口 </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> public class Bird extends Animal implements Flyer, Runner{} </div> <div style="margin:0px; padding:0px"> 注意:先继承,后实现 </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(77,206,29)">一、内部类:</span></span>在一个类中声明另一个类。 里面的类:内部类 外面的类:外部类 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 成员内部类: </div> <div style="margin:0px; padding:0px"> ①是类的成员之一。 (属性、方法、构造器、代码块) </div> <div style="margin:0px; padding:0px"> ②内部类可以使用四种访问控制修饰符(public protected default private) </div> <div style="margin:0px; padding:0px"> ③static final </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //创建静态内部类对象 </div> <div style="margin:0px; padding:0px"> Person.Mobile pm = new Person.Mobile(); </div> <div style="margin:0px; padding:0px"> pm.message(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //创建非静态内部类对象 </div> <div style="margin:0px; padding:0px"> //Person p = new Person(); </div> <div style="margin:0px; padding:0px"> //Person.Computer pc = p.new Computer(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person.Computer pc = new Person().new Computer(); </div> <div style="margin:0px; padding:0px"> pc.show(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ④内部类的外部类拥有相同的特性。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Person{ </div> <div style="margin:0px; padding:0px"> Stirng name; </div> <div style="margin:0px; padding:0px"> int age; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //成员内部类 </div> <div style="margin:0px; padding:0px"> public class Computer{ </div> <div style="margin:0px; padding:0px"> String name; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public void show(){ </div> <div style="margin:0px; padding:0px"> System.out.println(this.name); </div> <div style="margin:0px; padding:0px"> System.out.println(Person.this.name);//区分内部类属性和外部类属性 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> static class Mobile{ </div> <div style="margin:0px; padding:0px"> public void message(){ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 局部内部类: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //如下方式使用非常少 </div> <div style="margin:0px; padding:0px"> public void show(){ </div> <div style="margin:0px; padding:0px"> class InnerClass{} </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //若某个类仅适用于当前方法时,可以声明为局部内部类 </div> <div style="margin:0px; padding:0px"> public Comparator getComparator(){ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class MyComparator implements Comparator{ </div> <div style="margin:0px; padding:0px"> public int compare(Object o1, Object o2){ </div> <div style="margin:0px; padding:0px"> return 0; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> return new MyComparator(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public Comparator getComparotor(){ </div> <div style="margin:0px; padding:0px"> //匿名内部类 </div> <div style="margin:0px; padding:0px"> Comparator com = new Comparator(){ </div> <div style="margin:0px; padding:0px"> public int compare(Object o1, Object o2){ </div> <div style="margin:0px; padding:0px"> return 0; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> }; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> return com; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> pulbic Comparator getComparator(){ </div> <div style="margin:0px; padding:0px"> return new Comparator(){ </div> <div style="margin:0px; padding:0px"> public int compare(Object o1, Object o2){ </div> <div style="margin:0px; padding:0px"> return 0; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> }; </div> <div style="margin:0px; padding:0px"> } </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、枚举类:jdk1.5后出的新特性,可以定义有限数量的可穷举数据集。 </div> <div style="margin:0px; padding:0px"> 简而言之,当确定一个类有几个对象时,使用枚举。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 自定义枚举类 </div> <div style="margin:0px; padding:0px"> ①私有化构造器 </div> <div style="margin:0px; padding:0px"> ②类内部创建对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> class Season{ </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //类内部创建对象 </div> <div style="margin:0px; padding:0px"> public static final Season SPRING = new Season(); </div> <div style="margin:0px; padding:0px"> public static final Season SUMMER = new Season(); </div> <div style="margin:0px; padding:0px"> public static final Season AUTUMN = new Season(); </div> <div style="margin:0px; padding:0px"> public static final Season WINTER = new Season(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //私有化构造器 </div> <div style="margin:0px; padding:0px"> private Season(){} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 使用 enum 关键字创建枚举类 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> enum Season{ </div> <div style="margin:0px; padding:0px"> SPRING, </div> <div style="margin:0px; padding:0px"> SUMMER, </div> <div style="margin:0px; padding:0px"> AUTUMN, </div> <div style="margin:0px; padding:0px"> WINTER; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 枚举类常用方法: </div> <div style="margin:0px; padding:0px"> > valueOf(String name) : 根据name枚举类对象名称,获取指定的枚举类对象 </div> <div style="margin:0px; padding:0px"> > values() : 获取当前枚举类中所有枚举类对象的数组 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 枚举类实现接口 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> public enum Season implements MyInterface{ </div> <div style="margin:0px; padding:0px"> SPRING{ </div> <div style="margin:0px; padding:0px"> public void show(){ </div> <div style="margin:0px; padding:0px"> System.out.println("春天"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> }, </div> <div style="margin:0px; padding:0px"> SUMMER{ </div> <div style="margin:0px; padding:0px"> public void show(){ </div> <div style="margin:0px; padding:0px"> System.out.println("夏天"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> }, </div> <div style="margin:0px; padding:0px"> AUTUMN{ </div> <div style="margin:0px; padding:0px"> public void show(){ </div> <div style="margin:0px; padding:0px"> System.out.println("秋天"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> }, </div> <div style="margin:0px; padding:0px"> WINTER{ </div> <div style="margin:0px; padding:0px"> public void show(){ </div> <div style="margin:0px; padding:0px"> System.out.println("冬天"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> }; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> // @Override </div> <div style="margin:0px; padding:0px"> // public void show() { </div> <div style="margin:0px; padding:0px"> // System.out.println("季节"); </div> <div style="margin:0px; padding:0px"> // } </div> <div style="margin:0px; padding:0px"> } </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、注解:</span></span> jdk1.5后出的新特性,注解是一个元数据。是一个代码级别的说明。 </div> <div style="margin:0px; padding:0px"> 在 Java 中以 “@注解名”的方式呈现 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. JDK 内置的常用注解 </div> <div style="margin:0px; padding:0px"> @Override: 限定重写父类方法, 该注释只能用于方法 </div> <div style="margin:0px; padding:0px"> @Deprecated: 用于表示某个程序元素(类, 方法等)已过时 </div> <div style="margin:0px; padding:0px"> @SuppressWarnings: 抑制编译器警告 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 自定义注解 </div> <div style="margin:0px; padding:0px"> public @interface MyAnnotation{ </div> <div style="margin:0px; padding:0px"> String value() default "atguigu"; </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 元注解 </div> <div style="margin:0px; padding:0px"> * @Retention : 描述注解的生命周期 </div> <div style="margin:0px; padding:0px"> * @Target : 描述注解可以修饰哪些程序元素 </div> <div style="margin:0px; padding:0px"> * @Documented : 描述注解可以随之生成说明文档 (该注解生命周期必须为 RUNTIME) </div> <div style="margin:0px; padding:0px"> * @Inherited: 被它修饰的 Annotation 将具有继承性. </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> </tbody> </table> <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">07.基础API与异常处理</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; width:840px; table-layout:fixed; margin-left:0px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、包装类(包裹类 Wrapper)</span></span> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Java针对八种基本数据类型提供了对应的包装类 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 基本数据类型 包装类 </div> <div style="margin:0px; padding:0px"> byte Byte </div> <div style="margin:0px; padding:0px"> short Short </div> <div style="margin:0px; padding:0px"> int Integer </div> <div style="margin:0px; padding:0px"> long Long </div> <div style="margin:0px; padding:0px"> float Float </div> <div style="margin:0px; padding:0px"> double Double </div> <div style="margin:0px; padding:0px"> char Character </div> <div style="margin:0px; padding:0px"> boolean Boolean </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 基本数据类型与包装类之间的转换 </div> <div style="margin:0px; padding:0px"> * 装箱:将基本数据类型转换成对应的包装类 </div> <div style="margin:0px; padding:0px"> * ①通过对应包装类的构造器 </div> <div style="margin:0px; padding:0px"> * ②通过对应包装类的静态方法 valueOf() </div> <div style="margin:0px; padding:0px"> * </div> <div style="margin:0px; padding:0px"> * 拆箱:将包装类转换成对应的基本数据类型 </div> <div style="margin:0px; padding:0px"> * ①通过对应包装类 xxxValue() 方法。 xxx:表示基本数据类型 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 自动装箱和自动拆箱 </div> <div style="margin:0px; padding:0px"> int i = 10; </div> <div style="margin:0px; padding:0px"> Integer num = i; //自动装箱 </div> <div style="margin:0px; padding:0px"> int i1 = num; //自动拆箱 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 注意: Integer提供了一个小的缓存(-128~127)之间,若需要装箱的值在该取值范围内 </div> <div style="margin:0px; padding:0px"> 则从缓存中取一个实例。若超出该取值范围则重新 new 一个 Integer 实例 </div> <div style="margin:0px; padding:0px"> Integer num1 = 100; </div> <div style="margin:0px; padding:0px"> Integer num2 = 100; </div> <div style="margin:0px; padding:0px"> System.out.println(num1 == num2);//true </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Integer num3 = 129; </div> <div style="margin:0px; padding:0px"> Integer num4 = 129; </div> <div style="margin:0px; padding:0px"> System.out.println(num3 == num4); //false </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 基本数据类型、包装类 与 String之间的转换 </div> <div style="margin:0px; padding:0px"> * 1.基本数据类型、包装类 转 String </div> <div style="margin:0px; padding:0px"> * ① String str = i + ""; </div> <div style="margin:0px; padding:0px"> * ② 使用 String 类的静态方法 valueOf() </div> <div style="margin:0px; padding:0px"> * ③ 通过对应包装类的静态方法 toString() </div> <div style="margin:0px; padding:0px"> * </div> <div style="margin:0px; padding:0px"> * 2.String 转 基本数据类型、包装类 </div> <div style="margin:0px; padding:0px"> * ① 通过对应包装类的构造器 </div> <div style="margin:0px; padding:0px"> * ② 通过对应包装类的静态方法 parseXxx() : Xxx :表示基本数据类型 </div> <div style="margin:0px; padding:0px"> * 注意:没有parseChar() </div> <div style="margin:0px; padding:0px"> * ③ 通过对应包装类的静态方法 valueOf() </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、java.lang.String 类: 不可变的字符序列 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> String str1 = "abc"; </div> <div style="margin:0px; padding:0px"> String str2 = new String("abc"); </div> <div style="margin:0px; padding:0px"> 二者之间的区别? </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> str1 : 代表一个对象,至少在内存中开辟一块内存空间 </div> <div style="margin:0px; padding:0px"> str2 : 代表两个对象,至少在内存中开辟两块内存空间 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. String 类的常用方法 </div> <div style="margin:0px; padding:0px"> * 1. 获取字符串的方法: </div> <div style="margin:0px; padding:0px"> * ①String concat(String str):串接字符串 </div> <div style="margin:0px; padding:0px"> * ②String substring(int beginIndex):获取取字符串的子串 </div> <div style="margin:0px; padding:0px"> * String substring(int beginIndex, endIndex) : 包含头不包含尾 </div> <div style="margin:0px; padding:0px"> * ③String toLowerCase()和String toUpperCase():转换为小写/大写 </div> <div style="margin:0px; padding:0px"> * ④String trim():删除首尾空格或制表符 </div> <div style="margin:0px; padding:0px"> * 2. 搜索方法: </div> <div style="margin:0px; padding:0px"> * ①int indexOf(int ch) : 获取指定字符在字符串中的位置,若没有指定的字符,返回 -1 </div> <div style="margin:0px; padding:0px"> * int indexOf(int ch, int fromIndex) : 从指定位置开始搜索 </div> <div style="margin:0px; padding:0px"> * int indexOf(String str) </div> <div style="margin:0px; padding:0px"> * int indexOf(String str, int fromIndex) </div> <div style="margin:0px; padding:0px"> * int lastIndexOf(int ch) : 反向获取指定字符位置 </div> <div style="margin:0px; padding:0px"> * 3. 判断方法: </div> <div style="margin:0px; padding:0px"> * ① boolean equals(Object obj):判断是否相等 </div> <div style="margin:0px; padding:0px"> * boolean equalsIgnoreCase(String str):判断是否相等,不考虑大小写 </div> <div style="margin:0px; padding:0px"> * ② boolean contains(String str) :判断是否包含某字符串 </div> <div style="margin:0px; padding:0px"> * ③ boolean startsWith(String str)和 boolean endsWith(String str):判断是否以指定字符串开始/结尾 </div> <div style="margin:0px; padding:0px"> * ④ boolean isEmpty():判断字符串是否为空 </div> <div style="margin:0px; padding:0px"> * 4. 其它方法: </div> <div style="margin:0px; padding:0px"> * ①length():返回字符串长度 </div> <div style="margin:0px; padding:0px"> * ②char charAt(int index):返回索引处的字符 </div> <div style="margin:0px; padding:0px"> * ③将字符数组转换为字符串 </div> <div style="margin:0px; padding:0px"> * 构造器: </div> <div style="margin:0px; padding:0px"> * String(char[] ch) </div> <div style="margin:0px; padding:0px"> * String(char[] ch, offset, count) : 将数组中一部分转换为字符串 </div> <div style="margin:0px; padding:0px"> * 静态方法: </div> <div style="margin:0px; padding:0px"> * static String copyValueOf(char[] ch) </div> <div style="margin:0px; padding:0px"> * static String copyValueOf(char[] ch, offset, count) </div> <div style="margin:0px; padding:0px"> * static String valueOf(char[]) </div> <div style="margin:0px; padding:0px"> * 将字符串转换字符数组: char[] toCharArray() </div> <div style="margin:0px; padding:0px"> * ④String replace(char oldCahr, char newCahr) : 替换字符串中字符 </div> <div style="margin:0px; padding:0px"> * String replace(String oldStr, String newStr):替换字符串中字符串 </div> <div style="margin:0px; padding:0px"> * ⑤String[] split(String r):根据指定符号切割 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、StringBuffer 和 StringBuilder : 可变的字符序列,二者具备相同的API </div> <div style="margin:0px; padding:0px"> StringBuffer 和 StringBuilder 的区别? </div> <div style="margin:0px; padding:0px"> StringBuffer : 是线程安全的,因此效率低 </div> <div style="margin:0px; padding:0px"> StringBuilder : 是线程不安全的,因此效率高 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> * StringBuffer 和 StringBuilder 的常用方法: </div> <div style="margin:0px; padding:0px"> * ① StringBuffer append(String str) : 添加 </div> <div style="margin:0px; padding:0px"> * StringBuffer insert(int offset, String str) : 插入 </div> <div style="margin:0px; padding:0px"> * StringBuffer replace(int start, int end, String str):替换 </div> <div style="margin:0px; padding:0px"> * </div> <div style="margin:0px; padding:0px"> * ② int indexOf(String str) :返回子串的位置索引 </div> <div style="margin:0px; padding:0px"> * int lastIndexOf() </div> <div style="margin:0px; padding:0px"> * </div> <div style="margin:0px; padding:0px"> * ③ String substring(int start, int end):取子字符串序列 </div> <div style="margin:0px; padding:0px"> * ④ StringBuffer delete(int start, int end):删除一段字符串 </div> <div style="margin:0px; padding:0px"> * StringBuffer deleteCharAt(int index):删除指定位置字符 </div> <div style="margin:0px; padding:0px"> * ⑤ String toString():转换为String对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、其他常用类 </div> <div style="margin:0px; padding:0px"> 1、java.util.Date : 表示特定的瞬间,精确到毫秒 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2、java.text.DateFormat : 用于格式化时间/日期。但是是一个抽象类 </div> <div style="margin:0px; padding:0px"> |---java.text.SimpleDateFormat : 是 DateFormat 的子类 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E"); </div> <div style="margin:0px; padding:0px"> String strDate = sdf.format(date); </div> <div style="margin:0px; padding:0px"> System.out.println(strDate);//2015-12-07 09:23:37 星期一 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Date newDate = sdf.parse(strDate); </div> <div style="margin:0px; padding:0px"> System.out.println(newDate); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3、java.lang.Math : 用于操作数学运算 </div> <div style="margin:0px; padding:0px"> double ceil(double d) : 返回不小于d的最小整数 </div> <div style="margin:0px; padding:0px"> double floor(double d): 返回不大于d的最大整数 </div> <div style="margin:0px; padding:0px"> int round(float f) : 返回最接近f的int型(四舍五入) </div> <div style="margin:0px; padding:0px"> long round(double d):返回最接近d的long型 </div> <div style="margin:0px; padding:0px"> double abs(double d): 绝对值 </div> <div style="margin:0px; padding:0px"> double max(double d1, double d2) : 返回较大值 </div> <div style="margin:0px; padding:0px"> int min(int i1, int i2) : 返回较小值 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> double random() : 返回一个大于等于0.0并且小于1.0的随机数 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 五【了解】 </div> <div style="margin:0px; padding:0px"> java.lang.System : 系统类 </div> <div style="margin:0px; padding:0px"> java.util.Calendar : 日历类 </div> <div style="margin:0px; padding:0px"> java.math.BigInteger : 支持任意精度的整数 </div> <div style="margin:0px; padding:0px"> java.math.BigDecimal : 支持任意精度的小数 </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="color:rgb(77,206,29)"><span style="font-size:21px">一、异常:</span></span>不可预知的非正常情况 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Java中的异常都是以对象形式存在的,一旦某句代码发生异常,会在该代码处生成一个异常对象 </div> <div style="margin:0px; padding:0px"> 然后以堆栈式抛出,若不对其进行处理,程序终止运行。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、异常的结构体系: </div> <div style="margin:0px; padding:0px"> java.lang.Throwable : 是所有错误和异常的父类 </div> <div style="margin:0px; padding:0px"> |--- java.lang.Error: 错误,一些严重的错误。 如: 内存溢出,系统错误等。 我们在代码中不做处理 </div> <div style="margin:0px; padding:0px"> |--- java.lang.Exception: 异常,我们需要尽可能预知并处理的异常。如: 用于输入有误、网络连接中断等等。 </div> <div style="margin:0px; padding:0px"> |--- 编译时异常(受检异常 checked):编译时对其进行检查,若不处理编译不能通过 </div> <div style="margin:0px; padding:0px"> |--- 运行时异常(非受检异常 unchecked):可以保证程序的正常运行。一旦发生该异常,会在该代码处生成一个异常对象 </div> <div style="margin:0px; padding:0px"> 以堆栈式抛出,若不处理,系统终止运行。 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、异常的处理机制: Java中异常的处理采用的是抓抛模型 </div> <div style="margin:0px; padding:0px"> “抛”:一旦某句代码发生异常,会在该代码处生成一个异常对象然后以堆栈式抛出。(自动抛出/手动抛出) </div> <div style="margin:0px; padding:0px"> “抓”:将上述抛出的异常进行捕获处理 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 异常的处理方式一: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> try{ </div> <div style="margin:0px; padding:0px"> //可能发生异常的语句 </div> <div style="margin:0px; padding:0px"> }catch(Exception1 e1){//异常的类型 变量名 </div> <div style="margin:0px; padding:0px"> //异常的处理语句 </div> <div style="margin:0px; padding:0px"> }catch(Exception2 e2){ </div> <div style="margin:0px; padding:0px"> //异常的处理语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> …… </div> <div style="margin:0px; padding:0px"> finally{ </div> <div style="margin:0px; padding:0px"> //一定被执行的语句 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ①catch 块可以有多个,一旦与某个catch块匹配成功,执行相应的语句,其他catch块将不再执行 </div> <div style="margin:0px; padding:0px"> ②catch 块可以有多个,若catch块中的异常类型具备子父类关系,必须“子上父下” </div> <div style="margin:0px; padding:0px"> ③try-catch可以嵌套的 </div> <div style="margin:0px; padding:0px"> ④finally 是可选的,一旦写上,一定会被执行,即便有 return </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 异常的处理方式二: throws 关键字 (处理异常的方式是将异常抛出给调用者做具体的处理) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 格式:使用在方法的声明处,后面跟异常的类型 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> public static void dic(int a, int b) throws NumberFormatException, Exception{} </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、throw 关键字: 制造异常 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 格式: 使用在方法体内,后面跟异常的对象 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> public static void div(int a, int b){ </div> <div style="margin:0px; padding:0px"> if(b == 0){ </div> <div style="margin:0px; padding:0px"> throw new RuntimeException("除数不能为零"); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 【面试题】 throw 和 throws 的区别? </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> throw 不仅可以抛出Java提供的异常,还可以抛出自定义异常 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 五、自定义异常 </div> <div style="margin:0px; padding:0px"> ①声明一个类继承一个异常类(继承Exception 该异常为编译时异常,继承RuntimeException该异常为运行时异常) </div> <div style="margin:0px; padding:0px"> ②编写构造器(通常利用构造器为 getMessage() 方法设置值) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 六、异常处理的常用方法 </div> <div style="margin:0px; padding:0px"> printStackTrace() : 打印异常的详细信息。 </div> <div style="margin:0px; padding:0px"> String getMessage() : 返回异常的描述信息 </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <img alt="" style="max-width:100%; height:auto"> </div> </td> </tr> </tbody> </table> <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">08.集合与泛型</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> 一、集合:就像是一种容器。用于存储、获取、操作对象的容器。 1. 数组的弊端 ①数组的长度不可变 ②数组没有提供可以查看有效元素个数的方法 2. 集合的特点 ①集合的长度是可变的 ②集合可以存储任意类型的对象 ③集合只能存储对象 3. 集合框架 java.util.Collection : 集合层次的根接口 |--- java.util.List: 有序的,可以重复的。 |--- ArrayList: 采用数组结构存储元素。 查询操作多时选择 |--- LinkedList: 采用链表结构存储元素。 增删操作多时选择 |--- Vector: |--- java.util.Set: 无序的,不允许重复。 |--- HashSet : 是 Set 接口的典型实现类。 判断元素是否存在的依据是:先比较 hashCode 值,若 hashCode 存在,再通过 equals() 比较内容 若 hashCode 值不存在,则直接存储 注意:重写 hashCode 和 equals 二者需要保持一致! |--- LinkedHashSet: 相较于 HashSet 多了链表维护元素的顺序。遍历效率高于 HashSet , 增删效率低于 HashSet |--- TreeSet : 拥有自己排序方式 |-- 自然排序(Comparable): ①需要添加 TreeSet 集合中对象的类实现 Comparable 接口 ②实现 compareTo(Object o) 方法 |-- 定制排序(Comparator) ①创建一个类实现 Comparator 接口 ②实现 compare(Object o1, Object o2) 方法 ③将该实现类的实例作为参数传递给 TreeSet 的构造器 4. 集合的遍历 ① 增强 for 循环 for(被遍历集合中元素的数据类型 变量名 : 被遍历的集合)\{ \} ArrayList al = new ArrayList(); al.add("AA"); al.add("BB"); for(Object obj : al)\{ System.out.println(obj); \} ② 使用 Iterator 迭代器 //1)获取当前集合的迭代器 Iterator it = al.iterator(); while(it.hasNext())\{ Object obj = it.next(); System.out.println(obj); \} /\*错误的做法:通常一个 hasNext() 配合一个 next() 使用 Iterator it = al.iterator(); while(it.hasNext())\{ Object obj = it.next(); System.out.println(it.next()); \}\*/ ③ ListIterator : 列表迭代器,是List特有的迭代器(了解) ListIterator li = al.listIterator(); while(li.hasNext())\{ Object obj = li.next(); if(obj.equals("BB"))\{ li.set("BBBBBBBBBBb"); \} \} 二、Map系列集合 java.util.Map : 用于存储成对对象的集合。具有 key(键)-value(值)对映射关系的集合。一个 key 对应着一个 value。 key不允许重复的。 |--- HashMap:是 Map接口的典型实现类。 |--- LinkedHashMap: 相较于 HashMap 多了链表维护元素的顺序 |--- Hashtable: 是线程安全的,因此效率低 |--- Properties : 用于操作属性文件 |--- TreeMap : 根据 key 拥有自己的排序方式 |-- 自然排序(Comparable): |-- 定制排序(Comparator): //使用 Properties 操作属性文件 @Test public void test1() throws FileNotFoundException, IOException\{ //1. 创建 Properties 对象 Properties props = new Properties(); //2. 通过 load() 方法加载属性文件 props.load(new FileInputStream("hello.properties")); //3. 通过 getProperty() 方法根据key获取对应的value String userName = props.getProperty("username"); String password = props.getProperty("password"); System.out.println(userName); System.out.println(password); \} 1. Map的常用方法: 添加、删除操作: Object put(Object key,Object value) Object remove(Object key) void putAll(Map t) void clear() 元素查询的操作: Object get(Object key) boolean containsKey(Object key) boolean containsValue(Object value) int size() boolean isEmpty() boolean equals(Object obj) 2. Map 的遍历: Map map = new HashMap(); map.put("AA", 123); map.put("BB", 456); keySet(); //遍历Map的方式一: 获取 Map 中所有的 key Set set = map.keySet(); values(); //遍历Map的方式二:获取 Map中所有的 value Collection coll = map.values(); //遍历Map的方式三: 获取Map中所有的 Entry (是Map 的一个内部类,一个Entry对应着Map中的一个key和一个value) Set entrySet = map.entrySet(); for(Object obj : entrySet)\{ Entry entry = (Entry)obj; Object key = entry.getKey(); Object value = entry.getValue(); \} Iterator it = entrySet.iterator(); while(it.hasNext())\{ Entry entry = (Entry)it.next(); Object key = entry.getKey(); Object value = entry.getValue(); \} 三、 为什么使用泛型:若集合中不使用泛型,意味着集合中可以添加任意类型的对象。若需要具体到某一个类型时,需要强制类型转换 可能引发 ClassCastException 泛型: 在 Java 中以 "<>" 的形式呈现,<> 中写引用数据类型 用于限制集合中存放元素的类型 1. 在集合中应用泛型 2. 自定义泛型类、接口、方法 class DAO<T>\{ // T : Type E:Element K:Key V:Value private List<T> list = new ArrayList<T>(); public void add(T t)\{ list.add(t); \} public T get(int id)\{ return list.get(id); \} //自定义泛型方法 public <E> E\[\] srot(E\[\] e)\{ \} \} 3. 通配符 ? 虽然 Person 是 Student 的父类,但是 List<Person> 就不是 List<Student> 的父类 //需求: //public void show(List<Student> list)\{\} //public void show1(List<Man> list)\{\} public void show(List<? extends Person> list)\{\} List<?> : 可以接收任意带泛型类型的集合 List<? extends Person> : 可以接收 Person 本类类型及 Person子类类型带泛型类型的集合 List<? super Person> : 可以接收 Person 本类类型及 Person父类类型带泛型类型的集合 <table style="word-break:initial"> <tbody> <tr style="vertical-align:top"> <td> <h1 style="margin-top:0.67em; margin-bottom:0.67em">09.IO流与多线程</h1> <strong>作者:</strong> 风离紫竹</td> </tr> </tbody> </table> <table style="word-break:initial; border-collapse:collapse; table-layout:fixed; margin-left:0px; width:840px"> <tbody> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> 一、IO流的分类 </div> <div style="margin:0px; padding:0px"> 1.按流向不同:输入流、输出流(以程序为主体) </div> <div style="margin:0px; padding:0px"> 2.按数据不同:字节流、字符流(字节流操作非文本文件 .jpg .avi .rmvb .mp3 字符流操作文本本件 .txt .java) </div> <div style="margin:0px; padding:0px"> 3.按角色不同:节点流、处理流 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、IO流的结构体系 </div> <div style="margin:0px; padding:0px"> 抽象基类 节点流 缓冲流(处理流的一种) </div> <div style="margin:0px; padding:0px"> InputStream FileInputStream BufferedInputStream </div> <div style="margin:0px; padding:0px"> OutputStream FileOutputStream BufferedOutputStream(flush() - 用于清空缓冲区) </div> <div style="margin:0px; padding:0px"> Reader FileReader BufferedReader (readLine()) </div> <div style="margin:0px; padding:0px"> Writer FileWriter BufferedWriter (newLine() ) </div> <div style="margin:0px; padding:0px"> <img alt="" style="max-width:100%; height:auto"> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <img alt="" style="max-width:100%; height:auto"> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //使用缓冲流完成文件的复制 </div> <div style="margin:0px; padding:0px"> public static void copyFile(String src, String dest){ </div> <div style="margin:0px; padding:0px"> //2. 创建缓冲流对象(BufferedInputStream),包装现有节点流 </div> <div style="margin:0px; padding:0px"> BufferedInputStream bis = null; </div> <div style="margin:0px; padding:0px"> //4. 创建缓冲流对象(BufferedOutputStream), 包装现有节点流 </div> <div style="margin:0px; padding:0px"> BufferedOutputStream bos = null; </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> //1. 创建 FileInputStream 对象,同时打开指定文件 </div> <div style="margin:0px; padding:0px"> FileInputStream fis = new FileInputStream(src); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> bis = new BufferedInputStream(fis); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //3. 创建 FileOutputStream 对象,同时打开指定文件 </div> <div style="margin:0px; padding:0px"> FileOutputStream fos = new FileOutputStream(dest); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> bos = new BufferedOutputStream(fos); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //5. 使用缓冲流读取指定文件的内容 </div> <div style="margin:0px; padding:0px"> byte[] b = new byte[1024]; </div> <div style="margin:0px; padding:0px"> int len = 0; </div> <div style="margin:0px; padding:0px"> while((len = bis.read(b)) != -1){ </div> <div style="margin:0px; padding:0px"> //6. 使用缓冲流将读取的内容写到目标文件 </div> <div style="margin:0px; padding:0px"> bos.write(b, 0, len); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> // bos.flush(); //用于强制清空缓冲区 </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } finally { </div> <div style="margin:0px; padding:0px"> //7. 关闭流 </div> <div style="margin:0px; padding:0px"> if(bos != null){ </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> bos.close(); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> if(bis != null){ </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> bis.close(); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、对象流: ObjectInputStream & ObjectOutputStream </div> <div style="margin:0px; padding:0px"> 序列化:将内存中的对象永久的以二进制形式保存到磁盘中 </div> <div style="margin:0px; padding:0px"> ①创建节点流对象 </div> <div style="margin:0px; padding:0px"> ②使用缓冲流包装节点流(可选的) </div> <div style="margin:0px; padding:0px"> ③使用对象流包装缓冲流对象 </div> <div style="margin:0px; padding:0px"> ④进行序列化操作 </div> <div style="margin:0px; padding:0px"> ⑤关闭流 </div> <div style="margin:0px; padding:0px"> ⑥需要序列化对象所属的类需要实现 java.io.Serializable 接口 </div> <div style="margin:0px; padding:0px"> ⑦提供一个序列号 private static final long serialVersionUID = 1234256L; </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 注意:static 和 transient 修饰的属性不能被序列化 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> // 对象的序列化 </div> <div style="margin:0px; padding:0px"> @Test </div> <div style="margin:0px; padding:0px"> public void test3() { </div> <div style="margin:0px; padding:0px"> Person p1 = new Person("张三", 18, new Computer(), "唐朝"); </div> <div style="margin:0px; padding:0px"> Person p2 = new Person("李四", 28, new Computer(), "唐朝"); </div> <div style="margin:0px; padding:0px"> Person p3 = new Person("王五", 25, new Computer(), "唐朝"); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> ObjectOutputStream oos = null; </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> FileOutputStream fos = new FileOutputStream("person.dat"); </div> <div style="margin:0px; padding:0px"> BufferedOutputStream bos = new BufferedOutputStream(fos); </div> <div style="margin:0px; padding:0px"> oos = new ObjectOutputStream(bos); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> oos.writeObject(p1); </div> <div style="margin:0px; padding:0px"> oos.writeObject(p2); </div> <div style="margin:0px; padding:0px"> oos.writeObject(p3); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } finally { </div> <div style="margin:0px; padding:0px"> if (oos != null) { </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> oos.close(); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 反序列化:将磁盘中的对象读取 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> //对象的反序列化 </div> <div style="margin:0px; padding:0px"> @Test </div> <div style="margin:0px; padding:0px"> public void test4() { </div> <div style="margin:0px; padding:0px"> ObjectInputStream ois = null; </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> FileInputStream fis = new FileInputStream("person.dat"); </div> <div style="margin:0px; padding:0px"> BufferedInputStream bis = new BufferedInputStream(fis); </div> <div style="margin:0px; padding:0px"> ois = new ObjectInputStream(bis); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Person p1 = (Person) ois.readObject(); </div> <div style="margin:0px; padding:0px"> Person p2 = (Person) ois.readObject(); </div> <div style="margin:0px; padding:0px"> Person p3 = (Person) ois.readObject(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> System.out.println(p1); </div> <div style="margin:0px; padding:0px"> System.out.println(p2); </div> <div style="margin:0px; padding:0px"> System.out.println(p3); </div> <div style="margin:0px; padding:0px"> } catch (ClassNotFoundException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } finally { </div> <div style="margin:0px; padding:0px"> if (ois != null) { </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> ois.close(); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、控制台IO : </div> <div style="margin:0px; padding:0px"> System.in : “标准”的输入流 </div> <div style="margin:0px; padding:0px"> System.out : “标准”的输出流 ---- 通过 System 类中 setOut() 方法可以改变 println() 的默认输出位置 </div> <div style="margin:0px; padding:0px"> System.err : “标准”的错误输出流 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 打印流 : PrintStream & PrintWriter </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 五、转换流: InputStreamReader & OutputStreamWriter </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> @Test </div> <div style="margin:0px; padding:0px"> public void test1(){ </div> <div style="margin:0px; padding:0px"> BufferedReader br = null; </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> InputStream in = System.in; </div> <div style="margin:0px; padding:0px"> InputStreamReader isr = new InputStreamReader(in); </div> <div style="margin:0px; padding:0px"> br = new BufferedReader(isr); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> String str = null; </div> <div style="margin:0px; padding:0px"> while((str = br.readLine()) != null){ </div> <div style="margin:0px; padding:0px"> System.out.println("--" + str); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } finally { </div> <div style="margin:0px; padding:0px"> if(br != null){ </div> <div style="margin:0px; padding:0px"> try { </div> <div style="margin:0px; padding:0px"> br.close(); </div> <div style="margin:0px; padding:0px"> } catch (IOException e) { </div> <div style="margin:0px; padding:0px"> e.printStackTrace(); </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 七、其他IO流 </div> <div style="margin:0px; padding:0px"> 数据流: DataInputStream & DataOutputStream </div> <div style="margin:0px; padding:0px"> 随即存取文件流: RandomAccessFile </div> <div style="margin:0px; padding:0px"> >seek(long l) </div> <div style="margin:0px; padding:0px"> >getFilePointer(); </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 八、java.io.File 类 : 用于表示文件/目录。可用于新建、删除、重命名等基本功能的操作 </div> <div style="margin:0px; padding:0px"> 但是若需要操作文件的内容,File 就无能为力,需要使用IO流 </div> <div style="margin:0px; padding:0px"> 通常File对象与IO流配合使用 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 访问文件名: </div> <div style="margin:0px; padding:0px"> getName() </div> <div style="margin:0px; padding:0px"> getPath() </div> <div style="margin:0px; padding:0px"> getAbsoluteFile() </div> <div style="margin:0px; padding:0px"> getAbsolutePath() </div> <div style="margin:0px; padding:0px"> getParent() </div> <div style="margin:0px; padding:0px"> renameTo(File newName) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 文件检测 </div> <div style="margin:0px; padding:0px"> exists() </div> <div style="margin:0px; padding:0px"> canWrite() </div> <div style="margin:0px; padding:0px"> canRead() </div> <div style="margin:0px; padding:0px"> isFile() </div> <div style="margin:0px; padding:0px"> isDirectory() </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 获取常规文件信息 </div> <div style="margin:0px; padding:0px"> lastModified() </div> <div style="margin:0px; padding:0px"> length() </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 文件操作相关 </div> <div style="margin:0px; padding:0px"> createNewFile() </div> <div style="margin:0px; padding:0px"> delete() </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 目录操作相关 </div> <div style="margin:0px; padding:0px"> mkDir() </div> <div style="margin:0px; padding:0px"> mkDirs() </div> <div style="margin:0px; padding:0px"> list() </div> <div style="margin:0px; padding:0px"> listFiles() </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> <tr style="vertical-align:top"> <td style="border:1px solid rgb(211,211,211); padding:10px; margin:0px; width:819px"> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(107,231,72)"><br> </span></span> </div> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(107,231,72)"><br> </span></span> </div> <div style="margin:0px; padding:0px"> <span style="font-size:21px"><span style="color:rgb(107,231,72)"><br> </span></span> </div> <div style="margin:0px; padding:0px"> <span style="color:rgb(107,231,72)"><span style="font-size:21px">一、多线程</span></span> </div> <div style="margin:0px; padding:0px"> 什么是程序? 为了完成某项特定的任务,使用某种语言,编写一组指令的集合。 </div> <div style="margin:0px; padding:0px"> 什么是进程? 一个正在进行中的程序。 </div> <div style="margin:0px; padding:0px"> 什么是线程? 在一个进程中执行的一套功能流程,称为线程 </div> <div style="margin:0px; padding:0px"> 在一个进程中执行的多套功能流程,称为多线程 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 二、为什么使用多线程? </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 抢占式策略系统: 系统会分配给每个执行任务的线程一个很小的时间段,当该时间段用完后 </div> <div style="margin:0px; padding:0px"> 系统会剥夺其使用权,交给其他线程去执行 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 多线程可以提高程序的效率,可以尽可能的利用cpu的资源 </div> <div style="margin:0px; padding:0px"> 2. 增强用户体验 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 三、如何使用多线程? </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 创建执行线程的方式一: </div> <div style="margin:0px; padding:0px"> ①创建一个类继承 Thread 类 </div> <div style="margin:0px; padding:0px"> ②重写 run() 方法,同时编写线程执行体 </div> <div style="margin:0px; padding:0px"> ③创建该子类的实例 </div> <div style="margin:0px; padding:0px"> ④调用 start() 方法,启动线程。默认执行 run() 方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 创建执行线程的方式二: </div> <div style="margin:0px; padding:0px"> ①创建一个类实现 Runnable 接口 </div> <div style="margin:0px; padding:0px"> ②实现接口中的 run() 方法,同时编写线程执行体 </div> <div style="margin:0px; padding:0px"> ③创建该实现类的实例 </div> <div style="margin:0px; padding:0px"> ④创建 Thread 实例,将实现类的实例作为参数,传递给Thread的构造器 </div> <div style="margin:0px; padding:0px"> ⑤调用 Thread 类的 start() 方法,启动线程。默认执行 run() 方法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 继承方式与实现方式的区别? </div> <div style="margin:0px; padding:0px"> ①当需要多个线程访问共享数据时,首选使用实现 Runnable 接口的方式 </div> <div style="margin:0px; padding:0px"> ②实现 Runnable 接口,解决了Java中单继承的局限性 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 四、线程的常用方法 </div> <div style="margin:0px; padding:0px"> currentThread() : 获取当前线程 </div> <div style="margin:0px; padding:0px"> getName() : 获取线程名称 </div> <div style="margin:0px; padding:0px"> setName() : 设置线程名称 </div> <div style="margin:0px; padding:0px"> start() : 启动线程 </div> <div style="margin:0px; padding:0px"> sleep(long millis) : 是一个静态方法,使当前线程进入睡眠状态 </div> <div style="margin:0px; padding:0px"> join() / join(long millis) : 是一个实例方法, 使当前线程进入阻塞状态 </div> <div style="margin:0px; padding:0px"> interrupt() : 用于唤醒阻塞状态的线程 </div> <div style="margin:0px; padding:0px"> yield() : 线程让步 </div> <div style="margin:0px; padding:0px"> isAlive() : 判断线程是否处于存活状态 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 五、线程的优先级(1-10):默认的优先级为 5。 优先级高并不意味着线程一定先执行, 只不过更多的获取cpu的资源 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> MAX_PRIORITY : 10 </div> <div style="margin:0px; padding:0px"> NORM_PRIORITY : 5 </div> <div style="margin:0px; padding:0px"> MIN_PRIORITY : 1 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> getPriority() : 获取线程的优先级 </div> <div style="margin:0px; padding:0px"> setPriority() : 设置线程的优先级 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 六、线程的生命周期 </div> <div style="margin:0px; padding:0px"> <img alt="" style="max-width:100%; height:auto"> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 七、线程同步: </div> <div style="margin:0px; padding:0px"> 模拟售票程序:实现三个窗口同时售票100张 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 问题: 当三个线程同时访问共享数据时,出现了 无序、重复、超额售票等多线程安全问题 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 解决办法:将多个线程需要访问的共享数据包装起来,确保一次只能有一个线程执行流访问该共享数据 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> Java为上述问题也提供了相应的解决办法 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 1. 同步代码块: </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> synchronized(同步监视器){ </div> <div style="margin:0px; padding:0px"> //需要访问的共享数据 </div> <div style="margin:0px; padding:0px"> } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 同步监视器:俗称“锁”,可以使用任意对象充当。但是确保多个线程持有同一把锁(同一个对象) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 2. 同步方法:使用在方法的声明处,加 synchronized 关键字 </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 如: </div> <div style="margin:0px; padding:0px"> public synchronized void show(){ } </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> 3. 同步锁: Lock 接口 </div> <div style="margin:0px; padding:0px"> 注意:必须保证手动的释放锁 (unlock()) </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> <div style="margin:0px; padding:0px"> <br> </div> </td> </tr> </tbody> </table>
还没有评论,来说两句吧...