Java中的 单例设计模式、抽象类 与 模板设计模式 和 接口

一、单例设计模式

核心思想: 在程序运行中,该类的对象无论怎么创建,始终保持有且仅有一个该类的对象

编写单例类:

1. 私有化构造方法 

2.自己类内部创建对象 并且 私有化private 静态化static

3.给类外部 提供一个获取该对象的方法

饿汉式单例类:

class Single {
    // 声明一个本类对象 私有化 静态化
    // 外界无法访问 随着类的加载只加载一次
    private static Single single = new Single(); 
    // 私有化构造方法 外界无法创建本类对象
    private Single {
    }
    // 对外提供一个访问本类私有化对象的方法(返回本类的对象)
    public static Single getInstance(){
    return single;
    }
}
懒汉式单例类:
class Single {
    private static Single single = null;
    private Single {
    }
    public static Single getInstance() {
        if(single == null){
           single = new Single();
        }
        return single;
    }
}

二、抽象类

抽象: 描述不清的即为抽象

抽象类 关键词 abstract

abstract 修饰类 该类即为抽象类

abstract 修饰方法 该方法则为抽象方法

注意: 抽象方法没有方法的实现部分

注意:

1. 有抽象方法的类 必须定义为抽象类

2.抽象类中不一定有抽象方法

3.抽象类不能直接创建对象

4.强制子类重写父类的抽象方法

5.使用多态形式创建对象

核心: 抽象类不能直接使用 只能使用抽象类的子类

抽象类允许构造方法的存在 是因为抽象类需要借助子类创建对象,为了保证继承的完整性

abstract class Animal {
	final int num = 10; // 常量必须初始化赋初值
	// 构造方法
	public Animal() {
		System.out.println("我是Animal 无参的构造方法");
	}
	
	// 声明一个抽象方法(没有实现部分)
	public abstract void speak();
	
	public void fun() {
		System.out.println("我是fun方法");
	}
}

注意: abstract 不能与 private  final  static 共存

abstract抽象类 强制子类去重写抽象方法

private私有化 只能奔雷访问 无法被继承重写

final 修饰抽象方法 则该方法无法被修改 被重写

static 修饰抽象方法 则可使用类名直接调用 抽象方法没有实现部分,不能直接调用

三、模板设计模式

思想: 大部分内容一样 只需要修改一部分内容

abstract class LOStudy {
	// 学习方法
	public void study() {
		System.out.println("报名学计算机");
		// 选择学科是需要变化的 声明一个抽象方法
		// 调用抽象方法
		chooseSubject();
		System.out.println("毕业找工作");
	}
	// 声明抽象方法
	public abstract void chooseSubject();
		
}

class LSK extends LOStudy {
	// 重写抽象方法
	@Override
	public void chooseSubject() {
		System.out.println("学Java");
	}
}

class LNA extends LOStudy {
	@Override
	public void chooseSubject() {
		System.out.println("学H5");
		
	}
}

计算一段程序的执行时间: System.cuttrntTimeMillis() 方法

long time = System.cuttrntTimeMillis() ;

获取的是 当前时间 到 1970年1月1日 的时间 (格林尼治时间)

long start = System.currentTimeMillis();
		// 	执行某一个程序
		chengXu();
		long stop = System.currentTimeMillis();
		System.out.println("该循环耗时:" + (stop - start) + "ms");

四、接口

狭义:  Java中的接口使用interface关键词来声明

         interface 接口名 { }

广义: 看做 一个规则、规范 需要来遵守的

注意:

1.只能声明 抽象方法(JDK 1.8 可以声明静态方法 和 默认方法)

2.可以声明变量 (实际为常量)

3.接口不能被继承 只能用来实现

4.接口没有构造方法 (接口是用的是实现 不用继承)

5.接口中声明的变量 默认是 public static final 修饰

   默认就是静态常量

6.声明抽象方法时 默认是 public abstract修饰 

接口的运行与类一样  翻译成.class文件被执行

接口的实现类:

接口的实现类 接口使用implements 关键词 实现

// 声明一个接口
interface InterA {
     int num = 10;
     public abstract void fun();
}
// 接口的实现类
class InterAImpl implements InterA {
    // 实现接口的抽象方法
    @Override
    public void fun() {
        System.out.println(num);
    }
}

抽象类和接口的区别:

1.使用方法

抽象类是继承,接口是实现

2.成员变量

抽象类可以是常量也可以是变量,接口只能是常量

3.成员方法

抽象类可以使成员方法也可以是抽象方法,接口只能使抽象方法

4.构造方法

抽象类有构造方法 接口中没有构造方法

类与类之间的关系: 只允许单继承

类与接口之间的关系: 实现关系 可以多实现

接口和接口的关系: 可以单继承 也可以多继承

// 类和接口的关系
interface InterB {
	public abstract void fun1();
}
interface InterC {
	public abstract void fun2();
}
class TestA implements InterB,InterC {
	@Override
	public void fun2() {
	
	}
	@Override
	public void fun1() {
		
	}	
}
// 接口和接口的关系
interface interD {
	public abstract void fun1();
}
interface interE {
	public abstract void fun2();
}
interface interF extends interD,interE {
	
}
class interFImpl implements interF {
	@Override
	public void fun1() {
		
	}
	@Override
	public void fun2() {
		
	}	
}

一个类即继承父类又是接口的实现类时  先写继承再写实现

class Abc extends AAA implements BBB { }


默认方法 用default关键词修饰  

默认方法不需要必须在实现类中重写

调用父类中的默认方法 : 接口名.super.默认方法名

猜你喜欢

转载自blog.csdn.net/lijock/article/details/80328986