小结:
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在内存中运行过程