<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### [陷阱:屬性與靜態方法](https://lingcoder.gitee.io/onjava8/#/book/09-Polymorphism?id=%e9%99%b7%e9%98%b1%ef%bc%9a%e5%b1%9e%e6%80%a7%e4%b8%8e%e9%9d%99%e6%80%81%e6%96%b9%e6%b3%95) 一旦學會了多態,就可以以多態的思維方式考慮每件事。然而,只有普通的方法調用可以是多態的。例如,如果你直接訪問一個屬性,該訪問會在編譯時解析: ~~~ // polymorphism/FieldAccess.java // Direct field access is determined at compile time class Super { public int field = 0; public int getField() { return field; } } class Sub extends Super { public int field = 1; @Override public int getField() { return field; } public int getSuperField() { return super.field; } } public class FieldAccess { public static void main(String[] args) { Super sup = new Sub(); // Upcast System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField()); Sub sub = new Sub(); System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = " + sub.getSuperField()) } } ~~~ 輸出: ~~~ sup.field = 0, sup.getField() = 1 sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0 ~~~ 當**Sub**對象向上轉型為**Super**引用時,任何屬性訪問都被編譯器解析,因此不是多態的。在這個例子中,**Super.field**和**Sub.field**被分配了不同的存儲空間,因此,**Sub**實際上包含了兩個稱為**field**的屬性:它自己的和來自**Super**的。然而,在引用**Sub**的**field**時,默認的**field**屬性并不是**Super**版本的**field**屬性。為了獲取**Super**的**field**屬性,需要顯式地指明**super.field**。 盡管這看起來是個令人困惑的問題,實際上基本不會發生。首先,通常會將所有的屬性都指明為**private**,因此不能直接訪問它們,只能通過方法來訪問。此外,你可能也不會給基類屬性和派生類屬性起相同的名字,這樣做會令人困惑。 如果一個方法是靜態(**static**)的,它的行為就不具有多態性: ~~~ // polymorphism/StaticPolymorphism.java // static methods are not polymorphic class StaticSuper { public static String staticGet() { return "Base staticGet()"; } public String dynamicGet() { return "Base dynamicGet()"; } } class StaticSub extends StaticSuper { public static String staticGet() { return "Derived staticGet()"; } @Override public String dynamicGet() { return "Derived dynamicGet()"; } } public class StaticPolymorphism { public static void main(String[] args) { StaticSuper sup = new StaticSub(); // Upcast System.out.println(StaticSuper.staticGet()); System.out.println(sup.dynamicGet()); } } ~~~ 輸出: ~~~ Base staticGet() Derived dynamicGet() ~~~ 靜態的方法只與類關聯,與單個的對象無關。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看