【Java】静态Static单例模式

1.静态static

    概念:在有一种情况下,就是无论这个类的对象怎么变化,某些特质始终不会变,这类特质我们称之为静态属性。

    静态的只能访问静态,非静态的可以访问静态和非静态

    静态当中是不可以使用this和super

    类中不存在静态的构造

  静态变量:

  使用static关键字来修饰成员变量,该变量就被称为静态变量。

  static关键字只能用来修饰成员变量,不能用来修饰局部变量。

  静态变量被所有实例共享。

  静态内存唯一,和实例没有任何关系,所以可以直接通过“类名.变量名”进行调用

  静态常量:

    被static修饰的常量被称为静态常量

    成员属性如果是常量,则必须赋初值,否则编译不通过,可以通过构造来赋初值

静态方法:

    被static关键字修饰的方法,称为静态方法

    静态方法只能访问静态属性

    静态方法可以使用“类名.方法名”来访问

    在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建对象

静态代码块:

每个静态代码块,只会被执行一次

申明对象的时候,静态代码块并不会被执行,只有类被加载的时候才会

静态代码块可以有多个,顺序执行

静态代码块,样式如下:

static{
        System.out.println("静态代码块");
    }

 

2.单例模式

  什么是单例模式?

    为了保证资源不被过多得浪费,提出一种能让整个系统中一个类只能被实例化对象一次,且实例化对象在内存中唯一存在的路,实现这种思路的功能称作单例模式。

  单例模式的特点:

    单例模式内存唯一,资源共享

  代码实现单例模式:

    使用private关键字定义私有化静态属性

    使用private关键字私有化构造方法

    同步静态方法供外部共享。

package org.example;

/**
 * 单例模式
 */
public class Student {
    //使用static关键字让对象唯一存在
    private static Student stu;

    //私有化构造方法,保证类的外部无法实例化对象
    private Student() {
    }

    /**
     * 给外部提供一个唯一能够获得对象得方法
     * 如果已经构建对象,则不用再继续构建,没有才能重新构建
     * @return
     */
    public synchronized static Student getStu() {
        if(stu == null){
            stu = new Student();
        }
        return stu;
    }

    private String name; //名字私有化
    private int age;//年龄私有化

    /*
     *给私有化的name设置getter方法
     */
    public String getName() {
        return name;
    }

    /*
     *给私有化的name设置setter方法
     */
    public void setName(String name) {
        this.name = name;
    }

    /*
     *给私有化的age设置getter方法
     */
    public int getAge() {
        return age;
    }

    /*
     *给私有化的age设置getter方法
     */
    public void setAge(int age) {
        if (age <= 0){
            System.out.println("年龄不合法。。。。");
        }
        this.age = age;
    }

    public void introduce(){
        System.out.println("大家好!我叫"+name+",我今年"+age+"岁!");
    }
}

外部调用:

只能通过Student类提供的getStu方法获取对象,通过new 去创建对象直接提示报错。

package org.example;

import javax.rmi.CORBA.Stub;

public class Exceple1 {
    public static void main(String[] args) {
        //实例化对象已在student类内部自动判断完成,只有通过getStu()方法来获取
        Student stu = Student.getStu();
        stu.setName("小红"); //通过公开的方法设置姓名
        stu.setAge(-10);//通过公开的方法设置年龄
        stu.setAge(18);
        stu.introduce();//调用公开方法

    }
}

设计模式扩展可参考:

https://blog.csdn.net/qq_22339269/article/details/90176392

 

 

    

 

 

posted @ 2021-09-04 23:16  小墨儿  阅读(1311)  评论(0编辑  收藏  举报