1:模板设计方法模式的写法:
定义一个抽象类
在里面定义2个方法:
一个是模板方法:把相同代码放进去
一个是抽象方法:具体实现交给子类完成
2:建议使用final关键字修饰模板方法,因为:
模板方法是给对象直接使用的,不能被子类重写
一旦子类重写了模板方法,模板方法就失效了
接口
1:Java提供了一个关键字interface,用这个关键字我们可以定义一个特殊的结构:接口
public interface 接口名{
//成员变量(常量)
//成员方法(抽象方法)
}
注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口类的类被称为实现类
修饰符 class 实现类 implements接口1,接口2,接口3...{
}
一个类可以实现多个接口,实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类
2:接口的好处:
弥补了类单继承的不足,一个类同时可以实现多个接口。
让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现
从JDK8开始,接口新增了三种形式的方法:
默认方法(实例方法):使用default修饰,默认会被加上public 修饰,且只能使用接口的实现类对象调用
私有方法:必须用private修饰
类方法:(静态方法):使用static修饰,默认会被加上public 修饰,且只能用接口名来调用
3:接口的多继承:一个接口可以同时继承多个接口
public interface C extends B,A{
}
作用:便于类去实现
4:
内部类:
1:是类中的五大成分之一(成员变量,方法,构造器,内部类,代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
场景:当一个类的内部,包括一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类
public class Car{
public class Engine{
}
}
2:内部类的四种形式:
成员内部类,静态内部类,局部内部类,匿名内部类
3:成员内部类:就是类中的一个普通成员,类似前面学过的普通的成员变量,成员方法。
外部类名.内部类名 对象名=new 外部类(...)new内部类(...);
public class Outer{
public class Inner{
}
}
成员内部类的实例方法中,访问其他成员有啥特点
可以直接访问外部类的实例成员,静态成员
可以拿到当前外部类对象,格式是:外部类名.this
4:静态内部类:有static 修饰的内部类,属于外部类自己持用。
public class Outer{
public static class Inner{
}
}
创建对象的格式:
外部类名.内部类名 对象名=new 外部类.内部类(...);
Outer.Inner in=new Outer.Inner();
静态内部类中访问外部类成员的特点:可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员
5:局部内部类:局部内部类是定义在方法中,代码块中,构造器等执行体中
public class Test{
public static void main(String[] args){
}
public static void go(){
class A {
}
abstract class B{
}
interface C{
}
}
}
6:匿名内部类就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。
new 类或接口(参数值...){
类体(一般是方法重写);
}
特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象。
作用:用于更方便的创建一个子类对象。
匿名内部类在开发中的使用场景:通常作为一个参数传输给方法
枚举:是一种特殊类
格式:
修饰符 enum 枚举类名{
名称1,名称2,...;
其他成员...
}
注意:枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
这些名称,本质是常量,每个常量都会记住枚举类的一个对象。
8:
9:枚举的常见应用场景:用来表示一组信息,然后作为参数进行传输。
选择定义一个一个的常量来表示一组信息,并作为参数传输
参数值不受约束。
选择定义枚举表示一组信息,并作为参数传输
代码可读性好,参数值得到了约束,对使用者友好,建议使用。
泛型:
1:定义类,接口,方法时,同时声明了一个或者多个类型变量(如:<E>),称为泛型类,泛型接口,泛型方法,他们统称为泛型。2:泛型类:
public class ArrlyList<E>{
}
修饰符 class <类型变量,类型变量...>{
}
3:泛型接口:
修饰符 interface 接口名 <类型变量,类型变量...>{
}
public interface A<E>{
}
4:泛型方法:
修饰符 <类型变量,类型变量...>返回值类型 方法名(形参列表){
}
public static <T> void test <T t>{
}
5:通配符:就是“?”,可以在“使用泛型”的时候代表一切类型;E T K Y是在定义泛型的时候使用
6:泛型的上下限:
泛型上限:?extends Car:?能接收的必须是Car或者其子类。
泛型下限:? super Car:?能接收的必须是Car或者其父类。
7:
API:(应用程序编程接口)
java已经帮我们写好了一些程序,如类,方法等,我们直接可以拿来用
1:
2:Object类的作用
Object类是Java中所有类的祖宗。因此,Java中所有类的对象都可以使用Object类中提供的一些方法。
3:
4:Object类中to String方法的作用是返回对象的字符串形式,存在的意义是让子类重写,以便返回子类对象的内容
Object类中equals方法的作用是默认是比较两个对象的地址是否相等。
5:Object类提供的对象克隆方法:
protected Object clone() 对象克隆
当某个对象调用这个方法时,这个方法会复制一个一模一样的新对象返回。
6:
7:Objects类是一个工具类,提供了很多操作对象的静态方法给我们使用
8:包装类:就是把基本类型的数据包装成对象
9:包装类的其他 常见操作
可以把基本数据类型的数据转换成字符串类型。
public static String toString(double d)
public String toString()
可以把字符串类型的数据转换成数值本身对应的数据类型。
public static int parseInt(String s)
public static Integer valueOf(String s)
10:StringBuilder代表可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的。
为啥操作字符串建议使用 StringBuilderString,而不用原来学过的String?
好处:StringBuilder比String更适合做字符串的修改操作,效率会更高,代码也会更简洁。
11: 对于字符串的相关操作,如频繁的拼接,修改等,建议使用StringBuilder,效率更高
注意:如果存在字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String 。
12:StringBuffer与StringBuilde
StringBuffer的用法与StringBuilde是一模一样的,
但StringBuilde是线程不安全的,StringBuffer是线程安全的
13:StringJoiner
JDK8开始才用的,跟StringBuilde 一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的
好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会简洁。
常用API(二)
1:Math代表数学,是一个工具类,里面提供的都是对数据进行操作的一些静态方法。
2:System:代表程序所在的系统,也是一个工具类。
3:Runtime:代表程序所在的运行环境,是一个单例类
4:
5:Data代表的是日期和时间
6:SimpleDateFormat:代表简单日期个格式化,可以用来把日期对象,时间毫秒值格式化成我们想要的格式
SimpleDateFormat解析字符串时间成为日期对象
7:Calendar 代表的是系统此刻对应的日历,通过它可以单独获取,修改时间中的年,月,日,时,分,秒等。
Calendar时可变对象,一旦修改后其对象本身表示的时间将产生变化。
8:
9:Instant时间线上的某个时刻/时间戳
通过获取Instant的对象可以拿到此刻的时间,改时间由两部分组成:如从1970-01-01 00:00:00开始走到此刻的总秒数+不够一秒的纳秒数
作用:可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。
传统的Date类,只能精确到毫秒,并且是可变对象;
新增的Instant类,可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。
10:DateTimeFoematter
11:Period:可以用于计算两个LocalDate对象相差的年数,月数,天数。
12:Duration可以用于计算两个对象相差的天数,小时数,分数,秒数,纳秒数;支持LocalTime,LocalDateTime,Instant等时间。
13:Arrays:用来 操作数组的一个工具类。
14:如果数组中储存的是对象,如何 排序?
方法一:让该对象的类实现 Comparable(比较规则)接口,然后重写comparaTo方法,自己来制定比较规则。
方法二:使用下面这个sort方法,创建comparator比较器接口的匿名内部类对象,然后自己来制定比较规则。public static<T>void sort(T[] arr ,Comparator<?superT>c)对数组进行排序(支持自定义排序规则)。
15:子定义排序规则时,需要遵循的官方规则如下:
JDK8的新特性:
Lambda表达式
1:作用:用于简化 匿名内部类的代码写法。
格式:
(被重写方法的形参列表)->{
被重写方法的方法体代码。
}
Lambda表达式 并不是简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类
函数式接口:有且仅有一个抽象方法的接口。
注意:将来我们见到的大部分函数式接口,上面都会可能有一个@FunctionalInterface的注解,有该注解的接口就必定是函数式接口。
2:
3:方法引用:
静态方法的引用:
类名::静态方法
使用场景:
如果某个Lambda表达式 里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用 。
实例方法的引用:
对象名::实例方法
使用场景:
如果某个Lambda表达式 里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用 。
特定类型的方法引用:
类型::静态方法
使用场景:
如果某个Lambda表达式 里只是调用一个实例方法,并且前后参数列表中的第一个参数列表是作为方法的主调,后面的所有参数都是作为该实例方法的入参的, 则此时就可以使用特定类型的 方法引用 。
构造器引用:
类名:: new
使用场景:
如果某个Lambda表达式 里只是在场景对象 ,并且前后参数的形式一致,就可以使用 构造器引用 。