当前位置: 首页 > news >正文

java中的static和单例模式

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

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

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


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

类名.类变量

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

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

创建一个学生类:

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

 进行操作:
 

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);//aaaSystem.out.println(student.name);//aaa}}

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

成员方法:

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

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

类方法的使用场景:

用来做工具类。

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

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

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;

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

使用:
定义了一个学生类:
 

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

使用:
 

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

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

实例代码块:
格式:{}

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

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

单例设计模式:

确保类只有以一个对象;

写法:

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

创建一个类:

public class sin {
//1:私有化无参构造器private sin(){}
//2:定义一个类变量记住类的一个对象private static sin a=new sin();
//定义一个类方法,返回对象public static sin getsin(){return a;}
}

操作:
 

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@2f4d3709com.he.static3.sin@2f4d3709*/}
}

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

懒汉式单例设计模式:
写法:

  1. 把类的构造器私有化
  2. 定义一个类变量,用于存储对象
  3. 提供一个类方法,保证返回的是同一个对象 
public class lan {private lan(){}
//2定义一个类变量,先不初始化,用于存储对象。private static lan b;
//3提供一个类方法,保证返回的是同一个对象 public static lan getlan(){if(b==null){b=new lan();}return b;}
}

http://www.lryc.cn/news/329123.html

相关文章:

  • RabbitMQ相关总结
  • RAFT: Adapting Language Model to Domain Specific RAG
  • 第十五届蓝桥杯第三期模拟赛第十题 ← 上楼梯
  • 第四题:星期一
  • Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)
  • 2024蓝桥杯每日一题(区间DP)
  • LeetCode-2952. 需要添加的硬币的最小数量【贪心 数组 排序】
  • 新书速递——《可解释AI实战(PyTorch版)》
  • 国产数据库中统计信息自动更新机制
  • 【C++】入门C++(中)
  • javaIO
  • 睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用
  • 用JSch实现远程传输文件并打包成jar
  • 2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)
  • 力扣刷题Days28-第二题-11.盛水最多的容器(js)
  • 文生图大模型三部曲:DDPM、LDM、SD 详细讲解!
  • 算法学习——LeetCode力扣动态规划篇10(583. 两个字符串的删除操作、72. 编辑距离、647. 回文子串、516. 最长回文子序列)
  • TASKPROMPTER
  • C之易错注意点转义字符,sizeof,scanf,printf
  • 等级保护测评无补偿因素的高风险安全问题判例(共23项需整改)
  • JavaScript笔记 09
  • 操作教程|在MeterSphere中通过SSH登录服务器的两种方法
  • Swashbuckle.AspNetCore介绍
  • 【Spring】通过Spring收集自定义注解标识的方法
  • 基于深度学习的图书管理推荐系统(python版)
  • MATLAB 点云随机渲染赋色(51)
  • 通过一篇文章让你完全掌握VS和电脑常用快捷键的使用方法
  • ChatGPT指引:借助ChatGPT撰写学术论文的技巧
  • 魔改一个过游戏保护的CE
  • rust嵌入式开发之await