zoukankan      html  css  js  c++  java
  • 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

        

     

  • 相关阅读:
    BZOJ1093: [ZJOI2007]最大半连通子图
    BZOJ4033: [HAOI2015]树上染色
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    BZOJ4944: [Noi2017]泳池
    BZOJ1269: [AHOI2006]文本编辑器editor
    BZOJ4596: [Shoi2016]黑暗前的幻想乡
    BZOJ1815: [Shoi2006]color 有色图
    BZOJ1488: [HNOI2009]图的同构
    BZOJ3527: [Zjoi2014]力
    Salazar Slytherin's Locket CodeForces
  • 原文地址:https://www.cnblogs.com/momo-nancy/p/15228220.html
Copyright © 2011-2022 走看看