static关键字
- static是静态的意思,可以修饰成员变量和成员方法。
- static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。
- 成员变量可以分为两类:
- 静态成员变量(有static修饰,属于类,内存中加载一次): 常表示如在线人数信息、等需要被共享的信息,可以被共享访问。
- 实例成员变量(无static修饰,存在于每个对象中):常表示姓名name、年龄age、等属于每个对象的信息。
- 成员方法可以分为两类:
- 静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问。
- 实例成员方法(无static修饰,属于对象),只能用对象触发访问。
访问(推荐)
类名.静态成员变量
对象.实例成员变量
类名.静态成员方法
对象.实例成员方法
static应用1:定义工具类
例:
package com.util;
import java.util.Random;
public class UtilTest {
private UtilTest() {
}
/**
* 随机产生n位验证码,由数字、大写字母、小写字母组成
* @param n
* @return
*/
public static String createCode(int n) {
String result = "";
Random random = new Random();
for (int i = 0; i < n; i++) {
int type = random.nextInt(3);//0 小写 1 大写 2 数字
switch (type) {
case 0:
result += (char) ('a'+random.nextInt(26));
break;
case 1:
result += (char) ('A'+random.nextInt(26));
break;
case 2:
result += random.nextInt(10);
break;
}
}
return result;
}
}
static应用2:代码块
代码块:
- 代码块是类的5大成分之一(成员变量、构造器,方法,代码块,内部类),定义在类中方法外。
- 在Java类下,使用 { } 括起来的代码被称为代码块 。
代码块分类:
- 静态代码块:
- 格式:static{}
- 特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
- 使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。
- 构造代码块(了解,用的少):
- 格式:{}
- 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
- 使用场景:初始化实例资源。
作用:
- 如果要在启动系统时对数据进行初始化。建议使用静态代码块完成数据的初始化操作,代码优雅。
例:斗地主游戏在开始时初始化54张牌
package com.demo11;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class GameDemo {
public static List<Card> cards = new ArrayList<>();
static{
String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[] colors = {"♠","♥","♦","♣"};
int index=0;
for (int i = 0; i < sizes.length; i++) {
index++;
for (int j = 0; j < colors.length; j++) {
Card card = new Card(sizes[i], colors[j], index);
cards.add(card);
}
}
Card cardS = new Card("","大🃏",++index);
Card cardB = new Card("","小🃏",++index);
// cards.add(cardB);
// cards.add(cardS);
Collections.addAll(cards,cardS,cardB);
System.out.println(cards);
}
public static void main(String[] args) {
}
}
static应用3:单例设计模式
- 饿汉单例模式 (在用类获取对象的时候,对象已经提前为你创建好了)
package com.designSign.singleInstance;
/**
* 饿汉单例
*/
public class SingleInstance1 {
public static SingleInstance1 instance = new SingleInstance1();
private SingleInstance1(){
}
}
- 懒汉单例模式( 在真正需要该对象的时候,才去创建一个对象(延迟加载对象))
package com.designSign.singleInstance;
/**
* 懒汉单例
*/
public class SingleInstance2 {
private static SingleInstance2 instance;
public static SingleInstance2 getInstance(){
if (instance==null){
instance = new SingleInstance2();
}
return instance;
}
private SingleInstance2(){
}
}
- …
注意事项
- 静态方法只能访问静态的成员,不可以直接访问实例成员。
- 实例方法可以访问静态的成员,也可以访问实例成员。
- 静态方法中是不可以出现this关键字的。