2016-02-29 96 views
1

我得到了類Wolf的對象wolfOne,我需要在另一個類中訪問其變量mAlive,我該怎麼辦?從另一個類訪問對象以獲取其變量

Wolf wolfOne; 

//狼類

public class Wolf extends Card { 

    public Wolf(){ 
     mCharacter = "Wolf"; 
    } 

    public void savage(Card card) { 
     card.mAlive = false; 
    } 

} 

//卡類

public class Card { 

    //Names 
    public String mCharacter; 

    //Status 
    public static boolean mAlive; 
    public static boolean mDefended; 
    public static boolean mOwled; 
    public static boolean mLastSavaged; 
    public static boolean mLastLynched; 


    //Constructor 
    public Card() { 
     // Do Card specific stuff. 
    } 
} 
+1

首先,不要讓所有的布爾值都是靜態的,因爲它們不屬於對象。其次,如果他們是公開的,你可以像這個'wolfOne.mAlive'那樣訪問它。 – callyalater

+0

我不能這樣做,這就是爲什麼:/ – FET

+0

然後你不通過實例訪問它們。你可以按照課程「Wolf.mAlive」訪問它們。 – callyalater

回答

1

卸下所有類變量的靜態 - 讓他們代替實例變量。然後,每提供典型的getter/setter方法,允許類的客戶端檢索或突變值:

public class Wolf extends Card { 
    public Wolf(){ 
     setMCharacter("Wolf"); 
    } 

    public void savage(Card card) { 
     card.setMAlive(false); 
    } 
} 


    public class Card { 

     //Names 
     private String mCharacter; 

     //Status 
     private boolean mAlive; 
     private boolean mDefended; 
     private static boolean mOwled; 
     private static boolean mLastSavaged; 
     private static boolean mLastLynched; 

     public String getMCharacter(){} 
      return mCharacter; 
     } 

     public void setMCharacter(String value){ 
      this.mCharacter = value; 
     } 

     public boolean getMAlive(){ 
      return mAlive; 
     } 

     public void setMAlive(boolean alive){ 
      this.mAlive = alive 
     } 

     //....So on and so forth 
    } 
+0

我同意你的看法,變量應該在它們上有accessor/mutator方法。這是更好的設計,對未來的發展更具可擴展性。 – callyalater

+0

謝謝,明天我會讓你知道,現在祝你有美好的一天! – FET

+0

事實上,我有一個名爲wolfOne的Wolf對象('Wolf wolfOne = new Wolf()'),但在這個其他類中(我在android中的活動)我無法獲得對這個wolfOne的引用! – FET

1

static在Java中的特殊含義。這並不意味着變量或方法是可繼承的;這意味着只有一個屬於這個類,而不是實例。

要從超類繼承,所需要的只是它不是private,繼承類將獲得它。以下示例顯示了這種關係。

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class A 
{ 
    public String name; 
    public boolean isAlive; 
    public A() 
    { 
     name = "A"; 
     isAlive = true; 
    } 
} 

class B extends A 
{ 
    public B() 
    { 
     name = "B"; 
     isAlive = false; 
    } 
} 

public class Main 
{ 
    public static void main (String[] args) 
    { 
     A a = new A(); 
     A b1 = new B(); 
     B b2 = new B(); 
     b2.name = "B2"; 
     b2.isAlive = true; 
     System.out.println(a.name); 
     System.out.println(a.isAlive); 
     System.out.println(b1.name); 
     System.out.println(b1.isAlive); 
     System.out.println(b2.name); 
     System.out.println(b2.isAlive); 
    } 
} 

而且給出了這樣的輸出:

A 
true 
B 
false 
B2 
true 

這可以運行here

+0

謝謝,明天我會給你反饋taggin'你,現在有一個美好的一天! – FET

+0

事實上,我有一個名爲wolfOne的Wolf對象('Wolf wolfOne = new Wolf()'),但是在這個其他類中(我在android中的活動)我無法獲得對這個wolfOne的引用! – FET

+0

然後,您需要在android應用程序中的上下文之間傳遞信息。如果沒有直接訪問實例化的類,你將需要一些中間類,這些類在所有的Android類中共享或者存儲在你的Bundle中。 – callyalater

1

在卡類中使字段私有不公開,在oo中稱爲封裝或數據隱藏(查看它)。然後簡單地添加一個返回mAlive值的getMAlive方法和一個setMAlive方法來設置它。現在在你的狼類中設置mAlive,你可以使用setMAlive(boolean)。對於外部對象,你需要有你的狼/卡的引用,並調用wolfName.getMAlive()

對於卡...

private boolean mAlive; 
public boolean getMAlive(){ 
    return mAlive; 
} 
public void setMAlive(boolean value){ 
    mAlive = value; 
} 

灰太狼......

public void savage(){ 
    setMAlive(false); 
} 

對於其他類可以得到mAlive ...

wolfName.getMAlive() 

您可能會考慮讓您的mAlive(和卡中的其他字段)受到保護。受保護的字段只能通過擴展它們的類才能看到,例如狼。因此,在狼野蠻的方法,你可以這樣做......

public void savage(){ 
    mAlive = false; 
} 

但是從你仍然需要一個二傳手在卡其他類設置mAlive所以是

我希望這有助於:)好運氣

+0

事實是我有一個名爲wolfOne的Wolf對象('Wolf wolfOne = new Wolf()'),但在這個其他類中(我在android中的活動)我無法獲得對那個wolfOne的引用! – FET