Java static关键字
- 一、static关键字概述
- 二、被static关键字修饰的属性和方法
- 1.被static修饰的属性
- 2.被static修饰的方法
- 3.static在内存中运行的过程
- 三、静态代码块
一、static关键字概述
功能
1.用来修饰类属性和类变量。
2.加载静态代码块。
特点
1.类变量的生命周期和类相同,
在整个应用程序执行期间都有效
。
2.static修饰的成员变量和方法,属于类,可以直接通过类来调用
3.静态方法不能调用非静态(方法/变量)
,编译会报错
4.被static修饰的成员方法、变量没有this关键字
(不依赖于任何对象)
意义
1.在不创建对象时,可以
直接使用类名.(方法/变量)
2.当一个类的某一属性内容固定时,可以节约资源开销
。
举个栗子:
假设一个类的某一属性为:国籍
那么为中国14亿人口创建14亿个对象,存入数据,那么就会有14亿个"中国"被重复存储,浪费大量资源。而static关键字正可以避免这种重复存储的"尴尬"。
static直接将属性信息存储到 “类” 中,可以直接通过类名.静态属性
来实现读取修改即可public class Chinese{ private String ID;//身份证号码 private String name;//姓名 static String nationality = "中国";//国籍 构造方法,setter和getter方法 略 }
二、被static关键字修饰的属性和方法
1.被static修饰的属性
定义格式
class Chinese{
static String nationality;//国籍
}
使用 — 赋值
//======(推荐)直接使用类名赋值=========
Chinese.nationality = "中国";
//======(不推荐)使用对象名赋值=========
Chinese peopleOne = new Chinese("37**************11","张 __ __ ");
peopleOne.nationality = "中国";
使用 — 调用
//======(推荐)直接使用类名调用=========
System.out.println(Chinese.nationality);
//======(不推荐)使用对象名调用=========
Chinese peopleTwo = new Chinese("37**************22","李 __ __ ");
System.out.println(peopleTwo.nationality);
完整代码示例
class Chinese{
private String ID;//身份证号码
private String name;//姓名
//使用static修饰国籍
static String nationality;//国籍
public Chinese() {}
public Chinese(String ID, String name) {this.ID = ID;this.name = name;}
public String getID() {return ID;}
public void setID(String ID) {this.ID = ID;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public static String getNationality() {return nationality;}
public static void setNationality(String nationality) {Chinese.nationality = nationality;}
}
public class Test {
public static void main(String[] args) {
//(推荐)使用类名.变量名进行赋值
Chinese.nationality = "中国";
//(推荐)使用类名.setter方法赋值
Chinese.setNationality("中国");
//=======静态属性未被private修饰时两种赋值方式
//创建第一个对象
Chinese peopleOne = new Chinese("37**************11","张 __ __ ");
//(不推荐)使用对象名.变量名进行赋值
peopleOne.nationality = "中国";
//(不推荐)使用对象名.setter方法赋值
peopleOne.setNationality("中国");
System.out.println(
"身份证号码为:"+peopleOne.getID()+","+
"姓名:"+peopleOne.getName()+","+
//(推荐)使用类名.变量名获取变量值
"国籍:"+Chinese.nationality+"。");
//创建第二个对象
Chinese peopleTwo = new Chinese("37**************22","李 __ __ ");
System.out.println(
"身份证号码为:"+peopleTwo.getID()+","+
"姓名:"+peopleTwo.getName()+","+
//(不推荐)使用对象名.变量名获取变量值
"国籍:"+peopleTwo.nationality+"。");
}
}
程序运行截图
2.被static修饰的方法
定义格式
[权限修饰符] static [返回值类型] 方法名称([参数列表]){
[方法体;]
}
使用 — 调用
类名.方法名([参数列表]);
完整代码示例
class MyClass {
public void memberMethod(){
System.out.println("这是一个成员方法!");
//必须创建一个对象来调用!
}
public static void staticMethod(){
System.out.println("这是一个静态方法!");
//可以使用类名直接调用(推荐)
//也可以使用对象名调用(不推荐)
}
}
public class Test {
public static void main(String[] args) {
//使用对象调用成员方法和静态方法
MyClass my = new MyClass();
//使用对象调用成员方法
my.memberMethod();
//(不推荐)对象调用静态方法
my.staticMethod();
System.out.println("============");
//(推荐)使用类名调用静态方法
MyClass.staticMethod();
}
}
3.static在内存中运行的过程
1.方法区加载类的相关信息(被static修饰的变量和方法会被放入方法区中的静态区)2.main()方法进入栈内存3.程序开始按顺序执行
三、静态代码块
只有
第一次执行静态代码块所在的类时
,静态代码块会执行唯一一次
,
以后再用到静态代码块所在的类时,
静态代码块不会再执行
静态代码块的使用
public class Test { static { System.out.println("静态代码块执行了!"); } public Test(){ System.out.println("构造方法执行了!"); } }public class TestDemo{ public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); Test t3 = new Test(); } }
运行结果
典型用法:
用来一次性的对静态成员变量进行赋值。