文章目录
1.static
1)static修饰变量(静态变量)
对象不再属于自己,而属于所属的类。即多个对象共享同一份数据。
如上图中的教室就是公共属性(所有对象都可以使用的属性)
定义一个Student类。里面有学号(实现自加)、年龄、名字属性。
public class Student {
private int id;
private int age;
private String name;
static String room;
private static int idCounter = 0;
public Student(){
idCounter ++ ;
}
public Student(int age, String name){
this.age=age;
this.name=name;
this.id= ++ idCounter;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getRoom() {
return room;
}
public static void setRoom(String room) {
Student.room = room;
}
}
①何时使用static定义属性?
当描述共享属性或者是不受实例化对象限制的属性时才会使用。
2)static修饰方法(静态方法)
public class Demo{
public static void main(String[] args) {
methodStatic();//因为是本类,所以类名称可以省略.=Demo.methodStatic()
}
public void method(){
System.out.println("这是一个普通方法");
}
public static void methodStatic(){
System.out.println("这是一个静态方法");
}
}
①注意事项:
I.静态不能直接访问非静态
原因:在内存当中是【先】有的静态内容,【后】有的非静态内容。
II.静态方法当中不能用this。
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。(使用了static定义就用不上对象了)
②何时使用?
不保存普通属性时定义static方法。
产生实例化对象是因为在堆内存中可以保存属性信息,所以如果一个类中没有属性产生,就没必要再去开辟堆内存保存属性内容了,就可以考虑使用static了。
③总结static定义属性、方法
static修饰的变量和方法可以通过 “类名.对象名”访问,而不用static修饰的变量和方法只能通过对象名访问。
3)static内存图分析:
4)静态代码块:
使用static定义的代码块。(静态块会优先调用,并且只执行唯一的一次)
public class Student {
static{
System.out.println("这是一个静态代码块");
}
public Student(){
System.out.println("这是一个构造方法");
}
}
//创建两个对象
Student s1 = new Student();
Student s2 = new Student();
//这是一个静态代码块
//这是一个构造方法
//这是一个构造方法
JDK1.7之前的BUG:静态块会优先于主方法执行。(main–主方法是一切程序的起点)
何时使用?
用来一次性地对静态成员变量进行赋值。