1.单例设计
单例设计模式
核心思想:在重程序的运行中,该类的对象不管怎么创建 始终保持有且只有一个该类的对象
单例可以进行传值
编写单例思路
1.不让外界创建对象(私有化构造方法)
2.自己类内部来创建这个对象(让设个对象只创建一次)
3.给类外部提供一个获取该对象的方法(相当于提供一个get方法)
如何写单例类
1.饿汉(只要该类被加载 就会在方法区的静态区中 创建本类的对象)
2.懒汉(延迟加载)(在类被加载的时候不会去创建对象, 只有调用了获取该类对象的方法的时候才会创建该类对象)
饿汉:
class SingleE{
//声明一个本类的对象
private static SingleE singleE=new SingleE();
//构造方法私有化
private SingleE() {
}
//对外提供一个访问的方法(就是为了返回本类的对象)
public static SingleE getInstance() {
return singleE;
}
}
懒汉:
class SingleL{
private static SingleL singleL=null;
private SingleL(){
}
public static SingleL getInstance() {
//判断当这个对象不存在的时候再创建
if(singleL==null) {
singleL=new SingleL();
}
return singleL;
}
}
2.抽象类
关键字:abstract
可以修饰类 抽象类
可以修饰方法 抽象方法
抽象类有什么用?
核心:抽象类不能直接使用 只能使用抽象类的子类
抽象类中有:
1.变量 常量
2.构造方法
3.抽象方法 成员方法
抽象方法:当你对这个方法描述的不是特清楚 把该方法声明成抽象方法
注意:
1.抽象方法没有方法的实现部分
2.有抽象方法的类一定必须是抽象类 但是抽象类中不一定要有抽象方法
3.抽象类不能直接创建对象
4.强制子类重写父类的抽象方法
5.使用多态的形式进行创建
public static void main(String[] args) {
//创建一个动物对象
//Animal animal=new Animal() 错误的
//抽象类如何使用?
//使用多态的创建方式 父类引用指向子类的对象
Animal acat=new Cat();//多态的形式创建
acat.speak();
}
}
abstract class Animal{
//构造方法
//为什么抽象类允许构造方法存在 继承的完整性
public Animal(){
System.out.println("我是无参");
}
//声明一个抽方法
public abstract void speak();
}
//抽象类子类
class Cat extends Animal{
//子类重写父类的抽象方法
@Override
public void speak() {
System.out.println("喵喵");
}
abstract关键字与那些关键字不能共存
final 不行 修饰抽象方法 方法不能被重写
private 不行 修饰抽象方法只能本类访问 抽象类强制子类去重写抽象方法 访问不到 就谈不到重写
static 不行 修饰抽象方法就能用类名去调用 抽象方法没有实现部分 不能直接调用
3.模板设计模式
abstract class LOStuydy{
public void study() {
System.out.println("报名缴费");
//选择学科需要变化 声明一个方法
//调用抽象方法
chooseSubject();
System.out.println("毕业找工作");
}
//声明抽象方法
public abstract void chooseSubject();
}
4.接口
interface 接口名{
}
狭义:java中的接口 使用interface关键字来声明
广义:相当于一个规则 是需要遵守的
接口
1.只可以声明抽象方法(不准确)
2.可以声明变量
3.接口只能用来实现(不能继承)
4.接口中没有构造方法
5.接口只声明的变量默认是public static final的(默认公开的静态常量)
6.声明抽象方法时 默认是public abstract (可省略)
接口跟类一样 也会被翻译成.class文件
public static void main(String[] args) {
//创建接口 使用多态的形式
InterA a=new InterAImpl();
a.fun();
System.out.println(InterA.num);
}
}
//声明一个接口
interface InterA{
//默认公开的静态常量
public static final int num=10 ;
public abstract void fun();
}
//接口使用implements 实现
//接口的实现类 类名 一般以Impl结尾
class InterAImpl implements InterA{
//实现接口中的抽象方法
@Override
public void fun() {
//num=15;
System.out.println(num);
System.out.println("实现类的fun方法");
}