class A{
int a = 3;
public A(){
printA();
}
public void printA(){
System.out.println(a);
}
}
class B extends A{
int a = 6;
public B(){
printA();
}
}
public static void main(String[] args)
{
A a = new B();
}
int a = 3;
public A(){
printA();
}
public void printA(){
System.out.println(a);
}
}
class B extends A{
int a = 6;
public B(){
printA();
}
}
public static void main(String[] args)
{
A a = new B();
}
2.这里子类没有重写父类printA()方法
所有调用的全是父类的printA()方法
class A {
int a = 3; public A() {
printA();
} public void printA() {
System.out.println("a:"+a);
}
}class B extends A {
int a = 6; public B() {
printA();
} public void printA() {
System.out.println("b:"+a);
} public static void main(String[] args) {
A a = new B();
}
}
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
结果是 3 3
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
懂了 谢谢 我代码少写了你也看出来了
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
懂了 谢谢 我代码少写了你也看出来了
在初始化B()的时候,先调用A的构造器,在因为B重写了printA()方法,所以在A构造器执行的时候调用了B的printA()方法,而此时B还没有被完全初始化,所以B里面a 变量还是0,第一行就打印出0来。当B构造器执行完毕以后,a被赋值6,所以第二行是6
看懂了点 就是说实例化B的时候 先调用父类构造器 父类构造器调用重写的方法 调用父类构造器时不会初始化已类的属性 只有调用完父类构造器 调用自己的构造器的时候才会初始化属性 对吧
调用父类构造器时 调用的是重写的方法 是不是可以理解为就近调用呢 我还以为调用父类构造器时会初始化父类的属性
调用父类构造器时确实会初始化父类的属性,只是这里调用的不是父类方法
懂了 谢谢 我代码少写了你也看出来了
对头
父类静态变量
父类静态块
子类静态变量
子类静态块
父类非静态变量
父类非静态块
父类构造函数 第一次
子类非静态变量
子类非静态块
子类构造函数 第二次第一次是执行父类构造函数时带到了子类重写的printA(),此时子类的a没有初始化默认为0,所以第一行b:0
第二次是执行子类构造函数,此时已经经过子类非静态变量,所以第二行是b:6
这里的A a=new B()其实根据引用变量可以判断编译时类型为
A类,根据new B()可以知道运行时类型为B类,实例化B的时候,
调用A的构造函数,构造器中掉用的方法其实是运行时类型的方法,也就是
B类的printa()方法,然而B中的属性a此时还没有初始化,就是你第一个打印结果0.
然后调用B的构造函数,这个时候,a已经初始化,所以打印结果就是6了;
结果明明是3,3。这样浪费别人时间很不好,csdn很生气,后果很严重。
A a = new B(); // Multiple ers at this line
- The value of the local variable a is not used
- No enclosing instance of type Task1 is accessible. Must qualify the allocation with an enclosing instance of type Task1 (e.g. x.new A() where x is an instance of
Task1).