A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tf996268809 中级黑马   /  2014-1-8 23:53  /  1043 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tf996268809 于 2014-1-8 23:54 编辑

求解释

2 个回复

倒序浏览
"重写"只能适用于实例方法.不能用于静态方法.对于静态方法,只能隐藏(形式上被重写了,但是不符合的多态的特性),“重写”是用来实现多态性的,只有实例方法是可以实现多态,而静态方法无法实现多态。例如:


        Employee man = new Manager();

        man.test();



   实例化的这个对象中,声明的man变量是Employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照Manager类来的,就是Employee类型的man变量的指针指向了一个Manager类的对象。如果对这个man调用方法,调用的是谁的?如果是非静态方法,编译时编译器以为是要调用Employee类的,可是实际运行时,解释器就从堆上开工了,实际上是从Manager类的那个对象上走的,所以调用的方法实际上是Manager类的方法。有这种结果关键在于man实际上指向了Manager类对象。现在用man来调用静态方法,实际上此时是Employee类在调用静态方法,Employee类本身肯定不会指向Manager类的对象,那么最终调用的是Employee类的方法。

   由此,只能说形式上静态方法的却可以被重写,实际上达不到重写的效果,从多态的角度可以认为子类实际上是写了一个新方法,从这个角度上说静态方法无法被重写。那么也就证明了重写和覆盖就是一回事。

例如:

[java] view plaincopyprint?
01.public class TestStaticMethodExtends {  
02.      
03.    public static void main(String[] args) {  
04.       A a = new B();  
05.        a.p();  
06.    }  
07.}  
08.  
09.class A {  
10.    public static void p() {  
11.        System.out.println("基类");  
12.    }  
13.}  
14.  
15.class B extends A {  
16.    public static void p() {  
17.        System.out.println("子类");  
18.    }  
19.}  
20.  
21.输出:基类  
public class TestStaticMethodExtends {
   
    public static void main(String[] args) {
       A a = new B();
        a.p();
    }
}

class A {
    public static void p() {
        System.out.println("基类");
    }
}

class B extends A {
    public static void p() {
        System.out.println("子类");
    }
}

输出:基类

评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
ily521125 + 1
刘渝灵 + 30 赞一个!

查看全部评分

回复 使用道具 举报
静态方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,因而不能重写搜索。但非静态方法是在对象实例化时才单独申请内存空间,为每一个实例分配独立的运行内存,因而可以重写

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马