Java笔记3
P201
如果一个事物内部包含另一个事物,则一个类包含另一个类
- 成员内部类
- 局部内部类
内用外随意访问,外用内需要内部类对象
P203
如何使用成员内部类
- 间接方式:在外部类的方法中使用内部类,main只是调用外部类的方法
- 直接方式:类名称 对象名=new 类名称() 外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称()
P205
如果一个类定义唉一个方法内部,这个类就是局部内部类
局部只有当前所属的方法才能使用,出了这个方法就不能用了
public>protected>default>private
定义一个类的时候权限修饰符规则:
- 外部类 public/default
- 成员内部类:public/protected/default/private
- 局部内部类:什么都不能写
P206
局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的(Java8开始,final可以省略不写)
原因:new出来的对象在堆内存中,而局部变量是在栈内存中,方法运行结束立刻出栈,局部变量就会消失。但是new出来的对象在堆中持续存在直到垃圾回收
P207
如果接口的实现类或者是父类的子类只需要使用唯一一次
这种情况下可以省略该类的含义,使用匿名内部类
接口名称 对象名=new 接口名称() {
//覆盖重写所有的抽象方法
};
P208
- 匿名内部类在创建对象的时候只能使用唯一一次,如果希望多次创建对象,且类的内容一样的话,就必须用单独定义实现类了
- 匿名对象在调用方法的时候只能调用唯一一次,如果希望同一个对象调用多次方法,必须给对象起个名字
- 匿名对象类省略了实现类/子类,匿名对象省略了对象名称
P216
- 引用数据类型比较的是两个对象的地址
- 基本类型比较的是值
P218
Objects类的equals对两个对象进行比较,防止空指针异常
P219
Object介绍
- Object是所有类的父类,一个类会直接或者间接的继承自该类
toString作用
- 打印对象信息。
- 重写前打印包名类名@地址值
- 重写后打印的是对象中的属性值
equals作用
- 比较
- 重写前比较的是对象的地址
- 重写后比较的是对象中的属性值
Objects的equals方法
比较两个对象是否相同,加了一些健壮性判断
P222
DateFormate类
作用:
格式化(日期—>文本),解析(文本---->日期)
成员方法:
String formate(Date date) //按指定格式把Date日期转化字符串
Date parse(String source) //符合模式的字符串解析成Date日期
P229
- String类是字符串常量,他们的值在创建之后不能改变,底层是final修饰的数组,是一个常量
- StringBuilder类是字符串缓冲区,可以提高字符串操作效率,底层是数组,但没有final修饰,可以改变长度
P230
StringBuilder类是字符串缓冲区,可以提高字符串的效率
P232
String------>StringBuilder 用StringBuilder的构造方法
StringBuilder------->String 用StringBuilder中的toString
P233、P234、P235
包装类
基本数据类型没有方法来操纵,可以使用一个类把数据包装起来,操作基本数据类型
装箱:把基本类型的数据包装到包装类中(构造方法)
拆箱:在包装类中取出对应类型的数据
自动装箱与拆箱:基本类型的数据和包装类之间自动相互转换
P236
基本数据类型-------->字符串
-
- 包装类中的静态方法
- String类中的静态方法 toString
- 返回int参数的字符串表示形式 valueOf
字符串-------->基本数据类型
使用包装类的静态方法parsexx
Integer类:static int parseInt
Double类: static double parseDouble
P238
集合:java中提供的一种容器,用来存储多个数据
数组的长度固定,集合的长度可变
数组存储同一类型的元素,集合存储对象,对象的类型可以不一致
P260
List接口特点:
- 有序集合,存储和取出元素的顺序是一致的
- 有索引,包含了一些带索引的方法
- 允许存储重复的元素
List接口中的方法:
add
get
remove
set
注意:操作索引时防止越界
P261
LinkedList
List接口的链表实现
LinkedList特点:
- 底层是链表结构。查询慢,增删快
- 里面包含大量操作首尾的操作
- 使用LinkedList特有的方法,不能使用多态
方法
addFirst
addLast
push
getFirst
getLast
removeFirst
removeLast
pop
isEmpty
P264
set接口继承了collection接口
Set特点:
- 不允许重复元素
- 没有索引,也没有索引方法,也不能拿使用普通的for循环遍历
HashSet特点:
- 不允许存储重复元素
- 没有索引,也不能用普通for循环遍历
- 无序集合,存储顺序和取出顺序可能不一致
- 底层是哈希表
P265
哈希值是十进制的整数,由系统随机给出,是对象的逻辑地址值
hasHashCode返回对象的哈希值
HashSet是数组+红黑树/链表的结构
P269
LinkedHashSet底层是哈希表+链表
HashSet无序不允许重复,LinkedHashSet有序,不允许重复
P270
- 一个方法只能有一个可变参数
- 如果有多个参数,可变参数要放在参数列表的末尾
P272
comparable接口的排序规则
- this-参数 升序
- 参数-this 降序
P273
comparable和comparator的区别:
- comparable:自己this和别人比较,需要自己实现comparable接口,重写比较的规则compareTo方法
- comparator:相当于找一个第三方的裁判
P274
Map特点:
- Map是双列集合,一个集合包括key和value
- Map集合中的元素key和value的数据类型可以相同,也可以不同
- key不能重复,value可以重复
- key和value一一对应
HashMap特点:
- HashMap集合底层是哈希表,查询速度快
- HashMap无序集合,存储和取出的顺序可能不一致
LinkedHashMap特点:
- LinkedHashMap底层是哈希表+链表
- 有序集合,存储和取出的顺序是一致的
P279
Hashtable底层是哈希表,是一个线程安全的集合,速度慢
HashMap集合底层是哈希表,线程不安全的集合,速度快
HashMap可以存储空值空键,Hashtable不能存储空值空键
P285
Debug
f8:逐行执行程序
f7:进入到方法中
shift+f8:跳出方法
f9:跳到下一个断点,没有下一个断点就结束程序
ctrl+f2:退出debug模式,停止程序
console:切换到控制台
P289
Exception:编译器异常,进行编译java代码出现问题
RuntimeException:运行期异常,java程序运行期出现的问题
Error:错误,必须修改源代码程序才能继续执行
P293
throws:
当方法内部抛出异常对象时我们必须处理这个异常对象
使用throws关键字处理异常对象会把异常对象声明抛出给方法调用者处理,最终交给JVM处理
throws关键字必须写在方法声明处
throws关键字后边声明异常必须是exception或者exception的子类
方法内部如果出现了多个异常对象,throws后面也必须声明多个异常,如果有父子类关系,声明父类异常即可
调用了一个声明抛出异常的方法,必须处理声明的异常。要么throws抛出异常交给JVM处理,要么try catch自己处理
P295
Throwable类中定义了3个异常处理的方法
getMessage
toString
printStackTrace
P296
finally,无论是否出现异常都会执行
注意:
-
finally不能单独使用,不许和try一起使用
-
一般用于资源回收,无论程序是否出现异常,都要资源回收
try{
//可能会产生异常的代码
}catch(){
//异常处理逻辑
}finally{
//无论是否出现异常都会执行
}
一个try多个catch的注意事项:
catch里面定义的异常变量如果有子父类关系,先写子类在写父类
如果finally里面有return语句,返回的永远都是finally里面的return语句