2016-02-29 98 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