Java static 关键字

 

 

 

static 修饰成员变量:

如果一个成员变量使用了 static 关键字,那么这个变量不再属于对象自己,而是属于所在的类。 多个对象共享同一份数据

 1 package cn.itcast.day08.demo03;
 2 
 3 public class Student {
 4 
 5     private int id; //学号
 6     private String name;
 7     private int age;
 8     static String room; //所在教室
 9     private static int idCounter = 0; //学号计数器,每当new了一个新对象的时候,计数器++
10 
11     public Student() {
12         this.id = ++idCounter;
13     }
14 
15     public Student(String name, int age) {
16         this.name = name;
17         this.age = age;
18         this.id = ++idCounter;
19     }
20 
21     public String getName() {
22         return name;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public int getAge() {
30         return age;
31     }
32 
33     public void setAge(int age) {
34         this.age = age;
35     }
36 
37     public int getId() {
38         return id;
39     }
40 
41     public void setId(int id) {
42         this.id = id;
43     }
44 }
View Code
 1 /*
 2 如果一个成员变量使用了 static 关键字,那么这个变量不再属于对象自己,而是属于所在的类。 多个对象共享同一份数据
 3  */
 4 
 5 public class Demo01StaticField {
 6 
 7     public static void main(String[] args) {
 8         Student one = new Student("郭靖", 19);
 9         one.room = "101Room";
10         System.out.println("name: " + one.getName()
11                 + ",age: " + one.getAge() + ",room: " + one.room + ",id: " + one.getId());
12 
13         Student two = new Student("黄蓉", 16);
14         System.out.println("name: " + two.getName()
15                 + ".age: " + two.getAge() + ",room: " + two.room + ",id: " + two.getId());
16 
17     }
18 }

 

static修饰成员方法:

1. 一旦使用static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类的。

2. 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它
如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它

3. 无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用:
静态变量:类名称.静态变量
静态方法:类名称.静态方法()

注意事项:
1. 静态不能直接访问非静态
原因:在内存中先有的静态内容,后有的非静态内容。 "先人不知道后人, 但是后人知道先人"
2. 静态方法中不能用this
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。静态方法调用方式是类名称.静态方法,没有对象的事

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


静态static内存图

 

 

静态代码块:

1 public class Person {
2     static {
3         System.out.println("静态代码块执行");
4     }
5 
6     public Person() {
7         System.out.println("构造方法执行");
8     }
9 }
View Code
/*
静态代码块的格式是:

public class 类名称{
    static {
        // 静态代码块的内容
    }
}

特点:当第一次用到本类时,静态代码块执行唯一的一次
静态内容总是优先于非静态,所以静态代码块比构造方法先执行

静态代码块的典型用途:用来一次性的静态成员变量进行赋值
 */

public class Demo04Static {
    public static void main(String[] args) {
        Person one = new Person();
        Person two = new Person();
    }
}

 

posted on 2021-06-21 18:59  mlllily  阅读(44)  评论(0编辑  收藏  举报