簡體   English   中英

如何使用實例變量隱藏接口變量

[英]How to shadow an interface variable with an instanced variable

我在使用instanced變量遮蔽接口變量時遇到了一些麻煩。 我知道如何通過重寫方法並在方法中手動分配變量來做到這一點,但無法弄清楚如何使用任何對象的實例變量來調用方法。

public interface ShakesHands {

    static final String name = "Gabe";

    public void shakeHands (ShakesHands other);
}

class Student implements ShakesHands{

    String name;

    @Override
    public void shakeHands(ShakesHands other) {
        String othersName = other.name;
        System.out.println(name + " shook " + othersName + "'s hand.");
    }
}

class Parent implements ShakesHands{

    String name;

    @Override
    public void shakeHands(ShakesHands other) {
        String othersName = other.name;
        System.out.println(name + " shook " + othersName + "'s hand.");
    }
}

public class App {

    public static void main(String[] args) {

        Student student1 = new Student();
        student1.name = "Bob";

        Parent parent1 = new Parent();
        parent1.name = "Sally";

        student1.shakeHands(parent1);
    }
}

這段代碼將輸出“Bob搖搖Gabe的手”。 有什么方法可以阻止它引用接口名稱“Gabe”,而是引用實例名稱“Sally”,以便我得到“Bob震驚Sally的手”?

拋開編碼風格和清晰代碼的問題,這就是為什么你的代碼總是打印“......搖晃Gabe的手。”:

握手的方法實現引用了ShakesHands實例中的“name”,而不是其中一個實現類。 由於ShakesHands中唯一的“名稱”在這里“在范圍內”,因此您總是最終使用值為“Gabe”的靜態變量。

實際上,編譯器總是更好地使用靜態變量值,而不是使用實現類的變量(如果存在這樣的變量)。 派生類或實現類中的數據類型不需要與超類/接口中的數據類型相同,因此您可以使ShakeHand的名稱與Student的名稱不同。

例:

public interface ShakesHands {

    String name = "Gabe";

    public void shakeHands(ShakesHands other);
}

class Student implements ShakesHands {

    Integer name = Integer.valueOf(0);

    @Override
    public void shakeHands(ShakesHands other) {
        System.out.println(name.getClass().getSimpleName() + " (in this class) with value "+name+" vs. " + other.name.getClass().getSimpleName()+" (in other class) with value "+other.name);
    }
}

對於我的示例調用,printet文本是“Integer(在此類中),值為7 vs. String(在其他類中),值為Gabe”。

另一件事:即使在程序的所有實現中,實現類中都有一個“name”變量:在編譯時,編譯器不知道在運行時是否仍然如此。 您的JAR可能在另一個定義“UnnamedShakesHand”類(沒有“name”變量)的程序中使用。 那會發生什么? 如果實現類用另一個類定義“name”,你的代碼會發生什么? 它應該拋出“ClassCastException”,因為你的“String othersName = other.name;” 指令?

簡而言之:在“ShakesHands”界面中引入“String getName()”方法。 每個實現類都可以返回其名稱的變量值,一切都很好。

暫無
暫無

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

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