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();
    }
}

 

posted on 2016-12-04 10:55  夜行锦衣  阅读(86)  评论(0编辑  收藏  举报

导航