静态语句块:
在一个类中,不属于任何方法体并且以static关键字修饰的语句块,称为静态语句块。
因为静态语句块常用来进行类变量的初始化,所以也称为静态初始化程序块。
格式:static{ };
***静态语句块在加载该类时执行一次(此处的类加载是在该类被调用时才进行加载,比如:当要验证的语句和main()方法在一个类中时,此时调用main()方法时,要先对该类进行加载才能调用main()方法,但是若main()方法和要验证的语句不在一个类中时,则先进行main()方法的类的加载和main()方法的调用,然后当后面要调用放了要验证的语句的类时(即new该类对象时),验证类才会被加载)如果一个类中定义了多个静态语句块,则这些语句块将按在类中出现的先后次序运行。
初始化的顺序:
静态方法-->静态语句块-->普通方法,普通语句块,构造函数的。
// 基类 class Base { private int a = method1(); private static int b = method2(); { System.out.println("Base instance init block!"); } static { System.out.println("Base static init block!"); } public Base(){ System.out.println("Base constructor!"); } private int method1() { System.out.println("Base method1"); return 0; } private static int method2() { System.out.println("Base method2"); return 0; } } class Derive extends Base{ private int c = method3(); private static int d = method4(); { System.out.println("Derive instance init block!"); } static { System.out.println("Derive static init block!"); } public Derive(){ System.out.println("Derive constructor!"); } private int method3() { System.out.println("Derive method3"); return 0; } private static int method4() { System.out.println("Derive method4"); return 0; } } /** * */ public class DeriveTest { public static void main(String[] args) { Derive d = new Derive(); } }
运行结果:
实例成员的访问,一定要 对象. 来调用
类成员的方法,要用 类名. 来调用
this与super:
this关键字的两个用法:
1.在构造函数中调用待传入int参数的其它的构造函数,如this(10),初始化带int型参数的构造函数参数,this(" ")
2.在成员方法里面访问其它成员(变量,方法),前面可以添加this.变量/方法。
super关键字的三个用法:
1.在派生类的构造函数中调用基类的带int参数的构造函数 如super( )。
2.super.func() 在派生类中,调用从基类继承来的func方法
3.super.a 在派生类中,调用从基类继承来的名字叫a的成员变量
super关键字
在对象的内部使用,可以代表父类对象
1,访问父类的属性 super.age
2,访问父类的方法 super.eat()
3,子类的构造过程中必须调用其父类的构造方法 super();
( 如果子类的构造方法中没有显式调用父类的构造方法,则系统默认调用父类无参的构造方法
如果显式的调用构造方法,必须在子类构造方法的第1行
如果子类构造方法中既没有显示调用父类的构造方法,而父类有没有无参的构造方法,则编译出错。)
this和super关键字都和对象有关,所以在static方法中不能使用这两个关键字