先来看个例子,看看执行结果是什么:
class Father{
private int m = 5;
public static int n = 10;
public Father(){
System.out.println("父类构造函数fahter"+m);
}
static {
System.out.println("父类静态代码块。。。。。");
}
{
System.out.println("父类非静态代码块");
}
public static void fStaticMethod(){
System.out.println("父类静态方法。。。");
}
public void fathermeth() {
System.out.println("父类方法");
}
}
public class Child1 extends Father{
int m = 6;
static int n = 11;
public Child1() {
System.out.println("子类构造函数child1"+m);
}
static {
System.out.println("子类静态代码块.....");
}
{
System.out.println("子类非静态代码块");
}
public static void cStaticMethod() {
System.out.println("子类静态方法。。。");
}
public void fathermeth() {
System.out.println("子类重写父类方法"+super.n);
}
public void fathermeth1() {
System.out.println("子类重写父类方法"+super.n);
}
public static void main(String args[]) {
System.out.println("main方法执行。。。");
Child1 cl = new Child1();
cl.fathermeth();
System.out.println("child m="+cl.m+"child n ="+ cl.n);
}
}
下面是执行结果:
父类静态代码块。。。。。
子类静态代码块.....
main方法执行。。。
父类非静态代码块
父类构造函数fahter5
子类非静态代码块
子类构造函数child16
子类重写父类方法10
child m=6child n =11
上面代码有几个关键点:
1、父类与子类静态代码块在main方法前执行:java的机制是先编译为字节码文件.class文件,从.class 到JVM加载的时候,就执行static代码块和static变量,所以先执行静态代码块,并且执行顺序是先执行父类的在执行子类的。静态代码块是属于类的,只会执行一次,不会由于实例化对象而执行。
2、子类可以覆盖父类中定义的变量;
3、private,public,propected,default 修饰符的区别;
1、一个类初始化顺序为: 静态成员及Static代码块-》 普通成员初始化 -》执行构造函数