成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java筆記 - 重寫/重載,向上轉(zhuǎn)型/向下轉(zhuǎn)型

qqlcbb / 1137人閱讀

摘要:所以靜態(tài)方法不能被覆蓋。雖然就算你重寫靜態(tài)方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態(tài)方法,不會阻止你這么做,但你卻得不到預(yù)期的結(jié)果重寫僅對非靜態(tài)方法有用。我們應(yīng)該直接使用類名來訪問靜態(tài)方法,而不要使用對象引用來訪問。

重寫/重載

重寫指的是根據(jù)運(yùn)行時對象的類型來決定調(diào)用哪個方法,而不是根據(jù)編譯時的類型。所以靜態(tài)方法不能被覆蓋。

(如果從重寫方法會有什么特點(diǎn)來看,我們是不能重寫靜態(tài)方法的。雖然就算你重寫靜態(tài)方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態(tài)方法,Java 不會阻止你這么做,但你卻得不到預(yù)期的結(jié)果(重寫僅對非靜態(tài)方法有用)。重寫指的是根據(jù)運(yùn)行時對象的類型來決定調(diào)用哪個方法,而不是根據(jù)編譯時的類型。讓我們猜一猜為什么靜態(tài)方法是比較特殊的?因?yàn)樗鼈兪穷惖姆椒ǎ运鼈冊诰幾g階段就使用編譯出來的類型進(jìn)行綁定了。使用對象引用來訪問靜態(tài)方法只是 Java 設(shè)計者給程序員的自由。我們應(yīng)該直接使用類名來訪問靜態(tài)方法,而不要使用對象引用來訪問。)

向上轉(zhuǎn)型/向下轉(zhuǎn)型

assume 兩個類 Base 類 和 Agg 類,Agg 繼承與 Base .
and 一個原則:父類引用指向子類對象,子類引用不能指向父類對象(不安全)。

1 向上轉(zhuǎn)型
javaBase f1 = new Agg (); 父類引用指向子類對象

左邊叫 生成一個父類引用Father f1
右邊叫 生成一個子類對象new Son() f1 引用指向了內(nèi)存堆中Son對象。
把子類對象直接賦給父類的引用叫向上轉(zhuǎn)型,向上轉(zhuǎn)型不用強(qiáng)制轉(zhuǎn)換。向上轉(zhuǎn)型就是父類引用指向子類對象,這里誰指向誰記著不方便,一個簡單的記憶方法是 A a = new B(); 可以想象一個箭頭 A a => new B(); namely, A 指向 B.

javaclass Base{
    public String getField(){
        String name = "Base";
            return name;
    }
}
class Agg extends Base{
    public String getField(){
        String name = "Agg";
            return name;
    }
}
javapublic class test {
    public static void main(String[] args) {
        Base a = new Agg();
        System.out.println(""+a.getField());
    }
}

output: Agg
動態(tài)綁定,覆蓋了父類的函數(shù)
當(dāng)我們調(diào)用a的方法的時候,我們會首先看看a對應(yīng)的類有沒有這個方法, 如果有并且被子類覆蓋,這邊就會調(diào)用子類的方法。

javaclass Base{}
class Agg extends Base{
    public String getField(){
        String name = "Agg";
        return name;
    }
}
public class test {
    public static void main(String[] args) {
        Base a = new Agg();
        System.out.println(""+ ((Agg)a).getField());
    }
}

output: Agg.
如果沒有,編譯器就認(rèn)為Base沒有這個函數(shù),直接調(diào)用就會報錯 (從這里也能看出向上轉(zhuǎn)型會丟掉子類的一些信息)。
這時候吧a轉(zhuǎn)換成Agg類型的對象,編譯器就認(rèn)為a是一個Agg 類型??梢哉{(diào)用Agg類的函數(shù)。

javaclass Base{
    public String getField(){
        String name = "Base";
        return name;
    }
}
class Agg extends Base{
    public String getField(){
        String name = "Agg";
            return name;
    }
}
public class test {
    public static void main(String[] args) {
        Agg b = new Agg();
        Base a =  (Base)b; 向上轉(zhuǎn)型的另一個寫法
        System.out.println(""+a.getField());
    }
}

output: Agg
這道題是向上轉(zhuǎn)型的另一個寫法.

java
class Base{ public static String getField(){ String name = "Base"; return name; } } class Agg extends Base{ public static String getField(){ String name = "Agg"; return name; } } public class test { public static void main(String[] args) { Agg a = new Agg(); Base b = new Agg(); System.out.println(""+a.getField()); System.out.println(""+b.getField()); } }

output : Agg Base
靜態(tài)函數(shù)不能覆蓋

2 向下轉(zhuǎn)型
javaSon s1 = (Son)f1;

把指向子類對象的父類引用,賦給子類引用叫向下轉(zhuǎn)型,要強(qiáng)制轉(zhuǎn)換。

javaFather f2 = new Father();
Son s1 = (Son)f2; //編譯出錯,子類引用不能指向父類對象

javaclass Base{
    public String getField(){
        String name = "Base";
            return name;
    }
}
class Agg extends Base{
    public String getField(){
        String name = "Agg";
            return name;
    }
}
public class test {
    public static void main(String[] args) {
        Base a = new Base();
        Agg b = (Agg)a;  不會編譯通過,這樣向下轉(zhuǎn)型不可以,不安全。
        System.out.println(""+b.getField());
    }
}

向下轉(zhuǎn)型:當(dāng)比較對象的時候,向下轉(zhuǎn)型是很有用的。
那應(yīng)該如何安全的向下轉(zhuǎn)型?
先向上 - 再向下

javaBase b = new Agg(); 先向上
Agg a= (Agg)b; 再向下

再貼一個向下轉(zhuǎn)型實(shí)際應(yīng)用場景的代碼,比較對象:

javapublic class Person
{
  private String name;
  private int age;

  public boolean equals(Object anObject)
  {
     if (anObject == null)
         return false;

     /* The object being passed in is checked
         to see it"s class type which is then compared
         to the class type of the current class.  If they
         are not equal then it returns false
     */

     else if (getClass( ) != anObject.getClass())
         return false;

     else
     {
        /* 
         this is a downcast since the Object class
         is always at the very top of the inheritance tree
         and all classes derive either directly or indirectly 
         from Object:
        */
        Person aPerson = (Person) anObject;
        return ( name.equals(aPerson.name) 
                && (age == aPerson.age));
     }
  }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/64269.html

相關(guān)文章

  • 1、接口 2、多態(tài)

    摘要:接口的概念接口的概念接口是功能的集合,同樣可看做是一種數(shù)據(jù)類型,是比抽象類更為抽象的類。多態(tài)的前提是必須有子父類關(guān)系或者類實(shí)現(xiàn)接口關(guān)系,否則無法完成多態(tài)。 01接口的概念 * A:接口的概念 接口是功能的集合,同樣可看做是一種數(shù)據(jù)類型,是比抽象類更為抽象的類。 接口只描述所應(yīng)該具備的方法,并沒有具體實(shí)現(xiàn),具體的實(shí)現(xiàn)由接口的實(shí)現(xiàn)類(相當(dāng)于接口的子類)來完成。這樣將功能的定...

    Magicer 評論0 收藏0
  • 9. java 多態(tài)

    摘要:概念所謂多態(tài),就是指一個引用變量類型在不同的情況下的多種狀態(tài)。需進(jìn)行強(qiáng)制轉(zhuǎn)換有風(fēng)險,最好使用進(jìn)行判斷。繼承在多態(tài)中必須存在有繼承關(guān)系的子類和父類。在中有兩種形式可以實(shí)現(xiàn)多態(tài)繼承和接口。 概念 所謂多態(tài),就是指一個引用變量(類型)在不同的情況下的多種狀態(tài)。也可以理解為,多態(tài)是指通過指向父類的指針,來調(diào)用在不同子類中實(shí)現(xiàn)的方法。多態(tài)性是對象多種表現(xiàn)形式的體現(xiàn) 多態(tài)性嚴(yán)格來說有兩種描述形式:...

    wanglu1209 評論0 收藏0
  • 面向?qū)ο蠼涌诙鄳B(tài)

    摘要:多態(tài)的前提是必須有子父類關(guān)系或者類實(shí)現(xiàn)接口關(guān)系,否則無法完成多態(tài)。具體格式如下父類引用指向子類對象就是多態(tài)的定義格式。多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種向上轉(zhuǎn)型當(dāng)有子類對象賦值給一個父類引用時,便是向上轉(zhuǎn)型,多態(tài)本身就是向上轉(zhuǎn)型的過程。 第3天 面向?qū)ο?今日內(nèi)容介紹? 接口? 多態(tài)? 筆記本案例今日學(xué)習(xí)目標(biāo)? 寫出定義接口的格式? 寫出實(shí)現(xiàn)接口的格式?...

    wangdai 評論0 收藏0
  • 向上轉(zhuǎn)型讀書筆記

    摘要:把這種對某個對象的引用視為對其基類的引用的做法被稱作向上轉(zhuǎn)型?;蛘呃^承或者重寫了的問題從子類向上轉(zhuǎn)型到父類,可能會縮小接口。因?yàn)橄蛏限D(zhuǎn)型之后使用引用進(jìn)行訪問,只能訪問父類定義的接口,而不能訪問自己定義的新接口。 preliminary 最近在讀Thinking in Java這篇是一個基本此書的整理。 什么是向上轉(zhuǎn)型upcast? 對象既可以作為它本身的類型使用,也可以作為它的基類...

    RdouTyping 評論0 收藏0
  • Java編程思想》筆記8.多態(tài)

    摘要:多態(tài)的作用是消除類型之間的耦合關(guān)系。編寫構(gòu)造器準(zhǔn)則用盡可能簡單的方法使對象進(jìn)入正常狀態(tài),如果可以的話,避免調(diào)用其他方法。 點(diǎn)擊進(jìn)入我的博客 在面向?qū)ο蟮某绦蛟O(shè)計語言中,多態(tài)是繼數(shù)據(jù)抽象(封裝)和繼承之后的第三種基本特征。多態(tài)通過分離做什么和怎么做,從另一角度將接口和實(shí)現(xiàn)分離開來。多態(tài)的作用是消除類型之間的耦合關(guān)系。 8.1 再論向上轉(zhuǎn)型 對象既可以作為它自己的本類使用,也可以作為它的...

    chinafgj 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<