簡體   English   中英

從另一個類訪問對象以獲取其變量

[英]Access object from another class to get its variable

我得到了類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.
    }
}

從所有類變量中刪除靜態 - 改為使用實例變量。 然后為每個提供典型的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
    }

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

這可以在這里運行。

在卡類中使字段私有而不是公共的,在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,你仍然需要卡中的setter所以是的

我希望這有助於:)祝你好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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