java中的static和单例模式

同一个类中,访问其类成员,可以省略类名不写

static:叫静态,可以修饰成员变量,成员方法。

成员变量按照有无static修饰,分为两种:

类变量:有static修饰,属于类;在计算机中只有一份,会被类的所有对象共享;

类名.类变量

实例变量(对象的变量):无static修饰,属于每个对象,每个对象都会一份;

实例变量只能通过对象访问

创建一个学生类:

cpp 复制代码
public class student {
    static String name;//类变量
    int age;//实例变量(对象变量)
}

进行操作:

cpp 复制代码
public class test1 {
    public static void main(String[] args) {
        //1:类变量的用法
        //类名.类变量
        student.name="hhh";

        //对象名.类变量
        student s1=new student();
        s1.name="xxx";

        student s2=new student();
        s2.name="aaa";

        类变量在计算机中只有一份
        System.out.println(s1.name);//aaa
        System.out.println(student.name);//aaa
    }

}

类变量的应用场景:

在开发中,如果某个数据只需要一份,且希望能够被共享,则该数据可以定义类变量记住。

成员方法:

类方法:有static修饰的成员方法,属于类。

实例方法:无static修饰的成员方法,属于对象。

类方法的使用场景:

用来做工具类。

工具类就是一些类方法,每个方法都是用来完成一个功能的。

这是我写了一个生成任意数验证码的工具类:

cpp 复制代码
public class myutil {
       private  myutil() {
    }//别人不能创建对象
    public static String createCode(int n)
    {

        String tmp="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWSYZ1234567890";
        String code="";
        Random ra=new Random();
        for (int i = 0; i < n; i++) {
            int index=ra.nextInt(tmp.length());
            code+=tmp.charAt(index);
        }
        return code;
    }
}

类方法不用生成对象占用内存。

static的注意事项:

1 类方法可以直接访问类成员(变量和方法),不可****以直接访问实例成员;

2 实例方法可以直接访问类成员,也可以直接访问实例成员;

3 类方法中不可以出现this关键字,但是实例方法中可以出现this;

代码块:

静态代码块:

格式:static {}

特点:类加载会自动执行,由于类只会加载一次,所以静态代码块只会加载一次1;

作用:完成类的初始化,例如:对类变量的初始化赋值

使用:

定义了一个学生类:

cpp 复制代码
public class student {
    public static int number=10;
    static//静态代码块
    {
        System.out.println("静态代码块执行");
    }
}

使用:

cpp 复制代码
public class test {
    public static void main(String[] args) {
        System.out.println(student.number);
        /*静态代码块执行
        10*/
        System.out.println(student.number);
        //10;
    }
}

可以发现静态代码块只执行了一次

实例代码块:

格式:{}

特点:每次创建对象时 ,执行实例代码块,并在构造器前执行

作用:和构造器一样,都是用来完成对象的初始化的。例如:对实例对象进行初始化赋值

单例设计模式:

确保类只有以一个对象;

写法:

  1. 把类的构造器私有化
  2. 定义一个类变量记住类的一个对象
  3. 定义一个类方法,返回对象

创建一个类:

cpp 复制代码
public class sin {
//1:私有化无参构造器
    private sin()
    {

    }
//2:定义一个类变量记住类的一个对象
    private static sin a=new sin();
//定义一个类方法,返回对象
    public static sin getsin()
    {
        return a;
    }
}

操作:

cpp 复制代码
public class test {
    public static void main(String[] args) {


        //只能通过sin.getsin获取对象,且此对象是static静态的,只有一份,所以是单例模式
        //sin a=new sin()//error:'sin()' has private access
        //可见不能通过无参构造器创建对象
        sin a1 = sin.getsin();
        sin a2 = sin.getsin();
        System.out.println(a1);
        System.out.println(a2);
        //结果:
        /*com.he.static3.sin@2f4d3709
        com.he.static3.sin@2f4d3709*/
    }
}

上面这个单例设计模式叫饿汉式单例:返回对象时,对象已经创建好

懒汉式单例设计模式:

写法:

  1. 把类的构造器私有化
  2. 定义一个类变量,用于存储对象
  3. 提供一个类方法,保证返回的是同一个对象
cpp 复制代码
public class lan {
    private lan(){

    }
//2定义一个类变量,先不初始化,用于存储对象。
    private static lan b;
//3提供一个类方法,保证返回的是同一个对象 
    public static lan getlan()
    {
        if(b==null)
        {
            b=new lan();
        }
        return b;
    }
}
相关推荐
金銀銅鐵9 小时前
带您看懂字节码指令(二):空循环里有什么
java·后端·ai编程
§ꦿCFོ༉9 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠10 小时前
十种不同风格的 CTP接口 框架
开发语言·python
吴名氏.10 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
.痞老板.11 小时前
java ee--多线程(进阶)
java·java-ee
深入云栈13 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
爱笑的k1113 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
wang_shu_mo_ran14 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
X1A0RAN14 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
量化分析码农15 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端