簡體   English   中英

如何在不使用繼承/獲取器/反射的情況下比較不同類的私有成員變量?

[英]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學習階段,所以我不知道)

如果這只是一個難題,那么有幾種方法可以做到這一點而無需繼承,獲取或反思。

  1. 嵌套類可以訪問其封閉類的私有變量,以及同一作用域中的其他嵌套類。

     class Outer { public static class Hero { private int speed; } public static class Beast { private int speed; } } 

    在該示例中, HeroBeast現在可以訪問彼此的私人speed變量。 這意味着Hero類可以執行this.speed == aBeast.speed ,或者您要進行比較。

  2. 使用參數傳遞。

     public class Beast { private int speed; public boolean isSpeedEqualTo(int speed) { return this.speed == speed; } } 

    然后,例如Hero可以說aBeast.isSpeedEqualTo(this.speed)

但是,使用吸氣劑更有意義,而且似乎應該在HeroBeast擴展的超類中聲明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.

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