文章目录
接口
接口就是一种规则
接口的定义与使用
-
接口用关键字interface来定义
public interface 接口名 {}
-
接口不能实例化
-
接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名 {}
-
接口的子类(实现类)
要么重写接口中所有的抽象方法
要么是抽象类
注意1:接口和类的实现关系,可以单实现,也可以多实现:public class 类名 implements 接口名1,接口名2{}
注意2:实现类还可以在继承一个类的同时实现多个接口:public class 类名 extends 父类 implements 接口名1,接口名2{}
接口中成员的特点
-
成员变量
只能是常量
默认修饰符:public static final
-
构造方法
没有
-
成员方法
只能是抽象方法
默认修饰符:public abstract
-
JDK7以前:接口中只能定义抽象方法。
接口和类之间的关系
- 类和类的关系
继承关系,只能单继承,不能多继承,但是可以多层继承 - 类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口 - 接口和接口的关系
继承关系,可以单继承,也可以多继承
JDK9新增的方法
接口中私有方法的定义格式:
-
格式1:private返回值类型 方法名(参数列表){}
-
范例1:private void show(){}
-
格式2:private static 返回值类型 方法名(参数列表){}
-
范例2:private static void method(){ }
- JDK7以前:接口中只能定义抽象方法。
- JDK8:接口中可以定义有方法体的方法。(默认、静态)
- JDK9:接口中可以定义私有方法。
- 私有方法分为两种:普通的私有方法,静态的私有方法
适配器设计模式
-
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简单理解:设计模式就是各种套路。
-
适配器设计模式:解决接口与接口实现类之间的矛盾问题
内部类
类的五大成员:属性
,方法
,构造方法
,代码块
,内部类
什么是内部类?
在一个类里面再定义一个类。
例子:在A类的内部定义B类,B类就被称为内部类
java
public class Outer {
public class Inner{
}
}
java
public class Test{
public static void main(String[] args){
}
}
内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
分类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
成员内部类
- 写在成员位置的,属于外部类的成员
获取成员内部类对象
- 在外部类中编写方法,对外提供内部类的对象
- 直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
静态内部类
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。
举例:
java
public class car {//外部类
String carName;
int carAge;
int carcolor;
static(出错) class Engine{//静态内部类
String engineName;
int engineAge;
}
}
创建静态内部类对象的格式 :外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用非静态方法的格式 :先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();
局部内部类
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
- 外界是无法直接使用,需要在方法内部创建对象并使用。
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
匿名内部类
匿名内部类本质上就是隐藏了名字的内部类,可以卸载成员位置,也可以写在局部位置。
格式
java
new 类名或者接口名(){
重写方法;
};
细节
包含了继承或实现,方法重写,创建对象。
整体就是一个类的子类对象或者接口的实现类对象
使用场景
当方法的参数是接口或者类时,
以接口为例,可以传递这个接口的实现类对象,
如果实现类只要使用一次,就可以用匿名内部类简化代码。
API
Math
- 是一个帮助我们用于进行数学计算的工具类
- 私有化构造方法,所有的方法都是静态的
Math常用方法
方法名 | 说明 |
---|---|
public static int abs(int a) |
获取参数绝对值 |
public static double ceil(double a) |
向上取整 |
public static double floor(double a) |
向下取整 |
public static int round(float a) |
四舍五入 |
public static int max(int a,int b) |
取较大值 |
public static double pow(double a,double b) |
返回a的b词幂的值 |
public static double random() |
返回值为double的随机值,范围[0.0,1.0) |
System
方法名 | 说明 |
---|---|
public static void exit(int status) |
终止当前运行的 Java 虚拟机 |
public static long currentTimeMillis() |
返回当前系统的时间毫秒值形式 |
public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) |
数组拷贝 |
Runtime
方法名 | 说明 |
---|---|
public static Runtime getRuntime() |
当前系统的运行环境对象 |
public void exit(int status) |
停止虚拟机 |
public int availableProcessors() |
获得CPU的线程数 |
public long maxMemory() |
JVM能从系统中获取总内存大小(单位byte) |
public long totalMemory() |
JVM已经从系统中获取总内存大小(单位byte) |
public long freeMemory() |
JVM剩余内存大小(单位byte) |
public process exec(String command) |
运行cmd命令 |
Object
- Object是Java中的顶级父类。所有的类都直接或间接的继承于0bject类。
- Object类中的方法可以被所有子类访问,所以我们要学习0bject类和其中的方法
构造方法
方法名 | 说明 |
---|---|
public Object() | 空参构造 |
成员方法
方法名 | 说明 |
---|---|
public string tostring() |
返回对象的字符串表示形式 |
public boolean equals(object obj) |
比较两个对象是否相等 |
protected object clone(int a) |
对象克隆 |
当我们打印一个对象的时候,底层会调用对象的toString方法,把对象变成字符串。
然后再打印在控制台上,打印完毕换行处理。
默认情况下,因为object类中的toString方法返回的是地址值
所以,默认情况下,打印一个对象打印的就是地址值
对象克隆
把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制
细节
方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。
- 重写object中的clone方法
- 让javabean类实现cloneable接口
- 创建原对象并调用c1one就可以了
深克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。
浅克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的。
Objects
Objects是一个工具类,提供了一些方法去完成一些功能。
成员方法
方法名 | 说明 |
---|---|
public static boolean equals(object a, object b) |
先做非空判断,比较两个对象 |
public static boolean isNull(object obj) |
判断对象是否为Null,为Null返回true,反之 |
public static boolean nonNull(object obj) |
判断对象是否为Null,跟isNull的结果相反 |
equals使用细节(Objects.equals(s1,s2))
- 方法的底层会判断s1是否为nu11,如果为nu11,直接返回false
- 如果s1不为nu11,那么就利用s1再次调用equals方法
- 此时s1是student类型,所以最终还是会调用student中的equals方法。
- 如果没有重写,比较地址值,如果重写了,就比较属性值。
BigInteger和BigDecimal
BigInteger
构造方法
方法名 | 说明 |
---|---|
public BigInteger(int num,Random rnd) |
获取随机大整数,范围:[0~2的num次方-1] |
public BigInteger(string val) |
获取指定的大整数 |
public BigInteger(String val,int radix) |
获取指定进制的大整数 |
public static BigInteger valueOf(long val) | 静态方法获取BigInteger的对象,内部有优化 |
---|
- 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取
- 如果BigInteger表示的超出long的范围,可以用构造方法获取
- 对象一旦创建,BigInteger内部记录的值不能发生改变
- 只要进行计算都会产生一个新的BigInteger对象
常见成员方法
方法名 | 说明 |
---|---|
public BigInteger add(BigInteger val) |
加法 |
public BigInteger subtract(BigInteger val) |
减法 |
public BigInteger multiply(BigInteger val) |
乘法 |
public BigInteger divide(BigInteger val) |
除法,获取商 |
public BigInteger[] divideAndRemainder(BigInteger val) |
除法,获取商和余数 |
public boolean equals(Object x) |
比较是否相同 |
public BigInteger pow(int exponent) |
次幂 |
public BigInteger max/min(BigInteger val) |
返回较大值/较小值 |
public int intValue(BigInteger val) |
转为int类型整数 超出范围数据有误 |
BigDecimal
- 用于小数的精确计算
- 用来表示很大的数
- 通过传递double类型的小数来创建对象
- 通过传递字符串的小数来创建对象
- 通过静态方法获取对象
细节
- 如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
- 如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
- 如果我们传递的是8~10之间的整数,包含8,包含10,那么方法会返回己经创建好的对象,不会重新new
使用
方法名 | 说明 |
---|---|
public static BigDecimal valueOf(double val) |
获取对象 |
public BigDecimal add(BigDecimal val) |
加法 |
public BigDecimal subtract(BigDecimal val) |
减法 |
public BigDecimal multiply(BigDecimal val) |
乘法 |
public BigDecimal divide(BigDecimal val) |
除法 |
public BigDecimal divide(BigDecimal val,精确几位,舍入模式) |
除法 |
进位
UP
:远离零方向舍入的舍入模式DOWN
:向零方向舍入的舍入模式CEILING
:向正无限大方向舍入的舍入模式FLOOR
:向负无限大方向舍入的舍入模式
正则表达式
name.
startsWith
(字符串);//用来判断name字符串是否以括号内的字符串开头
作用
作用一:校验字符串是否满足规则
作用二:在一段文本中查找满足要求的内容
格式
!!!!一个中括号只能匹配一次!!!!
用法 | 注释 |
---|---|
[abc] |
只能是a,b,或c |
[^abc] |
除了a,b,c之外的任何字符 |
[a-zA-Z] |
a到z A到Z,包括(范围) |
[a-d[m-p]] |
a到d,或m到p |
[a-z&&[def]] |
a-z和def的交集。为:d,e,f |
[a-z&&[ ^bc ]] |
a-z和非bc的交集。(等同于[ad-z]) |
[a-z&&[ ^m-p ] |
a到z和除了m到p的交集。(等同于[a-lq-z]) |
!!!!一个符号只能匹配一次!!!!
用法 | 注释 |
---|---|
. |
任何字符 |
\d |
一个数字:[0-9] |
\D |
非数字:[ ^0-9] |
\s |
一个空白字符:[\t\n\x0B\f\r] |
\S |
非空白字符:[ ^\s] |
\w |
[a-zA-Z_0-9]英文、数字、下划线 |
\W |
[^\w]一个非单词字符 |
数量词
用法 | 注释 |
---|---|
X? |
X,一次或0次 |
X* |
X,0次或多次 |
X+ |
X,一次或多次 |
X{n} |
X,正好n次 |
X{n,} |
X,至少n次 |
X{n,m} |
X,至少n但不超过m次 |
(?i)abc----------可以忽略abc的大小写
a(?i)bc----------可以忽略bc的大小写
a((?i)b)c--------只忽略b的大小写
(Java)(?=8|11|17)----------?理解为前面的数据Java;=表示Java后米娜要跟随的数据;获取时只获取前半部分。
(Java)(?:8|11|17)----------用:
则表示要取整体。
(Java)(?!8|11|17)----------用!
表示不要后半部分。
爬虫
-
Pattern:表示正则表达式
-
Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。在大串中去找符合匹配规则的子串。
-
获取正则表达式的对象
java
Pattern p = Pattern.compile("Java\\d{0,2}");
- 获取文本匹配器的对象
m
:文本匹配器的对象str
:大串p
:规则- m要在str中找符合p规则的小串
java
Matcher m = p.matcher(str);
- 拿着文本匹配器从头开始读取,寻找是否有满足规则的子串
- 如果没有,方法返回false
- 如果有,返回true。在底层记录子串的起始索引和结束索引+1
java
boolean b = m.find();//当后面没有东西了会返回false
- 方法底层会根据find方法记录的索引进行字符串的截取
- substring(起始索引,结束索引);包头不包尾
- (0,4)但是不包含4索引
- 会把截取的小串进行返回。
java
String s1 = m.group();
System.out.println(s1);
正则表达式在字符串方法中的使用
方法名 | 说明 |
---|---|
public String[] matches(String regex) |
判断字符串是否满足正则表达式的规则 |
public String replaceAll(String regex,String newStr) |
按照正则表达式的规则进行替换 |
public String[] split(String regex) |
按照正则表达式的规则切割字符串 |
分组
每组是有组号的,也就是序号
规则1
:从1开始,连续不间断。
规则2
:以左括号为基准,最左边的是第一组,其次为第二组,以此类推
捕获分组
- 后续还要继续使用本组的数据。
- 正则内部使用:\\组号
- 正则外部使用:$组号
非捕获分组
分组之后不需要再用本组数据,仅仅是把数据括起来。
符号 | 含义 | 举例 |
---|---|---|
(?:正则) | 获取所有 | Java(?:8|11|17) |
(?=正则) | 获取前面部分 | Java(?=8|11|17) |
(?!正则) | 获取不是指定内容的前面部分 | Java(?!8|11|17) |
已经到底啦!!