基本概念
通常情况下成员变量隶属于对象层级,每创建一个对象就需要申请独立的内存空间来存放该对象独立的成员变量信息,若所有对象的某个成员变量数值完全一样却又单独存放会造成内存空间的浪费。
为了解决上述问题,则使用static关键字修饰成员变量表达静态的含义,此时该成员变量由对象层级提升为类层级被所有对象共享,该成员变量随着类的加载准备就绪,于是否创建对象无关。
静态的成员(属性和方法)可以用对象.调用,但 一般推荐用类名.调用。
package com.example.springboot;
public class School {
public static String gname;
private String address;
private String size;
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
@Override
public String toString() {
return "Scoogle{" +
"gname='" + gname + '\'' +
", address='" + address + '\'' +
", size='" + size + '\'' +
'}';
}
}
package com.example.springboot;
import org.junit.jupiter.api.Test;
public class TestE {
@Test
public void main(){
//这个位置此时还没创建对象
System.out.println("//"+ School.gname);
School sco = new School();
sco.setGname("市一中");
sco.setAddress("裕华区");
sco.setSize("20103m²");
School sco2 = new School();
sco2.setGname("十七中");
sco2.setAddress("长安区");
sco2.setSize("2103m²");
//被所有对象共享
sco.setGname("市二中");
System.out.println("----------------------"+sco2.getGname());
School sco3 = new School();
System.out.println("``````````````````````"+sco3.getGname());
return;
}
}
使用方法
(1) 在非静态的成员方法中既能访问非静态的成员也能访问静态的成员;
(成员:成员变量 + 成员方法, 静态成员被所有对象共享)
(2)在静态的成员方法中只能访问静态的成员不能访问非静态的成员;
(成员:成员变量 + 成员方法,调用静态方法时可能还没有创建对象)
(3)只有隶属于类层级被所有对象共享的内容才可以使用static修饰
(不能滥用statci关键字)
package com.example.springboot;
import org.junit.jupiter.api.Test;
public class TestF {
private String str = "河北省石家庄市";// 隶属于对象层级,每个对象都拥有一份
private static String str2 = "河南省郑州市";//隶属于类层级,所有对象都有一份
@Test
//下面的方法没有static修饰,隶属于对象层级
public void show(){
System.out.println( "---------------"+str);
System.out.println( "---------------"+str2);
}
//使用static修饰的方法隶属于类层级,推荐使用 类名.的方式访问
public static void test(){
//System.out.println( "---------------"+str);//error
System.out.println( "---------------"+str2);
}
public static void main(){
TestF.test();
TestF.main();
TestF f = new TestF();
f.show();
}
}