静态语句块:
在一个类中,不属于任何方法体并且以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方法中不能使用这两个关键字