08 单例设计模式 与 继承
设计模式:对问题行之有效的解决方式,其实它是一种思想.
1.单例设计模式:
解决的问题:就是可以保证一个类在内存中的对象唯一性.
必须对多个程序使用同一配置信息对象时,就需要保证该对象的唯一性.
如何保证对象唯一性呢?
1.不允许其他程序用new创建该类对象.
2.在该类中创建一个本类实例.
3.对外提供一个方法让其他程序可以获取该对象.
步骤:
1.私有化该类构造函数.
2.通过new在本类中创建一个本类对象.
3.定义一个公有的方法,将创建的对象返回.
//饿汉式
class Single //类一加载,对象就已经存在了 { private static Single s = new Single(); private Single(){} public static Single getInstance(String name) { //譬如判断传进来的name决定是否给你返回对象 return s;//通过方法返回可控,故将s定义为private } }
//懒汉式 class Single2//类加载进来,没有对象,只有调用了getInstance方法 { //时才会创建对象,延迟加载形式. private static Single2 s = null; private Single2(){} public static Single2 getInstance() { if(s==null) s=new Single2(); return s; } }
面试时懒汉式较多,开发时饿汉式较多.
extends
继承的好处:
1.提高了代码的复用性.
2.让类与类之间产生了关系,给第三个特征多态提供了前提.
java中支持单继承,不直接直接多继承,但对c++中的多继承机制进行改良.
单继承:一个子类只能有一个直接父类.
多继承:一个子类可以有多个直接父类(java中不允许,进行改良)
不直接支持,因为多个父类中有相同成员时,会产生调用的不确定性.
在java中是通过"多实现"的方式来体现.
java支持多层(多重)继承
C继承B,B继承A
就会出现继承体系.
当要使用一个继承体系时:
1.查看该体系中的顶层类,了解该体系的基本功能.
2.创建体系中的最子类对象,完成功能的使用.
什么时候定义继承呢?
当类与类之间存在着所属关系的时候,就定义继承.
xxx是yyy中的一种,xxx extends yyy.
所属关系: is a 关系
//1.成员变量
/*
当本类的成员和局部变量同名用this区分,
当子父类中的成员变量同名用super区分父类.
this和super的用法很相似.
this:代表一个本类对象的引用.
super:代表一个父类空间.
*/
class Fu { int num = 4; } class Zi extends Fu { int num = 5; void show() { System.out.println(this.num+"..."+super.num); } }
class Demo
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
}
}
这种情况在开发中几乎看不到,在父类中有的成员变量,没必要在子类中重新定义一个.
通常情况下都是private的.子类不能直接访问父类中private的内容.但是可以通过get/set方法来实现间接访问.
2.成员函数:
当子父类中出现成员函数一模一样的情况,会运行子类的函数.
这种现象,称为覆盖操作.这是函数在子父类中的特性.
函数两个特性:
1.重载.在同一个类中.overload
2.覆盖.子类中,覆盖也称为重写,覆写.override
覆盖注意事项:
1.子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限,才可以引发覆盖.
2.静态只能覆盖静态,或被静态覆盖.
什么时候使用覆盖操作:
当对一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,
就使用覆盖操作完成.
class Phone { void call() { } void show() { System.out.println("number"); } } class NewPhone extends Phone { void Show() { System.out.println("name"); System.out.println("pic"); super.show(); } }