昨日知识点复习
- 抽象类是对什么的抽象?接口是对什么抽象?
- 抽象类对事物的抽象 -> Worker(工人) Student(学生) -> Person(抽象类)
- 接口是对行为的抽象 -> WoodDoor(木门) 铁Door(铁门) -> Open(接口)
- 抽象类的修饰关键字是什么?接口的修饰关键字是什么?
- abstract -> 抽象类
- interface -> 接口
- 抽象类和接口的区别是什么?
- 语法层面
- 抽象类
- 成员变量(变量+常量)
- 成员方法(构造方法/Get/Set)
- 接口
- 成员变量(常量 -> final static)
- 抽象方法(现阶段我们就认为接口中只有抽象方法即可[可以省略public abstract].)
- 抽象类
- 设计层面
- 抽象类对事物的抽象/接口是对行为的抽象
- 语法层面
- Java中是单继承多实现(一个类只能继承一个父类,但是可以实现多个接口),接口是多继承.
A.类名作为形参和返回值 6分7秒 掌握
- 问题回顾与知识总结
- 方法的形参和返回值是具体类,那么实际传入和返回的是什么?
- 就是具体类的对象.
- 方法的形参和返回值是具体类,那么实际传入和返回的是什么?
B.抽象类名作为形参和返回值 5分8秒 掌握
- 问题回顾与知识总结
- 方法的形参和返回值都是抽象类名,那么实际传入的和返回的是什么?
- 抽象类的子类对象 -> 形参是抽象类名的比较多用,返回值是抽象类名的JDK的源码中有,但是我们以后不怎么用.
- 方法的形参和返回值都是抽象类名,那么实际传入的和返回的是什么?
- 练习
- 写一个抽象Person类,子类Worker -> Work(Person) 10分钟
C.接口名作为形参和返回值 5分2秒 掌握
- 问题回顾与知识总结
- 方法的形参和返回值都是接口类名,那么实际传入的和返回是什么?
- 传入和返回的就是该接口的实现类对象.
- 方法的形参和返回值都是接口类名,那么实际传入的和返回是什么?
- 练习
- 写一个接口 -> Opening 写一个类Door实现Opening 测试类测试一下.
D.内部类 4分7秒 理解
-
问题回顾与知识总结
-
什么是内部类?
- 在同一个类A的内部定义一个类B,类B就是内部类,类A相对于类B的外部类.
-
内部类的格式是什么?
-
public class Outer{ //定义内部类的格式 -> 修饰符 class 类名. public class Inner{ public void show(){ } } public void method(){ } }
-
-
内部类成员的访问特点是什么?
- 内部类成员的访问特点是想访问先创建对象.
-
E.成员内部类 6分56秒 了解
-
问题回顾与知识总结
-
内部类的分类有哪两种?
- 成员内部类/局部内部类
-
成员内部类的定义在类中的什么位置?
- 类中方法外.
-
外界如何使用成员内部类?
-
内部类是被public修饰
-
public class Outer{ //定义内部类的格式 -> 修饰符 class 类名. public class Inner{ public void show(){ } } } //想要访问到Inner内部类的show方法 -> Inner对象 -> 能直接创建吗?不能,因为Inner是Outer的内部类,想要创建Inner必须先创建Outer. Outer.Innter oi = new Outer().new Inner();
-
-
内部类不是被public修饰
-
public class Outer{ //定义内部类的格式 -> 修饰符 class 类名. private class Inner{ public void show(){ } } //Inner是被private所修饰的,私有的,只能在Outer类中访问Inner,只能在Outer类中创建Inner对象. public void createInner(){ Inner i = new Inner(); i.show(); } } Outer o = new Outer(); o.createInner();
-
-
-
F.局部内部类 3分55秒 了解
- 问题回顾与知识总结
- 局部内部类定义在类中的什么位置?
- 方法中.
- 外界如何使用局部内部类?
- 在定义了内部类的方法中创建内部类对象并调用内部类的方法.
- 内部类(肿瘤) -> 可以访问到外部类的成员变量/方法,但是外部类想访问内部类必须要创建对象.
- 局部内部类定义在类中的什么位置?
G.匿名内部类 8分29秒 掌握
-
问题回顾与知识总结
-
匿名内部类的使用前提是什么?
- 有一个类/接口(类可以是具体类/抽象类) -> 接口
-
匿名内部类的格式是什么?
-
new 类名/接口名(){ //重写方法; };
-
-
匿名内部类的本质是什么?
- 是一个继承了该类或者实现了该接口的子类匿名对象(只能用1次.)
-
如果要多次调用匿名内部类可以使用什么方式?
- 复制粘贴(不推荐)
- 使用多态的方式创建对象.
- 写一个实现类.
-
什么情况下我们推荐使用匿名内部类? -> JavaSE进阶的阶段会经常使用匿名内部类.
- 接口中的方法只有1个/2个需要去实现的时候,匿名内部类只使用1次的时候.
-
-
练习
- 练习匿名内部类的使用 -> 10分钟.
H.匿名内部类在开发中的使用 5分59秒 练习
I.Math 10分30秒 理解
- 问题回顾与知识总结
- 如果一个类中没有构造方法,或者构造方法是私有的,那么我们应该如何使用这个类中的方法/成员?
- 查看类中的方法是不是都是静态的(被static修饰的) -> 如果是的话可以直接通过类名.方法名()进行调用.
- Math类的中的哪个方法可以四舍五入一个数字?
- round(float f); -> 四舍五入
- Math类的获取随机数的方法取值范围是多少?
- Math.random(); -> 返回一个[0.0,1.0) -> 可以将结果*100再转换int类型获取到一个随机数,0-99.
- 如果一个类中没有构造方法,或者构造方法是私有的,那么我们应该如何使用这个类中的方法/成员?
- 练习
- 练习Math类的相关方法 -> 10分钟
J.System 7分17秒 理解
-
问题回顾与知识总结
-
System类中终止运行当前Java虚拟机的方法是什么?需要传递什么参数?
- System.exit(0) -> 传0表示正常退出,以后基本不会使用这个方法.
-
System类中currentTimeMills方法是做什么用的?返回了一个long类型的值,这个值是如何计算出来的?
- 记录当前的时间点 -> Long类型的值=运行这行代码的时间距离1970年1月1日00:00:00过了多少毫秒.
-
System类中currentTimeMills方法可以用来做什么?
- 记录方法的运行时间 -> 更加好的解决方法(JMH)
-
拓展的System类的方法有哪些?
-
nanoTime -> 与currentTimeMills一致,只不过获取的是纳秒.
-
arrayCopy
-
native关键代表本地方法 -> 这个方法不是Java语言实现的,实际是通过底层的C语言实现的.
-
/* arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 1.Object src -> 源数组. 2.int srcPos -> 从源数组的第几个索引开始复制. 3.Object dest -> 目的地数组. 4.int destPos -> 粘贴到目的地数组的第几个索引. 5.int length -> 复制多少个元素. */ int[] srcArr = {1,2,3,4,5,6,7,8,9}; int[] destArr = new int[3]; System.arraycopy(srcArr,2,destArr,0,destArr.length);
-
-
-
获取时间的方法只是相对精准,不是绝对精准,因为系统的不同.
-
-
练习
- 练习System类的方法 -> 10分钟.
K.Object类的toString()方法 9分59秒 掌握
-
问题回顾与知识总结
-
Object类是什么类?
- Object是Java所有类直接或者间接的父类.
-
我们直接打印对象,打印出来的是对象的全限定类名+@+地址值,执行流程是什么?
-
public static void main(String[] args) { Student s = new Student(); System.out.println(s); } public void println(Student s) { //将学生对象s传递到valueOf方法中返回了一个字符串. String s = String.valueOf(s); } public static String valueOf(Student s) { /* 判断传递进来的Student对象s是不是null,如果为null的话,将字符串"null"返回. 如果s不是null,则调用s的toString()方法,但是Student类并没有toString方法,但是Student类继承了Object类,子类没有找父类,所以说虽然是s.toString,但是实际上调用是Object类的toString方法. */ return (s == null) ? "null" : s.toString(); } //Object类的toString()方法. public String toString() { //com.itheima.obejct_01.Student@3d71hda return getClass().getName() + "@" + Integer.toHexString(hashCode()); } //Student类本身的toString方法,如果重写了之后,那么s.toString调用就是下面这个方法. @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", school='" + school + '\'' + '}'; }
-
-
我们为什么要重写toString方法?
- 归根结底的目的就是为了打印对象的时候可以直接打印出对象的属性.
-
每个自定义的类都要重写toString()方法即可.
-
L.Object类的equals()方法 11分5秒 掌握
-
问题回顾与知识总结
-
我们对比两个引用类型的值是否相同为什么不用==来比较?
- ==实际上比较的两个对象的地址值,左进栈,new进堆.
-
String类可以使用equals进行值的比较,为什么我们自己写的类,创建完对象之后,可以调用equals方法,但是即便属性值相同,比较出来的也是false?
- 如果自定义的类没有重写equals方法,那么调用的equals方法是Object类的equals方法,Object类的equals方法也是比较的地址值.
-
重写equals方法完成后,equals方法的执行流程是什么?
-
@Override public boolean equals(Student s2) { //比较s1和s2的地址值是否相同,如果相同则直接返回true. if (this == s2) return true; //比较的是s1和s2是否是同一个类的对象. if (s2 == null || getClass() != s2.getClass()) return false; //如果通过了上面的考验,则说明s1和s2的确是同一个类下的对象,那么就比较他们的属性是否一样. Student student = (Student) s2; //基本数据类型属性的比较和引用数据类型属性的比较. if (age != student.age) return false; if (name != null ? !name.equals(student.name) : student.name != null) return false; return school != null ? school.equals(student.school) : student.school == null; }
-
-
自定义的类如果要对比,必须重写equals方法以及hashCode方法.
-
为什么同时要重写hashCode方法?不重写是否可以? -> 拓展
- 如果只是为了对比两个对象的属性是否一样,可以不写hashCode方法,但是之后学习集合的时候还会用到hashCode方法,所以说,不重写可以,但是绝对不推荐,强制重写.
-
equals方法的等价关系了解 -> 拓展
- 自反性
- x.equals(x) -> true.
- 对称性
- x.equals(y) y.equals(x) -> 要么都是true,要么都是false.
- 传递性
- x.equals(y) x.equals(z) -> 那么y.equals(z)结果仍然为true.
- 一致性
- 在不修改属性的前提下调用多少次 x.equals(y)结果仍然一致.
- 非空型
- x.equals(null) -> 永远为false,不可能出现true,如果x是null的话,那么调用equals方法就会出现空指针异常.
- 自反性
-
M.冒泡排序原理 4分2秒 理解
-
问题回顾与知识总结
-
什么是排序?
- 将一组数据按照某种规则进行排列.
-
冒泡排序的原理是什么?
-
两两相比,如果前者大于后者,则两者交换位置.
-
int[] arr int temp = arr[0]; arr[0] = arr[1]; arr[1] = temp;
-
-
如果有N个数据进行比较,那么最多需要比较多少次?
- N-1次.
-
每一次比较完毕之后,下一次的比较会发生什么变化?
- 少一个数据参与比较 -> 因为在上一次的比较中已经算出了数据的大小.
-
N.冒泡排序代码实现 8分39秒 练习
-
问题回顾与知识总结
-
数列有序区的元素个数在我们的排序过程中什么表示?
-
for(int x = 0;x < arr.length -1;x++){ for(int i = 0;i < arr.length-1-x;i++){ //判断arr[i]的值是否大于arr[i+1]的值,如果大于,则进行位置交换. if(arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } }
-
-
-
练习
-
int[] arr ={5, 8, 6, 3, 9, 2, 1, 7, 4};对这个数组进行排序.
-
O.Arrays 5分39秒 掌握
-
问题回顾与知识总结
- Arrays工具类直接帮我们打印数组的值的方法是什么?
- toString(int[] arr); 重载方法.
- Arrays工具类直接帮我们排序数组的方法是什么?
- sort(int[] arr); 重载方法.
- 工具类的设计思想是什么?
- 工具类的无参构造方法被private修饰,不可以被外界直接创建对象.
- 工具类中的方法都是被public static修饰的,可以直接被工具类名所调用.
- Arrays工具类直接帮我们打印数组的值的方法是什么?
-
练习
-
int[] arr1 ={5, 8, 6, 3, 9, 2, 1, 7}; -> 对数组进行排序,排序前和排序后数组的内容打印到控制台上,要求使用Arrays工具类完成.
-
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