public class CalC 
{

void amethod()
{
System.out.println("CalC.amethod");
}

CalC()
{
amethod();
System.out.println("Hu?");
} /**
 * @param args
 */
public static void main(String[] args) 
{
// TODO Auto-generated method stub
CalC cc = new CalChild();
cc.amethod(); }}class CalChild extends CalC
{
void amethod()
{
System.out.println("CalChild.amethod");
}
}output:
CalChild.amethod
Hu?
CalChild.amethod为什么CalC Constructor调用的不是自己的amethod()呢

解决方案 »

  1.   

    CalC()
    {
    amethod();
    System.out.println("Hu?");
    }
    这是一个父类的构造方法,
    当new 子类时,首先要对父类初始化!
    所以调用顺序为
    CalC()
    {
    amethod();
    System.out.println("Hu?");
    }
    void amethod()
    {
    System.out.println("CalChild.amethod");
    }
      

  2.   

    java中子类的构造把父类的构造覆盖啦。
      

  3.   

    我想问的是什么在父类构造器中调用自己的方法,会出现override呢,也就是说第一个输出为什么是CalChild.amethod,而不是CalC.amethod
      

  4.   

    第一个当然不是CalChild.amethod,你用子类void amethod()覆盖了父类的void amethod(),执行CalC cc = new CalChild();时导致构造函数在调用了子类的void amethod(),如果你把子类的void amethod()屏掉,就会是CalC.amethod拉“我想问的是什么在父类构造器中调用自己的方法”构造函数
      

  5.   

    程序运行时首先执行的该类的构造函数因为void amethod()override了所以就成了子类中的
    void amethod()方法了
      

  6.   

    声明  private 就好了,就不会覆盖了
      

  7.   

    我们先来看语句  CalC cc = new CalChild(); 这句话可以分解成
    CalC cc;
    cc=new CalChild();这样看意思就明显了:先声明CalC 的引用cc,再将引用cc指向CalC的子类CalChild的实例上。于是当我们使用语句cc.amethod();时就会自然而然的调用子类的amethod()方法。
    当然还要明确子类在构造时会先初始化父类的。
      

  8.   

    楼上的没有好好看问什么问题呢觉得 cwl_feng()  同学回答的最好 呵呵 一起学习ing
      

  9.   

    但依然没有说到点上;方法在内存中只有一个备份,所以的对象都共享这个备份,为了区分开到底是哪个对象在调用这个方法,关键的地方就是this的使用。this把调用方法的上下文对应到当前对象上。第二,调用java中的所有成员变量或者成员函数都隐含了this。所以这个地方就很明了了:构造子类,this指针代表的当前对象是子类实例,子类实例为啥不调用自己overriding的方法呢?!真是的了
      

  10.   

    CalC cc = new CalChild();这一步也叫“异类搜集”,以父类类型声明变量作为子类对象的引用,此时子类的所有属性方法都失效,只有子类中重写父类的这样一中方法可以被变量调用,而不调用父类的同名方法,从而实现多态!
    此程序前后两次打印都是一个原理。。