单利模式以及继承和多态

一丶单利模式
1丶单利类只能有一个实例
2丶单利类必须创建自己的唯一实例
3丶单利类必须给所有其它对象
4丶单利模式必须提供一个全局的访问点
(1)恶汉式单利模式

class MySingleTon{
    private static MySingleTon singleTon = new MySingleTon();
    //定义一个static类型的变量,只初始化一次
    private MySingleTon(){//私有化构造函数
        System.out.println("构造函数");
    }
    public static MySingleTon getInstance(){//提供一个全局访问点
        return singleTon;
    }
}

(2)懒汉式单利模式`

class SingleTon{
    private static SingleTon2 singleTon = null;
    private SingleTon(){
        System.out.println("构造函数");
    }
    private static SingleTon getInstance(){
                if (singleTon == null){//当singleTon为空时,new一个对象
                     singleTon = new SingleTon();
                }
        return singleTon;
    }

这种设计在多线程时不能保证线程安全,因为当一个线程还没有创建完成时又进入一个线程,等于new了两次对象,所以我们对它作出如下改进:

class SingleTon{
    private static Object lock = new Object();//定义一个父类为Objectd的lock变量
    private static SingleTon singleTon = null;
    private SingleTon(){
        System.out.println("构造函数");
    }
    //可重入函数,即线程安全的函数
    private static SingleTon getInstance(){
    //临界区代码段
        if(singleTon == null){//双重检验
            synchronized (lock){//原子性操作
                if (singleTon == null){
                     singleTon = new SingleTon();
                }
            }
        }
        return singleTon;
    }

二丶继承与多态
(1)继承:继承是重用现有类(基类base class、父类parent class、超类super class)创建新类(子类sub class、派生类derived class)的过程,派生类继承了基类除构造函数外的所有属性。

class Person{
    private String name;
    private String sex;
    public Person(String name,String sex){
        this.name = name;
        this.sex = sex;
        System.out.println("构造函数");
    }
    public void fun1(){
        System.out.println("This is Person.fun1");
    }
}
class Student extends Person{
    private int number;
    public Student(String N,String S){
        super(N,S);//super关键字,对当前对象父类的引用,必须写在子类构造函数的第一行
        this.number = 001;
    }
    public void fun1(){
        System.out.println("This is student.fun1");
    }
}

super();—>调用基类的构造函数
super.data—>访问基类的数据成员
super.func();—>调用基类的成员方法
(3)基类的数据成员在派生类当中的访问权限(1表示可以,0表示不可以)
在这里插入图片描述
多态
(1)动多态(运行时多态)
在这里插入图片描述
输出结果:

(2)静多态(编译时多态),方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。

        Student student = new Student(" "," ");
        System.out.println(person.toString());//编译时多态,执行Person类的toString()方法
        System.out.println(student.toString());
        person.fun1();

猜你喜欢

转载自blog.csdn.net/qq_38098946/article/details/83582798