抽象类:
使用abstract关键字修饰的类为抽象类,其内部可以有类的一切成员,还可以有abstract修饰的抽象方法(不一定有),抽象方法只有方法的声明,没有方法体,有抽象方法的类必须声明为抽象类。
抽象类不能够创建对象(为什么?反证法:假设创建了抽象类的对象,使用其对象调用抽象方法,而方法没有方法体,没有意义),但其必须是有构造器的,是提供给其子类创建对象时,初始化父类成员使用的。
抽象类的子类必须实现父类的抽象方法,如果不实现,也必须将子类定义为抽象方法。
抽象类存在的意义:为了被子类继承,体现的是模板思想。(抽象类中实现的是模板中确定的成员,不确定如何实现的交给子类实现)。
抽象类的构造器不能为私有,否则子类无法访问,无意义。
接口:
jdk1.8之前接口中只能有抽象方法(public abstract忽略不写)和共享常量(public static final忽略不写)。
jdk1.8开始之后接口中还可以有默认方法(用default修饰,只能用接口的实现类的对象来调用)、静态方法(用static修饰,只能用本接口名直接调用)、私有方法(jdk1.9开始才有的,用private修饰,只能用接口中其它私有方法和默认方法调用)。单继承、多实现,接口可继承多个接口。
两者区别:
相同点:
1、都不能被实例化。
2、接口的实现类和抽象类的子类只有全部实现了接口或者抽象类中的方法后才可以被实例化。
不同点:
1、单继承,多实现。接口可以实现多个,只能继承一个抽象类。
2、接口强调的是功能,抽象类强调的是所属关系。
3、接口中的所有成员变量为public static final, 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract公开抽象的。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有。
静态代码块:
用static修饰的静态代码块与类一起优先加载,且自动触发执行一次。
静态代码块可以在执行类方法之前对静态资源进行初始化操作。
实例代码块:
无static修饰:
{
}
属于类的每个对象,和类的每个对象一起加载,每次创建对象时都会执行一次,可用于初始化实例资源。实际上是提取到构造器去执行的。
final关键字:
final修饰的类不能被继承。
final修饰的方法不能被重写。
final修饰的成员变量有且只能赋值一次。
abstract和final的关系:互斥关系,前者修饰的类为抽象类就是为了被继承,抽象方法就是为了被重写,后者相反。不能同时修饰成员。
final修饰的成员变量可以在定义的时候赋值一次,也可以在静态代码块中赋值一次。
单例设计模式:
一个类只能创建一个对象。
对象越多占用内存越多,有些时候只需要一个对象就可以实现业务需求,单例更节省空间,提高性能。
实现:
饿汉单例模式:
public classSingleInstance01 {private static final SingleInstance01 SI1 = newSingleInstance01();privateSingleInstance01(){
}public staticSingleInstance01 getInstance(){returnsi1;
}
}classDemo{public static voidmain(String[] args) {
SingleInstance01 instance1=SingleInstance01.getInstance();
SingleInstance01 instance2=SingleInstance01.getInstance();
System.out.println(instance1==instance2);
}
}
1.私有化构造器
2.创建好一个对象
3.提供对象获取方法
得到的结果为true,只有一个类的对象。提前创建好对象。
懒汉单例模式:
public classSingleInstance02 {private staticSingleInstance02 si2;privateSingleInstance02(){
}public staticSingleInstance02 getInstance(){if (si2==null){
si2= newSingleInstance02();
}returnsi2;
}
}classDemo01 {public static voidmain(String[] args) {
SingleInstance02 s1=SingleInstance02.getInstance();
SingleInstance02 s2=SingleInstance02.getInstance();
System.out.println(s1==s2);
}
}
1.私有化构造器
2.对象变量声明
3.在对象获取方法中创建对象
用时再创建对象。
枚举类:
格式:
修饰符 enum 类名{
实例名称1,实例名称2......;
}
枚举类做信息标志和信息分类。
枚举类特点:
1.用final修饰的,不能被继承
2.继承自java.lang.Enum
3.枚举类第一行罗列的是对象名称,是以常量形式存储的
4.第一行写的都是常量名称,用于存储枚举类对象的
5.枚举类的构造器是私有的
6.枚举类是多例设计模式
使用:
enumOritation{
UP , DOWN , LEFT , RIGHT ;
}public classEnumDemo02 {public static voidmain(String[] args) {
move(Oritation.RIGHT);//方法入参只能输入枚举的4个类型!
}//上下左右
public static voidmove(Oritation o){switch(o){caseUP:
System.out.println("让🐎往👆蹦~~~~");break;caseDOWN:
System.out.println("让🐎往👇蹦~~~~");break;caseLEFT:
System.out.println("让🐎往👈蹦~~~~");break;caseRIGHT:
System.out.println("让🐎往👉蹦~~~~");break;
}
}
}