![](/img/trans.png)
[英]How and Where was the my repository interface instanced by SimpleJdbcRespository?
[英]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.