Java基础进阶_2
抽象类:
使用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公开抽象的。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有。
public class SingleInstance01 { private static final SingleInstance01 SI1 = new SingleInstance01(); private SingleInstance01(){ } public static SingleInstance01 getInstance(){ return si1; } } class Demo{ public static void main(String[] args) { SingleInstance01 instance1 = SingleInstance01.getInstance(); SingleInstance01 instance2 = SingleInstance01.getInstance(); System.out.println(instance1==instance2); } }
1.私有化构造器
2.创建好一个对象
3.提供对象获取方法
得到的结果为true,只有一个类的对象。提前创建好对象。
懒汉单例模式:
public class SingleInstance02 { private static SingleInstance02 si2; private SingleInstance02(){ } public static SingleInstance02 getInstance(){ if (si2==null){ si2 = new SingleInstance02(); } return si2; } } class Demo01 { public static void main(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.枚举类是多例设计模式
使用:
enum Oritation{ UP , DOWN , LEFT , RIGHT ; } public class EnumDemo02 { public static void main(String[] args) { move(Oritation.RIGHT); // 方法入参只能输入枚举的4个类型! } // 上下左右 public static void move(Oritation o){ switch (o){ case UP: System.out.println("让🐎往👆蹦~~~~"); break; case DOWN: System.out.println("让🐎往👇蹦~~~~"); break; case LEFT: System.out.println("让🐎往👈蹦~~~~"); break; case RIGHT: System.out.println("让🐎往👉蹦~~~~"); break; } } }