【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