簡體   English   中英

在自己的字段成員上使用super的實例方法進行子操作

[英]Sub using super's instance method on its own field members

假設我有SUPERSUB類,其中SUB擴展了SUPER 兩者都是具體的類。

有一個實例方法,例如SUPER m1() SUPER使用該方法m1()的字段成員執行一些基本計算。 SUB希望使用SUPER在其自己的字段成員上所做的工作-並在其上面添加更多內容。

當我在SUB覆蓋m1()時,我首先可以調用super.m1() 但是,此調用在SUPER對象的字段成員上運行super.m1() ,而不是SUB 我需要的是在SUB的成員上運行的super.m1() ,這樣我就不必在我要覆蓋的方法中重復該代碼。 然后補充說,我想在做緩慢-這些進一步的計算SUB中的成員m1()的方法SUB

所以-在下面的代碼中,我正在尋找對某些成員x進行“ line-K”計算的效果,以便打印結果將顯示661而不是67:

class AAA  {    
    int x=55;
    void m1 () { 
        x*=10; // line-K
//        System.out.println("in m1() of SUPER "+x); 
    } 
}

class NewClass extends AAA  {
    int x = 66; 
    void m1 () {
        super.m1(); 
        x++; 
        System.out.println("in m1() of SUB itself..............."+x); 
    } 

    public static void main(String[] args) throws CloneNotSupportedException {
        NewClass c = new NewClass();        
        c.m1();
    }
} 

可以通過以某種方式覆蓋m1()而不用在super.m1()重復該代碼來完成此操作嗎?

怎么樣?

TIA。

// =========================================

編輯:

我可以將x作為參數傳遞給該方法並返回它-通過使m1()接受參數並返回一個值,從而完成我需要的工作。 但這不是我想知道的。

在子類中聲明與超類中的成員同名的成員的概念稱為隱藏

如果類聲明了具有特定名稱的字段,則稱該字段的聲明隱藏了超類和該類的超接口中所有相同名稱的字段的所有可訪問聲明。

(這里隱藏了方法和字段。)

字段不是多態的。 在這種情況下,超類不知道子類中聲明的成員,因此絕對不知道。 那會破壞封裝。

可以通過以某種方式覆蓋m1()而不用在super.m1()重復該代碼來完成此操作嗎?

否。您提出的帶有額外參數的解決方案似乎很合適。

這是獲得所需東西的標准方法:

static class AAA  {    
    int x=55;
    void m1 () { 
        setX(getX()*10); // line-K
    } 
    int getX() { return this.x; }
    void setX(int x) { this.x = x; }
}

static class NewClass extends AAA  {
    int x = 66; 
    void m1 () {
        super.m1(); 
        setX(getX()+1); 
        System.out.println("in m1() of SUB itself..............."+getX()); 
    } 
    @Override
    int getX() { return this.x; }
    @Override
    void setX(int x) { this.x = x; }

}     
public static void main(String[] args)
{
    NewClass c = new NewClass();        
    c.m1();
}

實例變量不是虛擬的,但是方法是虛擬的。

但是,將實例變量隱藏在子類中絕不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM