静态方法或者静态变量 可以通过 类名.静态方法名 或者 类名.静态变量名 进行直接访问。
静态变量
static变量又叫类变量 是同一个类中所有的对象所共享的,在加载时就生成了
定义语法:
访问修饰符 static 数据类型 变量名;
static 访问修饰符 数据类型 变量名;
如何访问静态变量:
类名.类变量名;或者 对象名.类变量名
注意:
通过 类名.类变量名 访问类变量(静态变量)时:
1. 类变量 用 final 修饰了, 类的 静态块 不会随着第一次调用一起加载
2. 类变量 没有用 final 修饰了, 类的 静态块 会随着第一次调用一起加载
3. 在调用 静态方法时,无论有没有用 final 修饰,静态块都会一起加载
具体看如下代码:
class Grandpa{ public static String name = "aaa"; { System.out.println("爷爷的代码块"); } static { System.out.println("爷爷的静态代码块"); } public Grandpa(){ System.out.println("爷爷的构造函数"); } } class Father extends Grandpa{ public static String name; { System.out.println("爸爸的代码块"); } static { System.out.println("爸爸的静态代码块"); } public Father(){ System.out.println("爸爸的构造函数"); } } class Son extends Father{ public static String name = "小刚"; { System.out.println("儿子的代码块"); } static { System.out.println("儿子的静态代码块"); } public Son(){ System.out.println("儿子的构造函数"); } }
main方法调用:
public class Demo_001 { public static void main(String[] args) { System.out.println(Son.name); } }
输出结果为:
爷爷的静态代码块
爸爸的静态代码块
儿子的静态代码块
小刚
如果时如下情况:
class Grandpa{ public static String name = "aaa"; { System.out.println("爷爷的代码块"); } static { System.out.println("爷爷的静态代码块"); } public Grandpa(){ System.out.println("爷爷的构造函数"); } } class Father extends Grandpa{ public static String name; { System.out.println("爸爸的代码块"); } static { System.out.println("爸爸的静态代码块"); } public Father(){ System.out.println("爸爸的构造函数"); } } class Son extends Father{ public final static String name = "小刚"; { System.out.println("儿子的代码块"); } static { System.out.println("儿子的静态代码块"); } public Son(){ System.out.println("儿子的构造函数"); } }
则调用结果为:
小刚
静态方法:
静态方法又叫类方法,类方法 和 普通方法 都是随着类的加在而加载的,将结构信息存储在方法区中。
类方法和普通方法的区别:
类方法中,没有this的参数;普通方法中隐含着this的参数
类方法可以通过类名直接调用,普通方法只能通过对象名调用
类方法中不允许使用和对象有关的关键字:this、super;普通方法可以
类方法中,只能访问静态变量 或 静态方法,普通方法中,静态非静态都可以访问
静态代码块
被 static 修饰的 代码块 叫做 静态代码块。当类第一次被加载时,被加载,可以作为 构造方法 的补充。
静态代码块、构造方法、代码块三者的加载顺序:
父类静态代码块
子类静态代码块
父类代码块
父类构造方法
子类代码块
子类构造方法