package cat1;
class fu{
public int num=10;
public fu() {
System.out.println("fu");
}
}
class zi extends fu{
public int num=20;
public zi() {
System.out.println("zi");
}
public void show() {
int num=30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
public class test{
public static void main(String [] args) {
zi z=new zi();
z.show();
}
}
父类,子类 子类方法三者中有同名变量num时,调用子类方法输出,num输出30,为子类方法中的值,this.num表示子类中的值,super.num表示父类中的值。
2
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
public class test
{public static void main(String []args)
{Zi z = new Zi();
}
}
父类和子类都有静态代码块,构造代码块,构造方法,初始化子类对象。此时:
1.jvm调用了main方法,main进栈;
2.遇到Zi z=new zi(); 会将fu.class和zi.class 分别加进内存,再创建对象;
3.父类的静态代码块会随着fu.class一起加载,当zi.class进内存,子类当静态
代码块也会随着一起进去;
所以先输出静态代码块fu再输出静态代码块zi
4.走子类构造方法,先初始化父类,而父类有构造代码块
综上,顺序为 1父类静态代码块2子类静态代码块3父类构造代码块4父类构造方法
5子类构造代码块6子类构造方法