1.Static用来修饰 一个方法又或者一个成员变量,那么静态方法和普通方法,静态变量和成员变量之间又有什么区别呢?
静态方法和普通方法调用方式的不同
如果是两个静态方法,可以直接调用
如果是两个普通方法,可以直接调用
普通方法可以调用静态方法
静态方法却只能访问静态成员
普通方法 可以 对象.方法
静态方法 则是 类.方法
为什么被staic修饰的方法只能访问静态成员?
因为静态方法在类加载的时候就随着一起加载了,此时其他成员和方法并没有初始化,换个理解 static 属于类,而普通成员和方法属于对象,对象不一定相同,因此static方法里不能用 super和this
静态变量和成员变量的区别
生命周期
静态变量随类的加载而加载,随类的销毁而销毁
成员变量随对象的加载而加载,随对象的销毁而销毁
调用方式不同
一个是类调用,一个是对象调用
存储的位置不同
静态变量存储在静态区,而成员变量保存在堆里
2.Static还可以修饰代码块
static{
代码..
}
静态代码块随类的加载而加载,而且类存在期间只加载一次
3.Static用来修饰内部类
Static 修饰的内部了不需要先实例一个外部类,可以直接使用外部类.内部类
4.Static可以用来静态导包
import static XXX.XXX.XXX.静态方法名 表示导入某个静态方法
或者import static import static XXX.XXX.XXX.* 表示导入当前类的静态方法
好处就是可以直接使用方法名,而不需要类.方法
----------------------------------------补充----------------------------------------------------------
关于static修饰符修饰的 方法 内部类 成员变量 代码块的加载顺序
一定是按顺序加载,先加载父类,在加载子类
public abstract class Animal { static{ System.out.println("父类的静态代码块"); } }
public class Test extends Animal{ private static int s = run(); static{ System.out.println("子类的静态代码块"); } static class A{ static { System.out.println("子类的静态内部类的静态代码块"); } } void sleep(){ System.out.println("子类重写父类的方法"); } static void eat(){ System.out.println("静态的吃"); } static int run(){ System.out.println("静态的跑"); eat(); return 0; } public static void main(String[] args){ new A(); } }
执行结果
按顺序加载,先加载父类,在加载子类