在另一个类中使用对象数组

时间:2013-07-04 03:17:16

标签: java arrays class object methods

这会从文件中导入文本并创建敌人

类型的对象数组
class cmdquest{

    public static void main(String args[]) throws Exception{

            //Importing foes.txt to create objects of foes
            java.io.File file = new java.io.File("foes.txt");
            Scanner imp = new Scanner(file);  
            foe foes[] = new foe[100];
            for(int i =0; i<3; i++){
                foes[i]=foe.leDados(imp);
            }
}

在另一个班级,我有这个,但它不起作用

static void db(){
    for(int a=0; a<3; a++){
        System.out.print(cmdquest.foes[a].name + "\t");
    }
    System.out.print("*Press Enter to go back to the main menu*");
        Scanner kb = new Scanner(System.in);
        kb.nextLine();

        Menu.show_menu();
}

这是我的班级敌人,声明了所有内容,包括姓名:

class foe{
    String name;
    int hp;
    int str;
    int def;

    foe(String n, int h, int s, int d) {
    name = n;
    hp = h;
    str = s;
    def= d;
    }

    static foe leDados(Scanner imp){
            String foe_name = imp.next();
            int foe_hp = imp.nextInt();
            int foe_str = imp.nextInt();
            int foe_def = imp.nextInt();
        return new foe(foe_name, foe_hp, foe_str, foe_def);
    }
}

这是我在编译时遇到的错误:

   cmdquest.java:186: error: cannot find symbol
                            System.out.print(cmdquest.foes[a].name + "\t");
                                                             ^
      symbol:   variable foes
      location: class cmdquest
    1 error

3 个答案:

答案 0 :(得分:1)

在您的代码中,问题是您正在尝试访问类

中不存在的对象
System.out.print(cmdquest.foes[a].name + "\t");

这一行说cmdquest有一个公共数组字段名称为敌人。但是你班上没有任何领域。

在你的班级

class cmdquest{

    public static void main(String args[]) throws Exception{

            //Importing foes.txt to create objects of foes
            java.io.File file = new java.io.File("foes.txt");
            Scanner imp = new Scanner(file);  
            foe foes[] = new foe[100];
            for(int i =0; i<3; i++){
                foes[i]=foe.leDados(imp);
            }
    }
}

敌人是一个在主要方法之外没有存在的局部场。所以你不能在主方法之外引用敌人。
要从外部访问敌人,你必须将敌人作为cmdquest类中的全局变量,并且必须根据你的要求提供修饰符。

public class cmdquest{

    public foe foes[] = new foe[100];

    public static void main(String args[]) throws Exception{

            //Importing foes.txt to create objects of foes
            java.io.File file = new java.io.File("foes.txt");
            Scanner imp = new Scanner(file);  
            for(int i =0; i<3; i++){
                foes[i]=foe.leDados(imp);
            }
   }
}

如果您想在不创建cmdquest对象的情况下直接访问敌人对象,请将敌人对象设为静态

 public static foe foes[] = new foe[100];

这是您的问题的解决方案。但是,这不是在java编码之前的结束,你必须遵循一些指南或最佳实践,以便你可以编写更好的代码和更少的errorpron。因此,阅读这篇文章:
http://viralpatel.net/blogs/most-useful-java-best-practice-quotes-java-developers/

答案 1 :(得分:0)

使代码工作所需要的是将对手存储为cmdquest上的静态属性

class cmdquest{

    public static foes foes[];

    public static void main(String args[]) throws Exception{

            //Importing foes.txt to create objects of foes
            java.io.File file = new java.io.File("foes.txt");
            Scanner imp = new Scanner(file);  
            for(int i =0; i<3; i++){
                foes[i]=foe.leDados(imp);
   }
}

但是,拥有可变的静态属性是不好的做法,因为它们本质上是全局变量。你应该有一个返回foe[]

的方法
class foe{
    String name;
    int hp;
    int str;
    int def;

    foe(String n, int h, int s, int d) {
      name = n;
      hp = h;
      str = s;
      def= d;
    }

    private static foe leDados(Scanner imp){
            String foe_name = imp.next();
            int foe_hp = imp.nextInt();
            int foe_str = imp.nextInt();
            int foe_def = imp.nextInt();
        return new foe(foe_name, foe_hp, foe_str, foe_def);
    }

    public static foe[] getFoes() {

        java.io.File file = new java.io.File("foes.txt");
        Scanner imp = new Scanner(file);  

        foe foes[] = new foe[100];
        for(int i =0; i<3; i++){
            foes[i] = foe.leDados(imp);
        }
        return foes;
    }
}

并称之为

static void db(){
    foes[] foes = foe.getFoes();
    for(int a=0; a<3; a++){
        System.out.print(cmdquest.foes[a].name + "\t");
    }

答案 2 :(得分:-2)

这应该有用。

class cmdquest{
    public foe foes[] = new foe[100];

    public static void main(String args[]) throws Exception{

        //Importing foes.txt to create objects of foes
        java.io.File file = new java.io.File("foes.txt");
        Scanner imp = new Scanner(file);  

        for(int i =0; i<3; i++){
            foes[i]=foe.leDados(imp);
        }
}