package com.simple.second;class First{
public First(){
aMethod();
}
public void aMethod(){
System.out.println("First");
}
}
public class Second extends First{
public  void aMethod(){
System.out.println("second");
}
public static void main(String args[]){
new Second();
}
}这个程序的运行结果是secondpackage com.simple.second;class First{
public First(){
aMethod();
}
public static void aMethod(){
System.out.println("First");
}
}
public class Second extends First{
public static void aMethod(){
System.out.println("second");
}
public static void main(String args[]){
new Second();
}
}这个程序的运行结果是first
请高手帮忙分析一下,具体是什么情况
或者说一下具体的编译执行过程

解决方案 »

  1.   

    aMethod();等价于this.aMethod(); 
    第一个例子中重写的关系,所以输出second
    实际上这里的this还是Second对象,你可以在aMethod()前面加上System.out.println(this.getClass());
    再加上重写你应该可以明白
    第二个静态方法是不存在重写关系的,没什么可说的,哪个类调用的就是哪个类的方法
      

  2.   

    如一楼所说,static静态方法不override,所以从什么类中去访问,就是哪个类中的方法被绑定。下面这个写法也蛮有意思的,楼主看看class First{
        public First(){
            aMethod();
        }    
        public static void aMethod(){
            System.out.println("First");
        }
    }
    public class Second extends First{
        public Second(){
            aMethod();
        }    
        public static void aMethod(){
            System.out.println("second");
        }
        public static void main(String args[]){
            new Second();
        }
    }
      

  3.   


    1、首先类加载器加载.class文件。
    2、然后完成static初始化,如果有。
    3、为对象分配内存空间
    4、将分配的内存空间清零
    5、初始化类字段(数据成员)。按照定义的顺序依次初始化
    6、调用构造器的方法
    开始--->
    父类的静态代码--->
    子类的静态代码-->
    父类的非静态代码--->
    父类构造函数--->
    子类非静态代码--->
    子类构造函数--->完成
      

  4.   


    //静态方法,至与类名相互联系,跟哪个对象无关,不存在继承这个概念
    class First{
        public First(){
            aMethod();
        }//这是父类的构造方法,调用了父类的静态方法    
        public static void aMethod(){
            System.out.println("First");
        }
    }
    public class Second extends First{
       
        public static void aMethod(){
            System.out.println("second");
        }//这是子类静态方法,没有被任何方法调用
        
      
        public static void main(String args[]){
            new Second();
        }
    }
    class First{
        public First(){
            aMethod();
        }    
        public void aMethod(){
            System.out.println("First");
        }
    }
    public class Second extends First{
        public  void aMethod(){
            System.out.println("second");
        }//并非是静态方法,发生了重写
        
        public static void main(String args[]){
            new Second();
        }
    }
      

  5.   

    //静态方法,至与类名相互联系,跟哪个对象无关,不存在继承这个概念
    class First{
        public First(){
            aMethod();
        }    
        public static void aMethod(){
            System.out.println("First");
        }
    }
    public class Second extends First{
        //在这个地方你使用子类构造方法调用子类的静态方法,也同样会输出信息
         public Second() {
     aMethod();
         }
        public static void aMethod(){
            System.out.println("second");
        }  
        public static void main(String args[]){
            new Second();
        }
    }
      

  6.   

    第一个例程中class Second覆写了class First的方法,所以输出的是second。第二个例程中,static静态方法不override(覆写),输出first
      

  7.   

    static是属于类的,不能被覆盖,只能被隐藏!
      

  8.   

    这个涉及到JAVA方法重写的问题,static应该是不会重写父类方法的吧,没试过,哈哈