【问题标题】:Accessing data from other classes访问其他类的数据
【发布时间】:2013-08-18 18:29:43
【问题描述】:

我是初学者,所以请非常具体。无论如何,我在这里有三个代码类,我想从 c-b 然后 b-a 访问数据,例如

class GoobyPls {
{
    private int CHealth = 20;
    private int MHealth = 20;
    private int CAgility = 10;
    private int MAgility = 10;
    private int CDefence = 5;
    private int MDefence = 5;
}   
}

class Stats {
public static void foo() {
    string Health =  CHealth + "/" + MHealth ;
    string Agility = CAgility + "/" + MAgility;
    string Defence = CDefence + "/" + MDefence;
}

}

class ViewStats {
public static void foo() {
System.out.println("Health");
                System.out.println(Health);
                System.out.println(" ");
                System.out.println("Agility");
                System.out.println(Agility);
                System.out.println(" ");
                System.out.println("Defence");
                System.out.println(Defence);
                System.out.println(" ");
  }
}

所以GoobyPlsaStatsbViewStatsc

我也不能把它全部放在一个类中,因为最终会有一个修饰类来编辑CHealthMHealth

【问题讨论】:

标签: java class variables private


【解决方案1】:

在您的班级GoobyPls 中为每个项目添加 getter,如下所示:

class GoobyPls {
{
   private int CHealth = 20;

   public int getHealth(){
      return Chealth;
   }
}

然后在viewStats 中执行以下操作:

GoodyPls gp = new GoobyPls();
System.out.println(gp.getHealth());

当您想使用私有变量时,只需调用 getter。或者也可以定义变量public,这样就可以直接在viewStats中调用。但是从设计的角度来看,getter 和 setter 更好,因为隐藏信息更好。 除非有充分的理由这样做,否则应将字段声明为私有。

【讨论】:

  • 澄清一下:非公共字段和隐藏信息通常更好的一些原因包括:a) 内部对外部隐藏,因此您可以更改字段和内部实现稍后无需更改可能使用您的吸气剂的其余代码。 b) 您可以编写 getter 而不是 setter,从而有效地将数据设为只读,这很有用。 c) 子类可以覆盖方法,但不能覆盖公共字段访问。在很多情况下,公共领域是有意义的。在教新程序员时要小心使用“总是更好”之类的语句。
【解决方案2】:

如果要在类外访问私有变量,必须使用如下getter方法。

class GoobyPls {
private int CHealth = 20;
private int MHealth = 20;
private int CAgility = 10;
private int MAgility = 10;
private int CDefence = 5;
private int MDefence = 5;
public int getCHealth() {
    return CHealth;
}
public int getMHealth() {
    return MHealth;
}
public int getCAgility() {
    return CAgility;
}
public int getMAgility() {
    return MAgility;
}
public int getCDefence() {
    return CDefence;
}
public int getMDefence() {
    return MDefence;
}
}  

下面是你的 State 类

class Stats {
public static void foo() {
GoobyPls g=new GoobyPls();
int Health =  g.getCHealth() / g.getMHealth() ;
int Agility = g.getCAgility() / g.getMAgility();
int Defence = g.getCDefence() / g.getMDefence();
}

viewstat 类的foo() 方法中,您可以通过State.HealthState.AgilityState.Defence 访问about 值

【讨论】:

    【解决方案3】:

    我强烈建议您通读Java tutorial on classes and objects,这将为您提供良好的工作基础。

    在类之间传递数据的最基本方法是在您的类中定义公共方法,其他对象可以调用这些方法来访问您的数据。例如:

    public class Person {
    
        private String firstName; 
        private String lastName;
    
        public String getFirstName () {
            return firstName;
        }
    
        public String getLastName () {
            return lastName;
        }
    
    }
    

    名称如getX() 并返回值的方法称为“getter”。然后,在另一个类中,您可以访问该数据,例如:

    public void elsewhere () {
        Person p = new Person();
        System.out.println(p.getFirstName() + " " + p.getLastName());
    }
    

    与类通信的另一种方法是编写带参数的方法,例如:

