class Cat extends Super{
int j=30;
Cat(){
print();
j=40;
}
void print(){
System.out.println(j);
}
public static void main(String[] args) {
System.out.println(new Cat().j);
}
}
class Super{
int i=10;
Super(){
print();
i=20;
}
void print(){
System.out.println(i);
}
}执行过程 麻烦帮我分析一下 为啥是
0
30
40
int j=30;
Cat(){
print();
j=40;
}
void print(){
System.out.println(j);
}
public static void main(String[] args) {
System.out.println(new Cat().j);
}
}
class Super{
int i=10;
Super(){
print();
i=20;
}
void print(){
System.out.println(i);
}
}执行过程 麻烦帮我分析一下 为啥是
0
30
40
int j=30;
Cat(){//子类重写构造器
print();//调用子类的print方法
j=40;//赋值,j为40
}
void print(){//输出j
System.out.println(j);
}
public static void main(String[] args) {//首先被执行
System.out.println(new Cat().j);//先调用父类的构造器来初始化,此时,父类中的变量i没被初始化//值为0,首先被父类的print函数输出,然后就是子类的构造器,此时,j已经初始化为30,打印出后,变为//40,再次被System.out.println输出;
}
}
class Super{
int i=10;//没被初始化i=0
Super(){
print();
i=20;
}
void print(){
System.out.println(i);
}
}
1、调用Cat 构造
2、调用父类Super 构造
3、调用print方法,因为子类重写了这个方法,所以这时候是调的子类Cat的print方法。而子类Cat还未初始化(注意是先从父类开始初始化,这时候还未到子类),所以j是0
4、给属性i赋值
5、回到子类Cat,初始化j=30
6、调print方法,打印的是30
7、给j赋值为40
8、cat.j = 40
调用父类构造方法是,调用的是print是子类重写过的方法,打印的是j的值,并不是i的值
问下,默认调用的无参数构造方法,我想问的是父类中没有j这个变量,为什么父类能对j初始化,j=0?
收益了!
在java中,在使用new创建一个类的实例时,开始分配空间并将成员变量初始化为默认的值。(注意并不是将变量初始化为定义的值,而是给整形赋值0) 这点与c++不同
int j=30;
FileTest(){
//第六,父类的构造方法运行结束,开始运行子类的构造方法,此时J为30,调用print()方法打印j=30
print();
//第七,设置j为40,此时J=40,main方法中打印new FileTest().j为40,程序结束
j=40;
}
void print(){
//第四,因为子类重写了父类的方法,所以先进这里,而j这个变量在父类中还是空值,因为J是int所以为0
System.out.println("子类:"+j);
}
public static void main(String[] args) {
//第一,创建子类实例,进入父类构造方法
System.out.println(new FileTest().j);
}
}
class Super{
int i=10;
Super(){
//第二,进入父类构造方法
//第三,进入print()方法,如果子类重写了改方法那么就要进入子类的重写方法中,父类中该方法不会执行
print();
//第五,设置i的值
i=20;
}
void print(){
System.out.println("父类:"+i);
}
}