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 }
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 }
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 }
/* 静态代码块的格式是: public class 类名称{ static { // 静态代码块的内容 } } 特点:当第一次用到本类时,静态代码块执行唯一的一次 静态内容总是优先于非静态,所以静态代码块比构造方法先执行 静态代码块的典型用途:用来一次性的静态成员变量进行赋值 */ public class Demo04Static { public static void main(String[] args) { Person one = new Person(); Person two = new Person(); } }