静态关键字概述

image.png

静态static关键字修饰成员

  1. package com.Demo05;
  2. /*
  3. 一旦使用static修饰成员方法,那么就成为了静态方法,静态方法不属于对象,而属于类
  4. 如果没有static关键字,那么必须先创建对象,然后通过对象才能使用它
  5. 如果有了static关键字,那么不需要创建对象,直接能通过类名称来使用它
  6. 无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用
  7. 静态变量:类名称.静态变量
  8. 静态方法:类名称.静态方法()
  9. 注意事项:
  10. 1.静态方法不能直接访问非静态
  11. 原因:因为内存当中是【先】有的静态内容,【后】有的非静态内容
  12. “先人不知道后人,但是后人知道先人”
  13. 2.静态方法当中不能用this
  14. 原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。但是静态方法属于类
  15. */
  16. public class Demo01StaticMethod {
  17. public static void main(String[] args) {
  18. MyClass obj = new MyClass(); //首先创建对象
  19. //才能使用没有static关键字的内容
  20. System.out.println(obj.num);
  21. obj.method();
  22. //对于静态方法来说,可以通过对象那个名进行调用,也可以通过类名称来调用
  23. obj.methodStatic(); //正确,不推荐。这种写法再编译之后也会被java翻译成为“类名称.静态方法名”
  24. MyClass.methodStatic(); //正确,推荐
  25. //对于本类当中的静态方法,可以省略类名称
  26. myMethod();
  27. Demo01StaticMethod.myMethod(); //完全等效
  28. }
  29. public static void myMethod(){
  30. System.out.println("自己的静态方法");
  31. }
  32. }
  33. ==============================================================================================
  34. package com.Demo05;
  35. public class MyClass {
  36. int num; //成员变量
  37. static int numStatic; //静态变量
  38. //成员方法
  39. public void method(){
  40. System.out.println("这是一个成员方法");
  41. //成员方法可以访问成员变量
  42. System.out.println("成员方法访问成员变量"+num);
  43. //成员方法可以访问静态变量
  44. System.out.println("成员方法访问静态变量"+numStatic);
  45. }
  46. //静态方法
  47. public static void methodStatic(){
  48. System.out.println("这是一个静态方法");
  49. //静态方法不可以直接访非静态【重点】
  50. // System.out.println(num); //错误写法
  51. //静态可以直接访问静态变量
  52. System.out.println("静态方法访问静态变量"+numStatic);
  53. //静态方法不能使用this关键字
  54. // System.out.println(this);
  55. }
  56. }

静态static的内存图

【注意】:根据类名称访问静态变量的成员的时候,全程和对象没有关系,只和类有关系

  1. package com.Demo05;
  2. public class Demo02StaticMethodStudent {
  3. public static void main(String[] args) {
  4. Student.room="101教室";
  5. Student one = new Student();
  6. one.age=18;
  7. one.name="huahua";
  8. System.out.println("one的姓名:"+one.getName()+",年龄:"+one.getAge()+","+Student.room);
  9. System.out.println("================================================");
  10. Student two = new Student();
  11. two.age=20;
  12. two.name="zhizhi";
  13. System.out.println("one的姓名:"+two.getName()+",年龄:"+two.getAge()+","+Student.room);
  14. }
  15. }
  16. ===============================================================================================
  17. package com.Demo05;
  18. public class Student {
  19. int age;
  20. String name;
  21. static String room;
  22. public Student(){
  23. }
  24. public Student(int age, String name) {
  25. this.age = age;
  26. this.name = name;
  27. }
  28. public int getAge() {
  29. return age;
  30. }
  31. public void setAge(int age) {
  32. this.age = age;
  33. }
  34. public String getName() {
  35. return name;
  36. }
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40. public static String getRoom() {
  41. return room;
  42. }
  43. public static void setRoom(String room) {
  44. Student.room = room;
  45. }
  46. }

image.png

静态代码块

  1. package com.Demo05;
  2. /*
  3. 静态代码块的格式:
  4. public class 类名称{
  5. static{
  6. //静态代码块的内容
  7. }
  8. }
  9. 特点:当第一次用到本类时,静态代码块执行唯一的一次
  10. 静态内容总是优先于非静态,所以静态代码块比构造方法先执行。
  11. 静态代码块的典型用途:
  12. 用力啊一次性对静态成员变量进行赋值
  13. */
  14. public class Demo03StaticBlock {
  15. static {
  16. System.out.println("静态代码块执行!!");
  17. }
  18. public Demo03StaticBlock(){
  19. System.out.println("无参构造方法执行!!");
  20. }
  21. public Demo03StaticBlock(String str){
  22. System.out.println("全参构造方法执行!!");
  23. }
  24. }
  25. =================================================================================================
  26. package com.Demo05;
  27. public class Demo03StaticBlockTest {
  28. public static void main(String[] args) {
  29. Demo03StaticBlock obj = new Demo03StaticBlock();
  30. Demo03StaticBlock obj1 = new Demo03StaticBlock("123");
  31. }
  32. }

执行结果:image.png