2011-12-09 48 views
0

我有一个名为'Items'的类,'Equips'从'Equips'扩展而'Helmet'从'Equips'扩展。我有一个名为'getStats'的方法,它从.txt文件加载项目的统计信息。如果我将'getStats'方法放在'Items'类中,那么无论我尝试使用'this'在'Helmet'对象中访问哪个字段。显示为空。当头盔在加载文本文件之前创建时,我试图在“头盔”中访问的字段被初始化。我可以很容易地将'getStats'方法放在'Equips'类中,并在'Items'类中放置一个空白的'getStats'方法,但我想知道是否有办法让它工作。提前致谢!在java中使用'this'关键字扩展类

Items.java:

package com.projects.aoa; 

import static com.projects.aoa.Print.*; 

import java.util.*; 
import java.io.*; 

class Items { 

String name, type; 
int id; 
int hp, mp, str, def; 
boolean vacent; 

static void getAllStats(Items[] e){ 
    for(Items i : e){ 
     getItemStats(i); 
    } 
} 

static void getItemStats(Items i){ 
    i.getStats(); 
} 

void getStats(){ 
    try { 
     //System.out.println(System.getProperty("user.dir")); 

     print(this.name); //THIS shows up as null as well as those \/below\/ 
     FileInputStream fstream = new FileInputStream(System.getProperty("user.dir") 
       + "/src/com/projects/aoa/" + this.type + this.name + ".txt"); 

     DataInputStream in = new DataInputStream(fstream); 

     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

     String line; 
     int counter = 0; 

     while ((line = br.readLine()) != null) { 
      if (line.length() == 0){ 
       break; 
      } 

      switch (counter) { 
      case 0: 
       this.hp = Integer.parseInt(line); 
       counter++; 
       break; 
      case 1: 
       this.mp = Integer.parseInt(line); 
       counter++; 
       break; 
      case 2: 
       this.def = Integer.parseInt(line); 
       counter++; 
       break; 
      case 3: 
       this.str = Integer.parseInt(line); 
       counter++; 
       break; 
      } 
     } 


     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Game.java:

Helmet headBand = new Helmet("HeadBand"); 
Helmet bronzeHelmet = new Helmet("BronzeHelmet"); 


    Items[] equips = { 
      headBand, bronzeHelmet 
    }; 



    getAllStats(equips); 

Equips.java:

package com.projects.aoa; 

import static com.projects.aoa.Print.print; 
import static com.projects.aoa.Print.println; 

import java.io.*; 



class Equips extends Items{ 
    String name, type; 
    int hp, mp, str, def; 




    void printStats(){ 
     println("[" + name + "]"); 
     println("Type: " + type); 
     println("HP: " + hp); 
     println("MP: " + mp); 
     println("Def: " + def); 
     println("Str: " + str); 
    } 
} 

class Helmet extends Equips { 
    Helmet(String name){ 
     this.name = name; 
     this.type = "h_"; 
    } 
} 
+0

你能向我们展示一些'Helmet'的代码吗?我怀疑'Helmet'类也有'name'参数,否则你只是忘了设置'name'。 – Bringer128

回答

4

你还没有告诉我们ÿ我们的Helmet类,所以很难说出发生了什么 - 但我的猜测是您在Helmet中重新声明具有相同名称的字段。那些将隐藏Items的领域,而你真的只是想使用从Items领域。

所以这里有一个简短但完整的例子证明什么,我认为是怎么回事:

class SuperClass { 
    String name; 

    public void setName(String newName) { 
     // This writes to the field in SuperClass 
     name = newName; 
    } 
} 

class SubClass extends SuperClass { 
    // This *hides* the field in SuperClass 
    String name; 

    public void showName() { 
     // This reads the field from SubClass, which 
     // nothing writes to... 
     System.out.println("My name is " + name); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     SubClass x = new SubClass(); 
     x.setName("Test"); 
     x.showName(); 
    } 
} 

我会建议:

  • 你让各个领域的私人,写性能给根据需要访问其他课程
  • 您摆脱Helmet中隐藏Items
  • 中的字段
  • 你改变你的类名,以避免多个 - ItemEquipment代替Items

下面是上面代码的固定版本:

class SuperClass { 
    private String name; 

    public void setName(String newName) { 
     name = newName; 
    } 

    public String getName() { 
     return name; 
    } 
} 

class SubClass extends SuperClass { 
    public void showName() { 
     System.out.println("My name is " + getName()); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     SubClass x = new SubClass(); 
     x.setName("Test"); 
     x.showName(); 
    } 
} 

(很明显,你还需要考虑什么访问穿上属性等,但这是一个单独的问题。)

+0

哦,是的,就是这样。物品最初是一个界面,所以我必须在Equips中再次声明它们。我是新来的java:/谢谢你的帮助! – iRector

+0

@iRector:然后接受答案... –

+0

太早了...完成了 – iRector