[英]How can I compare private member variables of different classes without using inheritance/getters/reflection?
我必須用相似的成員變量和方法創建兩個不同的類,除了其中兩個沒有的方法之外。 因此,我決定將不完整類的實例創建到另一個類中,以免出現重復的代碼。
所以他們看起來像這樣:
public class Beast{
private int speed;
//other variables & methods
...
}
和
public class Hero{
private int speed;
//other variables
...
Beast beast = new Beast();
...
}
如何在不使用兩個類(吸氣劑或反射類)之間的任何繼承的情況下 ,將Beast
實例的speed
變量與Hero
實例的speed
變量進行比較? (也許接口會幫助我,因為我仍處於早期Java學習階段,所以我不知道)
如果這只是一個難題,那么有幾種方法可以做到這一點而無需繼承,獲取或反思。
嵌套類可以訪問其封閉類的私有變量,以及同一作用域中的其他嵌套類。
class Outer { public static class Hero { private int speed; } public static class Beast { private int speed; } }
在該示例中, Hero
和Beast
現在可以訪問彼此的私人speed
變量。 這意味着Hero
類可以執行this.speed == aBeast.speed
,或者您要進行比較。
使用參數傳遞。
public class Beast { private int speed; public boolean isSpeedEqualTo(int speed) { return this.speed == speed; } }
然后,例如Hero
可以說aBeast.isSpeedEqualTo(this.speed)
。
但是,使用吸氣劑更有意義,而且似乎應該在Hero
和Beast
擴展的超類中聲明speed
變量。
如果沒有在組合類中提供getter,則無法比較這些不同類的實例的private
字段。
不用思考,您大致有兩種選擇:
public
,這通常是一個壞習慣 Hero
引入了一種比較方法,以比較速度並在其他課程中提供吸氣劑。 您無需在Hero
提供getter,因為可以在類的實例方法中訪問私有字段。 對於第二種方式,它可能類似於:
public class Beast{
private int speed;
public Beast(int speed){
...
}
public int getSpeed(){
return speed;
}
}
public class Hero {
private int speed;
private Beast beast;
public Hero (int speed, Beast beast){
...
}
// just an example to use speed from the both instances
public boolean isMoreFast(){
return speed > beast.getSpeed();
}
}
您現在可以執行以下操作:
Beast beast = new Beast(beastSpeed);
Hero hero = new Hero(heroSpeed, beast);
boolean isHeroFaster = hero.isMoreFast();
我相信,沒有繼承,獲取者或反思,您將無法做到這一點。
聲明私有變量時,只能在其自己的類中直接訪問此變量。
oracle文檔下面:
本着封裝的精神,通常將字段設為私有。 這意味着只能從Bicycle類直接訪問它們。 但是,我們仍然需要訪問這些值。 可以通過添加為我們獲取字段值的公共方法來間接完成此操作。
Oracle文檔: Java訪問修飾符
在int之前使用static關鍵字。
靜態int速度。
借助static關鍵字,您無需創建類的對象,就可以像訪問它
ClassName。變量名稱
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.