在类A中为什么执行showX() 方法是执行类B中的ShowX() 方法,在new 一个B对象之前,不是应该先执行父类 A的构造方法吗? 在这个时候类B的实例还没有被创建,如何执行B实例中的方法了? 求高手指点
public class test
{
public static void main(String[] args)
{
B b = new B(0);
}
}class B extends A
{
B(int x)
{
x = x + 2; // 只对局部x操作
showX();
}
public void showX()
{
System.out.println("B.x=" + x);
}
}class A
{
public static int x = 2; A()
{
x = x + 1;
showX();
}
public void showX()
{
System.out.println("A.x=" + x);
}
}
public class test
{
public static void main(String[] args)
{
B b = new B(0);
}
}class B extends A
{
B(int x)
{
x = x + 2; // 只对局部x操作
showX();
}
public void showX()
{
System.out.println("B.x=" + x);
}
}class A
{
public static int x = 2; A()
{
x = x + 1;
showX();
}
public void showX()
{
System.out.println("A.x=" + x);
}
}
啥玩意啊 new 一个B对象的时候肯定会执行B的构造方法啊, 我是说在执行A构造方法的时候,里面有一个方法 ShowX() , 为什么B的 而不是A的
如果这样写 A a = new B();
a.ShowX();我知道这个是多态的,但是在A构造函数里面执行的时候,B对象不是还没有创建吗?
(2) 构造函数的执行总是 “ 向上 ” 的:而且总是先执行完父类的构造函数;
(3) 显式初始化语句总是先于构造函数语句,但后于 super() 或 this() 。看了第一点,楼主明白了吗?
这还对?我不知道你两个星是哪来的。你看下下面代码public class MyJava
{
public static void main(String[] args)
{
B b = new B(0);
}
}class B extends A
{
B(int x)
{
System.out.println("B");
}
}class A
{
A()
{
System.out.println("A");
}
}
B(int x)
{
x = x + 2; // 只对局部x操作
showX();
}
其实等价于:
B(int x)
{
super();
x = x + 2; // 只对局部x操作
showX();
}
楼主的理解也没错,B初始化的时候,先去调用父类的构造函数。。也就是AA() {
x = x + 1;
showX();
}
实际上是:A() {
x = x + 1;
this.showX();
}
但是此时的this 显然是B的实例由于B已经重写了showX()方法,所以调用的是他本身的showX();
当B实例被创建的时候,B实例本身可能还没有被完全创建,但是不影响代码区的代码指令加载,因为B实例最终存在堆区,这种情况,只会影响B实例的数据区,即B的属性的赋值(初始化等)