2011-12-09 50 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