static静态关键字
1.static成员变量
- static + 成员变量:该变量在内存中只存储一份,可以被共享访问、修改。
- 静态成员变量的访问
public class User {
/**
* 例子:在线人数定义为静态成员变量
*/
public static int onlineNumber=50;
//实例成员变量
private String name;
private int age;
}
public class staticFieldDemo1 {
public static void main(String[] args) {
//1.用类名访问静态成员变量,推荐
//User.onlineNumber
System.out.println(User.onlineNumber);
//2.用对象访问静态成员变量,不推荐
User u=new User();
System.out.println(u.onlineNumber);
}
}
2.static成员变量的内存
存在堆内存
3.成员方法分类
- 静态成员方法(无static修饰,归属于类),建议类名访问,也可以用对象访问
- 实例成员方法(有static修饰,归属于对象),只能用对象触发访问
4.static成员方法内存
存在方法区
5.static访问注意事项
- 静态方法只能访问静态成员,不能直接访问实例成员(可以创建对象间接访问实例成员)
- 实例方法可以访问静态成员,也可以访问实例成员
- 静态方法中不能出现this关键字(因为this是当前对象地址,静态方法可能是不由对象调用的)
工具类
无需创建对象,内部都是一些静态方法,每个方法完成一个功能
一次编写,处处可用,提高代码的重用性
//例子:生成验证码的重复类
public class util {
/**
* 工具类无需创建对象,所以将其构造器私有化
*/
private util(){
}
//静态方法
public static String creatCode(int n){
String code="";
String data="abcdefghijklmnopqrstyvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"1234567890";
Random r=new Random();
for (int i = 0; i < n; i++) {
int index=r.nextInt(data.length());
code+=data.charAt(index);
}
return code;
}
}
代码块
- 类的5大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法外
- 在Java类中,用{}括起来的代码称为代码块
静态代码块:
- 格式:static{}
- 特点:用static关键字修饰,随着类的加载而加载,自动触发,只执行一次
- 使用场景:在类加载时,做一些静态数据初始化操作,以便后续使用
public class staticCodeDemo1 {
//静态资源,如城市名,一副扑克牌
public static String city;
public static ArrayList<String> cards=new ArrayList<>();
//静态代码块
static {
//比main方法优先调用
//作用:初始化静态资源
System.out.println("静态代码块被执行了");
city="北京";
};
public static void main(String[] args) {
System.out.println("main方法被执行");
System.out.println(city);
}
}
/*
静态代码块被执行了
main方法被执行
北京
*/
构造(实例)代码块:(很少用)
- 格式:{}
- 特点:每次创建对象,调用构造器前,都会执行一次{}中的代码,在构造器执行前执行(顺序:父构造,实例代码块,子构造)
- 使用场景:初始化实例资源
public class staticCodeDemo2 {
private String name;
staticCodeDemo2(){
System.out.println("无参构造器被触发执行");
name="张三";
}
//实例代码块
{
System.out.println("实例代码块被触发执行");
}
public static void main(String[] args) {
staticCodeDemo2 a=new staticCodeDemo2();
System.out.println(a.name);
}
}
/**
* 实例代码块被触发执行
* 无参构造器被触发执行
* 张三
*/
静态代码块案例:
扑克游戏需要一份扑克牌
- 存储54张牌类对象的集合,静态的集合指挥家在一份
- 系统启动同时准备好54张牌的数据,可用静态代码块完成
public class staticCodeTest3 {
/**
* 定义一个静态集合,因为当前房间只需要一副扑克牌
*/
public static ArrayList<String> cards=new ArrayList<>();
/**
*main方法执行前,放入54张牌
* 如果放在main中,若main调用很多次,static内容也会被执行多次,但在静态代码块只执行一次
*/
static{
//点数
String[] sizes={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//花色
String[] colors={"♥","♠","♦","♣"};
//组合
for (int i = 0; i < sizes.length; i++) {
for (int j = 0; j < colors.length; j++) {
String card=sizes[i]+colors[j];
cards.add(card);
}
}
cards.add("大
标签:String,子类,Day5,mt,static,父类,public,name
From: https://www.cnblogs.com/mt-nika/p/17063393.html