一. Static的概述:
static表示静态的意思,被static修饰的变量或者方法一般随着类的加载而诞生,优先于实例实例的变量和方法。也表示为共享数据
二.静态和非静态的区别:
1. 静态变量和实例变量:
静态变量在实例变量之前加载,
实例变量只能通过对象来访问,而静态变量可以通过类访问,所以又叫做类方法。也可以通过对象访问,但是不推荐
public class StaticDemo {
public String name;
public static String str;
public static void main(String[] args) {
System.out.println(name); //编译失败
System.out.println(str); //输出null
}
}
2. 静态方法和实例方法:
静态方法在实例变量之前加载,
实例变量只能通过对象来访问,而静态变量可以通过类访问,所以又叫做类变量。也可以通过对象访问,但是不推荐
public class StaticDemo {
public void method(){}
public static void method1(){}
public static void main(String[] args) {
method(); //编译失败
method1(); //输出null
}
}
3. 静态代码块和代码块的区别:
静态代码块最先执行 *
无论创建多少个对象,静态代码块只会在类的初始化的时候执行,而代码块会随着对象的创建多少而等量执行
4. 静态代码块,代码块和构造器的执行顺序
在类的初始化时,静态代码块开始执行,但是只执行一次
其次是代码块,最后是构造器执行,并且两者的关系都是随着对象创建的多少等量执行。
三. 有关静态的相关问题:
1. 实例方法中是否可以直接访问实例成员 ?
可以,因为实例方法和实例成员都在一个对象中,所以能够访问到。
2. 实例方法中是否可以直接访问静态成员(静态方法,静态变量)?
可以,因为静态成员会随着类的初始化而加载,而实例方法会在对象的创建而初始化。因而,静态成员在实例方法之前
加载,所以实例方法可以访问静态成员。
3. 静态方法中是否可以直接访问静态成员
可以。因为静态成员和成员方法都在静态区。
4. 静态方法中是否可以直接访实例成员
不可以,因为静态成员会随着类的初始化而加载,而实例方法会在对象的创建而初始化。因而,静态方法加载完后,而
实例成员此时还不存在,故而会编译失败。
5. 同一个类中访问这个类的静态成员,可以省略类名调用。