java的静态代码块和类变量的隐式覆盖
静态代码块特点:随着类的加载执行一次,且仅会执行一次
作用:初始化类中的static修饰的变量(static修饰的变量称为类变量。类变量和静态代码块差不多,类变量仅会被初始化一次)
一、静态代码块写法:
static{ }
非静态代码块写法:
{
}
执行顺序:静态代码块->代码块->构造函数
二、那么我们来看一下,如果子类son继承父类people,那么这些代码块执行顺序
public class smile { public static class people{ static { System.out.println("父类静态代码块"); } { System.out.println("父类代码块"); } public people() { System.out.println("父类构造函数"); } } public static class son extends people{ static { System.out.println("子类静态代码块"); } { System.out.println("子类代码块"); } public son() { System.out.println("子类构造函数"); } } public static void main(String[] args) { son a = new son(); } }
结果:
父类静态代码块
子类静态代码块
父类代码块
父类构造函数
子类代码块
子类构造函数
三、如果你不相信静态代码块只会执行一次你可以实例化两个son类
public class smile { public static class people{ static { System.out.println("父类静态代码块"); } { System.out.println("父类代码块"); } public people() { System.out.println("父类构造函数"); } } public static class son extends people{ static { System.out.println("子类静态代码块"); } { System.out.println("子类代码块"); } public son() { System.out.println("子类构造函数"); } } public static void main(String[] args) { son a = new son(); son b = new son(); } } /* * 父类静态代码块 子类静态代码块 父类代码块 父类构造函数 子类代码块 子类构造函数 父类代码块 父类构造函数 子类代码块 子类构造函数 * */
四、类中变量的隐式覆盖:
public class smile { public static class people{ double money; public people(){ money=10.5; } public double get_money() { return money; } } public static class human extends people{ int money; public human(){ money=5; } } public static void main(String[] args) { human a = new human(); System.out.println("现在余额为:"+a.money); System.out.println("现在余额为:"+a.get_money()); } }
你会发现直接通过实例对象a.money访问不到父类的money