[转载] Java中的静态方法不能被子类重写

参考链接: 可以在Java中重载或重写静态方法吗

Java中的静态方法不能被子类重写

 

特点:静态方法属于类的方法,也属于对象的方法,但是静态方法随类的存在。

结论:Java中的静态方法不能被子类重写,实际上,子类的静态方法隐藏了父类的静态方法,因此父类的子类的静态方法同时存在,只不过父类通过类名(或对象名)调用的是父类的静态方法,子类通过类名(或对象名)调用的是子类的静态方法。

 

(1)代码如下:

public class Test {

    public static void main(String[] args) {

        Father f1 = new Son();

        f1.methon();            // static(静态)方法的调用,不支持多态,所以此处调用的父类的静态方法

        f1.doWork();            // 非static(静态)方法的调用,支持多态

        

        System.out.println("---------------");

        

        Son s1 =new Son();

        s1.methon();

        s1.doWork();

    }

 

}

class Father {

    public static void methon(){

        System.out.println("Father static methon()");

    }

    

    public void doWork(){

        System.out.println("Father doWork()");

    }

}

 

class Son extends Father {

    public static void methon(){

        System.out.println("Son static methon()");

    }

    public void doWork(){

        System.out.println("Son doWork()");

    }

}

打印结果:

Father static methon()

Son doWork()

---------------

Son static methon()

Son doWork()

 

 

结论:

(1)静态方法不支持多态。(final,private 方法也如此)

(2)静态方法可通过类名直接调用,也可通过类的实例化对象调用,因此Father 的实例化对象f1调用的是父类(不是子类)的静态方法。

(3)静态方法的绑定时期为代码的编译器期,也叫前期绑定。非静态的方法属于程序的执行期绑定,也就运行期绑定。

 

 

对于结论(3)举个极端的例子

public class Test {

    public static void main(String[] args) {

        Father f1 = new Son();

        f1.methon();            // static(静态)方法的调用,不支持多态,所以此处调用的父类的静态方法

        f1.doWork();            // 非static(静态)方法的调用,支持多态

        

        System.out.println("---------------");

        

        Son s1 =new Son();

        s1.methon();

        s1.doWork();

        

        System.out.println("---------------");

        

        Father f2= null;   // 创建一个父类变量的空引用

        f2.methon();       // 调用父类的静态方法,此处竟然不出错,表明了静态方法的特殊性

    }

 

}

class Father {

    public static void methon(){

        System.out.println("Father static methon()");

    }

    

    public void doWork(){

        System.out.println("Father doWork()");

    }

}

 

class Son extends Father {

    public static void methon(){

        System.out.println("Son static methon()");

    }

    public void doWork(){

        System.out.println("Son doWork()");

    }

}打印结果:

 

Father static methon()

Son doWork()

---------------

Son static methon()

Son doWork()

---------------

Father static methon()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值