Java提高篇之隱藏靜態(tài)方法

Hiding-Static-Methods

最近,我和一位同事在同一個簽名的父類和子類中就靜態(tài)方法進行了一次快速聊天。對話的來源是術(shù)語“隱藏”與“覆蓋”,以及為什么“隱藏靜態(tài)方法”是正確的并且可行,但“覆蓋靜態(tài)方法”是不正確的并且不起作用。

TL; DR“不能覆蓋靜態(tài)方法”,因為JVM在聲明的引用類上執(zhí)行靜態(tài)方法,而不是定義的運行時/實例類。

一個簡單的例子展示了幾種不同的靜態(tài)方法執(zhí)行上下文,說明了結(jié)果:

package com.intertech.hidestaticmethod;

public class Parent {
    public static void doSomething() {
        System.out.println("PARENT");
    }
}
public class Child extends Parent {
    public static void doSomething() {
        System.out.println("CHILD");
    }

    public static void main(final String[] args) {
        final Parent parentAsParent = new Parent();
        // calls parent's
        parentAsParent.doSomething();

        final Parent childAsParent = new Child();
        // calls parent's
        childAsParent.doSomething();

        final Child childAsChild = new Child();
        // calls child's
        childAsChild.doSomething();

        // same class static context (most local)
        doSomething();
    }
}

主要方法注釋說明執(zhí)行結(jié)果。結(jié)果表明,被調(diào)用的靜態(tài)方法是定義參考的方法。

將Child 作為Java應(yīng)用程序(主要方法)輸出:
PARENT
PARENT
CHILD
CHILD

這與使用更正確的靜態(tài)引用調(diào)用替換實例方法調(diào)用沒有區(qū)別:

public class Child extends Parent {
    public static void doSomething() {
        System.out.println("CHILD");
    }
 
    public static void main(final String[] args) {
        // calls parent's
        Parent.doSomething();
 
        // calls parent's
        Parent.doSomething();
 
        // calls child's
        Child.doSomething();
 
        // same class static context (most local)
        Child.doSomething();
    }
}

希望這篇文章幫助解釋隱藏靜態(tài)方法 - 為什么我們不能重寫靜態(tài)方法,但我們可以隱藏靜態(tài)方法。

本文翻譯于 Hiding Static Methods

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計...
    子非魚_t_閱讀 4,538評論 1 44
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,613評論 18 399
  • 一:java概述: 1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)...
    慕容小偉閱讀 1,935評論 0 10
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,799評論 0 11
  • 2017年的最后一天就在匆忙中過去了,難得的晚上的空余時間可以寫寫東西,寫下2017年的遺憾和不足,展望一下201...
    培培豬閱讀 327評論 0 0

友情鏈接更多精彩內(nèi)容