    public void printFullName (Person p) {
        System.out.println(p.getFirstName() + " " + p.getLastName());
    }
    
    public void elsewhere () {
        Person p = new Person();
        printFullName(p);
    }
    

    您可能还想提供方法来设置对象中的数据。这些被称为“setter”,是“getter”的对应物。以Person 为基础:

    public class Person {
    
        private String firstName; 
        private String lastName;
    
        public String getFirstName () {
            return firstName;
        }
    
        public String getLastName () {
            return lastName;
        }
    
        public void setFirstName (String firstName) {
            this.firstName = firstName;
        }
    
        public void setLastName (String lastName) {
            this.lastName = lastName;
        }
    
    }
    

    然后,其他对象可以修改一个人的数据,例如:

    public void elsewhere () {
        Person p = new Person();
        p.setFirstName("Bob");
        System.out.println(p.getFirstName()); // prints "Bob"
    }
    

    这是一个使用上面所有内容的示例:

    public void swapPersonFirstAndLastName (Person p) {
        String temporary = p.getFirstName();
        p.setFirstName(p.getLastName());
        p.setLastName(temporary);
    }
    
    public void printFullName (Person p) {
        System.out.println(p.getFirstName() + " " + p.getLastName());
    }
    
    public void example () {
        Person p = new Person();
        p.setFirstName("John");
        p.setLastName("Smith");
        swapPersonFirstAndLastName(p);
        printFullName(p); // prints Smith John
    }
    

    希望对您有所帮助,祝您好运。阅读那些教程!

    【讨论】:

      【解决方案4】:

      首先你不能像下面这样私有字段

       class GoobyPls {
      {
          private int CHealth = 20;  // you can't use private here
          private int MHealth = 20;   // and care on java naming conventions
          private int CAgility = 10;
          private int MAgility = 10;
          private int CDefence = 5;
          private int MDefence = 5;
      }
      } 
      

      它应该是String 而不是字符串

         string Health =  CHealth + "/" + MHealth ; // String not string
      

      使用 IDE 进行编码将帮助您自行识别此类问题。

      【讨论】:

      • 澄清一下:private 不能在那里使用的原因是因为有第二组内部花括号,它实际上标记了一个初始化块(这是一个不同的主题),并且@ 987654325@ 不是那里的合法修饰符。他们必须被提升到课堂上。
      • 感谢现在查看 IDE
      • @JasonC ohh 感谢您添加更多信息
      • @user2687097 查看 Eclipse 或 NetBeans 或 JCreator。
      【解决方案5】:

      将 getter 和 setter 放到你的类中。或者公开字段。(我不建议第二个)

      class GoobyPls {
      
          public int getCHealth() {
              return CHealth;
          }
          public void setCHealth(int cHealth) {
              CHealth = cHealth;
          }
          public int getMHealth() {
              return MHealth;
          }
          public void setMHealth(int mHealth) {
              MHealth = mHealth;
          }
          public int getCAgility() {
              return CAgility;
          }
          public void setCAgility(int cAgility) {
              CAgility = cAgility;
          }
          public int getMAgility() {
              return MAgility;
          }
          public void setMAgility(int mAgility) {
              MAgility = mAgility;
          }
          public int getCDefence() {
              return CDefence;
          }
          public void setCDefence(int cDefence) {
              CDefence = cDefence;
          }
          public int getMDefence() {
              return MDefence;
          }
          public void setMDefence(int mDefence) {
              MDefence = mDefence;
          }
          private int CHealth = 20;
          private int MHealth = 20;
          private int CAgility = 10;
          private int MAgility = 10;
          private int CDefence = 5;
          private int MDefence = 5;
      }  
      

      然后你可以这样访问:

      class Stats {
      public static void foo() {
      GoobyPls gbp=new GoobyPls();
          string Health =  gbp.getCHealth + "/" + MHealth ;
          string Agility = gbp.getCAgility + "/" + MAgility;
          string Defence = gbp.getCDefence + "/" + MDefence;
      }
      

      【讨论】:

      • 这些 etter 和 seters 去哪里了,你能编辑我的代码来告诉我吗??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多