2011-12-09 11 views
0

私は、 'Equips'が拡張する 'Items'というクラスを持っていて、 'Helmet'は 'Equips'から拡張しています。 .txtファイルから項目の統計情報を読み込む 'getStats'というメソッドがあります。私が 'Items'クラスに 'getStats'メソッドを置くと、 'this'を使って 'Helmet'オブジェクトにアクセスしようとしているどのフィールドであれ。 nullが表示されます。ヘルメットでアクセスしようとしているフィールドは、テキストファイルがロードされる前にヘルメットが作成されると初期化されます。私は非常に簡単に 'Equips'クラスに 'getStats'メソッドを置き、 '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'クラスにも' name'パラメータがあると思われます。そうでなければ 'name'を設定するのを忘れてしまいます。 – Bringer128

答えて

4

あなたは私たちにYを示していません私たちの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
  • あなたが複数のを避けるために、あなたのクラス名を変更する - 代わりItems

ItemEquipmentをここでは、上記のコードの修正バージョンです:

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

関連する問題