日期:2014-05-20  浏览次数:20803 次

static和非static
Java code

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();
    }
}


这个程序的运行结果是second
Java code

package 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
请高手帮忙分析一下,具体是什么情况
或者说一下具体的编译执行过程

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

下面这个写法也蛮有意思的,楼主看看
Java code

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();
    }
}

------解决方案--------------------
mark
------解决方案--------------------
Java code

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


开始--->
父类的静态代码--->
子类的静态代码-->
父类的非静态代码--->
父类构造函数--->
子类非静态代码--->
子类构造函数--->完成

------解决方案--------------------
Java code

//静态方法,至与类名相互联系,跟哪个对象无关,不存在继承这个概念
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();
    }
}

------解决方案--------------------
Java code


//静态方法,至与类名相互联系,跟哪个对象无关,不存在继承这个概念
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();
    }
}