2012-04-30 13 views
0

親クラスフィールドを取得しようとしています。この例では、新しいDarkRoomが作成されるとき、intゼロはDarkRoomコンストラクターに渡されます。 thisRoomNumberフィールドにゼロのintを代入することになっていました。次のステップ - Tenantを作成し、初期化した1つのオブジェクトDarkRoomを渡します。なんらかの理由でSemaphoreクラスのnextRoomフィールドには、から継承されたフィールドthisRoomNumberがあり、という数値がに割り当てられていますが、値は96です。何が欠けている?なぜ私は得ることができない0からnextRoom.thisRoomNumberデザインは非常に複雑です、多少単純な解決策がありますか?親クラスのフィールド値を得る親フィールドの代わりに

public abstract class Room { 
public int thisRoomNumber = 96; 
} 

主な方法:

public class TestCase { 
    public static void main(String[] args) { 
    Room s[] = new Room[1]; 
      {  
       s[0] = new DarkRoom(0, s); 
       } 
     new Tenant("Joe", s[0], s); 
     } 
    } 

暗室クラス:

public class DarkRoom extends Room { 

private Room thisRoomType = this; 
public int thisRoomNumber; 
private Room[] rooms; 
private Semaphore semaphore= new Semaphore(); 
@Override 
void leave(Tenant t) { 
    semaphore.release(thisRoomType, rooms, t); 
} 
public int thisRoomNumber; 

public DarkRoom(int i, Room[] s) { 

     this.thisRoomNumber = i; 
     this.rooms = s; 
    } 
} 

セマフォクラス:

public class Semaphore { 
public synchronized void release(Room thisRoom, Room[] allRooms, Tenant t) { 
Room nextRoom; 

     while(j < allRooms.length && 

      allRooms[j].negativeCounter == 0 && 

      thisRoom.getClass().equals(allRooms[j].getClass())){ 

      j++; 
     } 
nextRoom = allRooms[j]; 
System.out.println(nextRoom.getClass().getName() +"' "+nextRoom.thisRoomNumber); 

答えて

2

あなたのように、サブクラスでそれを宣言することによって、フィールドthisRoomNumberを隠していますウェルl。サブクラス(DarkRoom)の宣言を削除します。

+0

隠されたファイル* thisRoomNumber *(内部のみ)クラス* DarkRoom *からゼロを得ることができますか? –

+1

正確には、このように2回定義した場合です。私はあなたがそれが親クラスで一度定義されることを意味すると思う。 –

2

フィールドはJavaでは多態性ではありません。メソッドだけがあります。まともな本が示唆していることをすべて行い、パブリックフィールドを使用しないでください。代わりにゲッターを使用し、サブクラスのゲッターをオーバーライドします。フィールドはオーバーライドできません。

関連する問題