2016-09-20 9 views
1

私はArrayListというbuildingというスーパークラスのインスタンスを格納しています(Residence)。 (この時点では、Managerというサブクラスのうちの1つしか定義していません)。私がしようとしているのは、位置がm(マネージャーの略)の場合、テキストファイルから読み込み、 "mng"タイプのマネージャーと呼ばれるオブジェクトを作成し、buildingに保管することです。私はファイルを読むときに問題はありませんが、一度私のコンストラクタに値を挿入すると、値はnullになります。ここ私はオブジェクト属性の値を定義しましたが、それらはすべてnullになりますが、なぜですか?

は私の居住クラスです:

public class Residence { 
    String posision; 
    String username; 
    String pass; 
    String accNo; 
    String type; 
    String no; 
    public Residence(String p, String u, String pas, String acc, String type, String no) { 
     this.posision = p; 
     this.username = u; 
     this.pass = pas; 
     this.accNo = acc; 
     this.type = type; 
     this.no = no; 
    } 

    public Residence() {} 
} 

マネージャークラス:

public class Manager extends Residence { 
    public String posision; 
    public String username; 
    public String pass; 
    public String accNo; 
    public String type; 
    public String no; 

    public Manager() { 
     super(); 
    } 

    public Manager(String p, String u, String pas, String acc, String type, String no) { 
     super(p , u , pas, acc, type , no); 
    } 

    public String getUsername() { 
     return username; 
    } 
} 

とここでの主なさ:

public static void main(String[] args) { 
     File file = new File("E:\\guaz\\eclipse_javafx\\workspace\\dkflozaTesting\\src\\dkflozaTesting\\danial.txt"); 
     ArrayList<Residence> building = new ArrayList<Residence>(); 
     String posision = ""; 
     String username = ""; 
     String pass = ""; 
     String accNo = ""; 
     String type = ""; 
     String no = ""; 
     try { 
      Scanner scan = new Scanner(file); 
      while(scan.hasNext()) { 
       posision = scan.next(); 
       username = scan.next(); 
       pass = scan.next(); 
       accNo = scan.next(); 
       type = scan.next(); 
       no = scan.next(); 
       System.out.println(posision + " " + username + " " + pass + " " + type + " " + no); 
       if (posision.compareToIgnoreCase("m") == 0) { 
        System.out.println("in if : " + posision + " " + username + " " + pass + " " + type + " " + no); 
        Manager mng = new Manager(posision, username, pass, accNo, type, no); 
        System.out.println("username : " + mng.getUsername()); 
        building.add(mng); 
       } 
      } 

      System.out.print("\n \n"); 
      //System.out.print(list.size()); 
      //System.out.print(list.get(0).getUsername()); 
      System.out.print("\n \n"); 
     } catch(Exception e) { 
      System.out.println(e.getLocalizedMessage()); 
     } 
    } 

そしてメインの出力を次のように

t dkfloza pass pre 1 
in if : t dkfloza pass pre 1 
username : null 
m danial pass1 post 2 

アパートのサイズが1に変更されたが、すべての属性の値がnullであると述べることがあります。

+0

'hasNextLine()'の代わりに 'hasNext()'を使い、その行に基づいて読み込みたいのですか? – Makoto

+1

あなたは 'manager'にすべてのフィールドの2つのバージョンを持っています。 'residence'クラスでは1セット、' manager'クラスでは1セットです。 'manager'で宣言されたフィールドは決して初期化されないので、デフォルトは' null'です。私が何を意味するか見るには、 'return username;を' return super.username;に変更してください。 – 4castle

+5

本当に、あなたのコードは正当な理由で**混乱しています**。あなたはJavaの命名規則に違反しています(クラス名は大文字で始まります)。あなたの変数の名前は本当に悪いです:p、u、n、pas ...どういう意味ですか?あなたに教えてください:彼らは何も意味しません。その背後にあるものが何であるかを言う名前を使用してください!そして、あなたのPersonクラスにデフォルトのコンストラクタを持つことには意味がありません。 – GhostCat

答えて

1

初期化するには、マネージャークラスから変数を削除する必要があります。

public class Manager extends Residence { 
    public Manager() { 
     super(); 
    } 

    public Manager(String p, String u, String pas, String acc, String type, String no) { 
     super(p , u , pas, acc, type , no); 
    } 

    public String getUsername() { 
     return username; 
    } 
} 

変数をオーバーライドしているので、値を割り当てる場合は、変数を再初期化する必要があります。しかし、あなたがそれらを継承している場合、同じ変数を上書きするという点はありません。 (Psは通常プライベートとして設定し、getterとsetterを使うべきです)

関連する問題