1 接口的特点
1、我们使用interface关键字定义接口
2、我们使用implements关键字建立接口实现类与接口的实现关系
接口是父级,接口实现类是子级
3、接口实现类如果实现部分/不实现接口中的抽象方法,那么实现类是一个抽象类
接口实现类如果实现了接口所有的抽象方法,那么这个实现类是一个普通类
4、抽象类与接口都不可以实例化/创建对象
5、接口没有构造函数,实现类使用的super()是父类的无参构造
如果没有明确指定父类,super()代表的才是Object的无参构造
6、接口中都是静态常量,没有成员变量,因为会默认拼接public static final
7、接口中都是抽象方法,默认会拼接public abstract
故此:静态常量与抽象方法默认拼接的部分,可以省略不写
8、接口不是类!!!
9、接口是用来制定规则的【有哪些功能?方法有参数吗?有返回值吗?】
方法具体的实现交给接口的实现类去完成
2 接口与类的复杂关系
1. 类与类的关系
继承关系,只支持单继承
比如A是父类,B是子类,B具备A的所有功能
如果B对A的功能不满意,可以重写(两同 两小 一大)
2. 类和接口的关系
实现关系,可以单实现,也可以多实现
比如:多实现:class A implements B,C{}
A是实现类,B和C是接口,A需要实现BC接口的所有抽象方法,否则A就是一个抽象类
3. 接口与接口的关系
继承关系,可以单继承,也可以多继承
interface A extends B,C{}
A B C 都是接口,A是子接口,具有B C父接口的所有功能(抽象方法)
class X implements A{}
X实现类需要实现A接口,以及A接口继承自B C接口的所有抽象方法,否则就是抽象类class O extends A implements B,C{}
其中O是实现类,也是A的子类,同时拥有A的所有功能,并且需要实现BC的所有功能
4.接口与抽象类的区别
1.接口是一种用interface定义的类型
抽象类是一种用class定义的类型
2.接口中的方法都是抽象方法
抽象类中的方法不做限制
3.接口中的都是静态常量
抽象类中可以写普通的成员变量
4.接口中没有构造方法,不可以实例化
抽象类中有构造方法,但是也不可以实例化
5.接口是先天设计的结果,抽象是后天重构的结果
6.接口可以多继承,抽象类只能单继承
3 内部类总结
1.内部类创建对象的格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象
2.根据内部类的位置不同,分为:
成员内部类(类里方法外)
局部内部类(方法里)
3.内部类可以直接使用外部类的资源,但是外部类使用内部类资源时
需要先创建内部类的对象,通过内部类的对象来调用
4.如果内部类被private修饰,无法直接在外界创建内部类对象
我们可以创建外部类的对象,间接访问内部类的资源
5.如果内部类被static修饰,可以把这个类称为静态内部类
静态内部类不需要先创建外部类对象,而是先通过外部类的类名找到内部类,再创建内部类对象
6.如果静态内部类中有静态资源,可以不创建一个对象,就通过
外部类名.内部类名.静态资源名的链式加载的方式,使用这个资源
7.直接创建外部类对象,调用局部内部类所处的方法时,并不会触发局部内部类的功能
需要在局部内部类所处的方法中,先创建局部内部类对象,并调用其功能,功能才会被触发
8.匿名内部类没有名字,通常与匿名对象结合在一起使用
9.匿名对象只能使用一次,一次只能调用一个功能
匿名内部类其实就是充当了实现类的角色,去实现未实现的方法,只是没有名字而已
如果想要多次使用实现后的功能,还要创建之前的普通对象
4 String常用的API
int hashCode() 返回此字符串的哈希码
boolean equals(Object anObject) 将此字符串与指定的对象比较,比较的是重写后的串的具体内容
String toString() 返回此对象本身(它已经是一个字符串!)int length() 返回此字符串的长度
String toUpperCase() 所有字符都转换为大写
String toLowerCase() 所有字符都转换为小写
boolean startsWith(String prefix) 测试此字符串是否以指定的元素开头
boolean endsWith(String suffix) 测试此字符串是否以指定的字符串结束char charAt(int index) 返回指定索引/下标处的 char 值/字符
int indexOf(String str) 返回指定字符在此字符串中第一次出现处的索引
int lastIndexOf(String str) 返回指定字符在此字符串中最后一次出现处的索引
String concat(String str) 将指定字符串连接/拼接到此字符串的结尾,注意:不会改变原串
String[] split(String regex) 根据给定元素来分隔此字符串String trim() 返回去除首尾空格的字符串
byte[] getBytes() 把字符串存储到一个新的 byte 数组中
String substring(int beginIndex) 返回一个新子串,从指定下标处开始,包含指定下标
String substring(int beginIndex, int endIndex) 返回一个新子串,从执定下标开始,到结束下标为止,但不包含结束下标
static String valueOf(int i) 把int转成String
5 包装类
- Java的数据类型只有两大类:8大基本类型与引用类型
- 包装类是引用类型中的一种,包装类与基本类型一一对应,也有8种
- 基本类型只能存自己类型的值,没有其他额外的功能
- 包装类型是对基本类型进行了包装,提供了丰富的功能,包装类型是基本类型的拓展
- 包装类型Integer的创建方式:
1)Integer i1 = new Integer(5); 没有高效的效果,new一次,创建一个包装类对象
2)Integer i2 = Integer.valueOf(5); 有高效的效果,数据在-128~127的范围内,才有高效的效果
3)Integer i3 = 5; 自动装箱:编译器会把int类型5装箱,变成Integer,底层调用的方法:valueOf(5) - 包装类型Double的创建方式:
1)Double d1 = new Double(3.4); 没有高效的效果,new一次,创建一个包装类对象
2)Double d2 = Double.valueOf(3.4);这个也没有高效的效果,只有Integer有 - Integer的常用方法:i1.parseInt(“80”);将字符串80转成int类型的80
Double的常用方法:d1.parseDouble(“80”);将字符串80转成double类型的80 - 自动装箱与自动拆箱:
1)Integer i3 = 5; 自动装箱【基本类型 到 包装类型】:
编译器会把int类型的5装箱,变成Integer类型,底层调用的方法:valueOf(5)
2)int n = i3;自动拆箱【包装类型 到 基本类型】:
编译器会把包装类型的i3中的数据取出来,把这个值赋值给基本类型int
底层调用的方法:i3.intVlaue();
6 浮点数运算不精确的解决方案:BigDecimal
1、如果使用一个工具,必须先创建这个类的对象,如果想创建对象,必须先了解它提供了哪些构造方法
2、创建BigDecimal对象的方式:
1)BigDecimal(double val) :将double类型的数据作为参数,交给BigDecimal对象【不用,因为double本身不精确】
2)BigDecimal(String val) :将String类型的数据作为参数,交给BigDecimal对象【用这个】
注意:double->String直接拼接一个空串“”就可以
3、使用对象进行加减乘除操作,注意:除法除不尽时会抛出异常,所以需要指定除不尽时保留几位小数以及舍入方式
7 正则表达式
作用: 拿着我们指定好的规则,去判断数据是否符合这个规则
指定规则:String regex = “[0-9]{17}[0-9X]”;
拿着数据与规则做比较:input.matches(regex)–>如果匹配,matches方法返回true
注意:单个斜杠表示转义字符,所以在正则中如果想要表示单个斜杠,需要写双斜杠
至于正则表达式的对照关系,详见笔记中正则速查表
![]()
8 File 文件类
创建File类的对象:new File(String pathname) :这个参数是一个String类型的路径名,这个路径可能是:
1)文件的路径 “D:\ready\1.txt”
2)文件夹的路径 “D:\ready\a”
3)之前不存在的文件/文件夹的路径:这个路径暂时在windows中还未创建出来
注意:new File类的对象只是在内存中多个一个Java对象,并不会真的帮我们在外部创建一个新的文件/文件夹