小结:
static可以用来修饰类中的成员(成员变量,成员方法), 也可以用来修饰成员内部类。被静态所修饰的成员,随着类的加载而加载,优先于对象存在,会被所有的对象所共享,可以通过类名直接调用,静态方法中,只能调用静态的成员(静态成员变量,静态成员方法)
static关键词
引源:当我们new很多对象时,对象中会有自己特有属性,也可能存在共同属性,为了避免浪费内存空间
特点:当static修饰方法时,该方法属于类,与对象没有关系。被静态修饰的成员,可以被类.名字直接调用
案例:
public class Demo {
public static int num = 100;
}
public class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num);
System.out.println(d2.num);
}
console:
200
200
注意事项:
1: 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。(静态内容先存在去调用后存在的对象内容,显然会报错)
class Demo {
//成员变量
public int num = 100;
//静态方法
public static void method(){
//this.num; 不能使用this/super。
System.out.println(this.num);
}
}
2: 同一个类中,静态成员只能访问静态成员(权限问题)class Demo {
//成员变量
public int num = 100;
//静态成员变量
public static int count = 200;
//静态方法
public static void method(){
//System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法
System.out.println(count);
}
}
3:定义静态常量,通常使用public static final修饰的变量来完成定义。此时变量名用全部大写,多个单词使用下划线连接
public class Student {
public static final String STUDENT_NAME = "mark";
public static void method(){
System.out.println("一个静态方法");
}
}
/*
*当我们想使用类的静态成员时,不需要创建对象,直接使用类名来访问即可。
*/
System.out.println(Student.STUDENT_NAME); //打印学生姓名
Company.method(); // 调用一个静态方法
console:
mark
一个静态方法
结尾:在静态中不能调用非静态(生命周期导致,静态优先于非静态而存在,存在的东西调用不存在的东西显然错误),下图为static在内存中运行过程