static关键字

  1. static可以修饰:属性、方法、代码块、内部类。
  2. static修饰属性;

    1. public class Test {
    2. //属性:
    3. int id;
    4. static int sid;
    5. //这是一个main方法,是程序的入口:
    6. public static void main(String[] args) {
    7. //创建一个Test类的具体的对象
    8. Test t1 = new Test();
    9. t1.id = 10;
    10. t1.sid = 10;
    11. Test t2 = new Test();
    12. t2.id = 20;
    13. t2.sid = 20;
    14. Test t3 = new Test();
    15. t3.id = 30;
    16. t3.sid = 30;
    17. //读取属性的值:
    18. System.out.println(t1.id);
    19. System.out.println(t2.id);
    20. System.out.println(t3.id);
    21. System.out.println(t1.sid);
    22. System.out.println(t2.sid);
    23. System.out.println(t3.sid);
    24. }
    25. }

    内存分析
    image.png
    一般官方的推荐访问方式:可以通过类名.属性名的方式去访问

    1. Test.sid=100;
    2. System.out.println(Test.sid);

    static修饰属性总结:

    1. 在类加载的时候一起加载到方法区的静态域中
    2. 先于对象存在
    3. 访问方式是:对象名.属性名、类名.属性名(推荐)

static修饰属性的应用场景:某些特定的数据想要在内存中共享,只有一块(这个情况下就可以使用static修饰的属性)

  1. public class MsbStudent {
  2. //属性:
  3. String name;
  4. int age;
  5. static String school;
  6. //这是一个main方法,是程序的入口:
  7. public static void main(String[] args) {
  8. MsbStudent.school = "马士兵教育";
  9. //创建学生对象:
  10. MsbStudent s1 = new MsbStudent();
  11. s1.name = "张三";
  12. s1.age = 19;
  13. //s1.school = "马士兵教育";
  14. MsbStudent s2 = new MsbStudent();
  15. s2.name = "李四";
  16. s2.age = 21;
  17. //s2.school = "马士兵教育";
  18. System.out.println(s2.school);
  19. }
  20. }

属性:
静态属性(类变量)
非静态属性(实例变量)

  1. static修饰方法
    1. public class Demo {
    2. int id;
    3. static int sid;
    4. public void a(){
    5. System.out.println(id);
    6. System.out.println(sid);
    7. System.out.println("------a");
    8. }
    9. //1.static和public都是修饰符,并列的没有先后顺序,先写谁后写谁都行
    10. static public void b(){
    11. //System.out.println(this.id);//4.在静态方法中不能使用this关键字
    12. //a();//3.在静态方法中不能访问非静态的方法
    13. //System.out.println(id);//2.在静态方法中不能访问非静态的属性
    14. System.out.println(sid);
    15. System.out.println("------b");
    16. }
    17. //这是一个main方法,是程序的入口:
    18. public static void main(String[] args) {
    19. //5.非静态的方法可以用对象名.方法名去调用
    20. Demo d = new Demo();
    21. d.a();
    22. //6.静态的方法可以用对象名.方法名去调用;也可以用类名.方法名 (推荐)
    23. Demo.b();
    24. d.b();
    25. }
    26. }
    在静态方法中不能使用this关键字
    在静态方法中不能访问非静态的方法
    在静态方法中不能访问非静态的属性