繁体   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