static修饰成员属性作用:
多个对象共享同一份数据,一旦用了static关键字。那么这样的内容不再属于自己,而是属于类,只在类中保存唯一一份,所有对象共享同一份。
成员变量中static用法
/*
类的定义注意事项:
成员变量是直接定义在类党总的,在方法外边
成员方法不要写static关键字。
*/
public class Student {
private int id;//学号,不在构造方法中使用
private String name;//姓名
private int age;//年龄
static String room;//教室
private static int idCounter = 0; //计数器,自动生成学号使用
public Student() {
this.id = ++idCounter;
}
public Student(String name, int age) {
this.id = ++idCounter;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static String getRoom() {
return room;
}
public static void setRoom(String room) {
Student.room = room;
}
}
//创建实例
public class StaticDemo {
public static void main(String[] args) {
Student stu = new Student("李四",18);
stu.room = "教室001";
Student stu1 = new Student("张三",26);
System.out.println("姓名:" + stu.getName() + "年龄:" + stu.getAge() +
"所在教室:" + stu.room + "学号:" + stu.getId());
System.out.println("姓名:" + stu1.getName() + "年龄:" + stu1.getAge() +
"所在教室:" + stu1.room + "学号:" + stu1.getId());
}
}
static修饰成员方法作用:
一旦static修饰成员方法,那么这个方法不属于对象,而是属于类。
如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
public class Student {
public void eat(){
System.out.println("普通方法!");
}
public static void staticMain(String[] args) {
System.out.println("静态方法!");
}
}
实例化使用方法:
public class StudentDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.eat();//正确调用普通方法
Student.staticMain();//正确调用静态方法
staMain();//调用自己的静态方法,可以省略类名 完全等效于 StudentDemo.staMain
}
public static void staMain() {
System.out.println("自己的方法");
}
}
静态方法与静态变量的作用域:
-
静态方法可以直接访问静态成员变量。
-
静态方法不能访问非静态成员变量。(原因:非静态属于对象,而静态方法属于类)
-
静态方法当中不能使用this。因为静态方法是通过类调用,this仍然指的是对象。
-
普通方法可以访问所有的成员变量。
static内存图:
静态代码块:
直接在类中用static声明
- 当第一次用到本类时,静态代码块执行唯一的一次。
- 静态的内容总是优先于非静态,所以静态代码块的内容先执行。
静态代码块的典型用途:
用来一次性对静态成员变量进行赋值。
public class Phone {
static {
System.out.println("静态代码块启动!");
}
public Phone(){
System.out.println("构造方法执行!");
}
}
//实例化对象
public class PhoneDemo {
public static void main(String[] args) {
Phone n1 = new Phone();
Phone n2 = new Phone();
}
}