2016-09-22 4 views
1

ユーザーが入力した詳細を保存して表示するArrayListを実装しようとしています。コードは正常に動作しますが、コンストラクタはStudentDetailsクラスからmainとotherからそれぞれ2回呼び出されます。一度だけ電話をかける方法はありますか? ここには、StudentDetailsクラスのオブジェクトを呼び出すメインメソッドと、ArrayListを持つStudentDetailsクラスを持つStudentクラスがあります。コンストラクターが2回呼び出される

public class Student2 {  

    public static void main(String[] args) {    
    StudentDetails sd1 = new StudentDetails(); 
    sd1.input(); 
    sd1.display();   
    } 

    class StudentDetails {  
    int marks; 
    String names; 
    List<StudentDetails> sd = new ArrayList<>(); 

    public int getMarks() { 
     return marks; 
    } 

    public void setMarks(int marks) { 
     this.marks = marks; 
    } 

    public String getNames() { 
     return names; 
    } 

    public void setNames(String names) { 
     this.names = names; 
    } 

    public StudentDetails() {  
     System.out.println("Program Started"); 
    } 

    public void input() {  
     int no; 
     StudentDetails sDetails = new StudentDetails(); 
     System.out.println("How many students?"); 
     Scanner sc = new Scanner(System.in); 
     no = sc.nextInt(); 

     for (int i = 0; i < no; i++) { 
      System.out.println("Enter name of student" + (i + 1)); 
      sDetails.setNames(sc.next()); 
      System.out.println("Enter marks for same student"); 
      sDetails.setMarks(sc.nextInt()); 
      sd.add(sDetails);  
     }  
    } 

    public void display() { 
     for (int i = 0; i < sd.size(); i++) {     
      System.out.println("The name of student" + " " + (i + 1) + " " + "is" + " " + sd.get(i).getNames() 
        + " and marks are" + " " + sd.get(i).getMarks());  
     } 
    } 
} 
+2

' StudentDetails SD1 =新しいStudentDetails()のためのマネージャーとして動作する追加のクラスを作成します。うん、それは2回呼び出される... – SomeJavaGuy

+0

ヒント:コンストラクタは一度だけ呼び出すことができます。 * this *をインクルードするようにプリントアウトを変更すると、** 2つの** StudentDetailsオブジェクトを作成しているので、あなたのコンストラクタは "2回"と呼ばれます。 – GhostCat

+0

私は2つのオブジェクトを作成していることを知っています。単一のオブジェクトで動作させるための回避策はありますか? –

答えて

2

2度(2つのStudentDetailsインスタンスを作成する)、実際には十分ではありません。 input()メソッドでは、これらのオブジェクトをListに追加していて、複数の同じオブジェクトを追加したくないため、ループの繰り返しごとに1回、複数回呼び出す必要があります。

あなたはinput()display()静的メソッドを作成し、静的変数にsdを変更することにより、mainでオブジェクトの作成を避けることができます。

public static void main(String[] args) {    
    StudentDetails.input(); 
    StudentDetails.display();   
} 

... 
static List<StudentDetails> sd = new ArrayList<>(); 
... 
public static void input() { 
    ... 
    for (int i = 0; i < no; i++) { 
     StudentDetails sDetails = new StudentDetails(); 
     System.out.println("Enter name of student" + (i + 1)); 
     sDetails.setNames(sc.next()); 
     System.out.println("Enter marks for same student"); 
     sDetails.setMarks(sc.nextInt()); 
     sd.add(sDetails);  
    } 
    ... 
} 

public static void display() { 
    ... 
} 
+0

うん、理解して働くことになった。 –

0

ここには更新されたクラスがあります。

import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class Student2 { 

public static void main(String[] args) { 

    StudentDetails sd1 = new StudentDetails(); 
    sd1.input(); 
    sd1.display(); 

} 

class StudentDetails { 

    int marks; 
    String names; 
    List<StudentDetails> sd = new ArrayList<>(); 

    public int getMarks() { 
     return marks; 
    } 

    public void setMarks(int marks) { 
     this.marks = marks; 
    } 

    public String getNames() { 
     return names; 
    } 

    public void setNames(String names) { 
     this.names = names; 
    } 

    public StudentDetails() { 

     System.out.println("Program Started"); 
    } 

    public void input() { 

     int no;   
     System.out.println("How many students?"); 
     Scanner sc = new Scanner(System.in); 
     no = sc.nextInt(); 

     for (int i = 0; i < no; i++) { 
      System.out.println("Enter name of student" + (i + 1)); 
      setNames(sc.next()); 
      System.out.println("Enter marks for same student"); 
      setMarks(sc.nextInt()); 
      sd.add(this); 

     } 
     sc.close(); 
    } 

    public void display() { 
     for (int i = 0; i < sd.size(); i++) { 

      System.out.println("The name of student" + " " + (i + 1) + " " 
        + "is" + " " + sd.get(i).getNames() + " and marks are" 
        + " " + sd.get(i).getMarks()); 

     } 
    } 
} 
} 
0

@ Eranの回答のオプションとして、より適切なクラスデザインにしたいと思うかもしれません。現時点でList<StudentDetails>StudentDetailsのインスタンスに依存していますが、これは私の目では始まっても意味がありません。 `;`、 `StudentDetails sDetails =新しいStudentDetails();

StudenDetails

public class Student2 { 

    public static void main(String[] args) { 
     // We create a Dictionary here now. This holds the StudentDetails now 
     StudenDictionary sd1 = new StudenDictionary(); 
     sd1.input(); 
     sd1.display(); 
    } 

    static class StudenDictionary { 
     List<StudentDetails> sd = new ArrayList<>(); 

     static Scanner sc = new Scanner(System.in); 

     public void input() { 
      int no; 

      System.out.println("How many students?"); 
      no = sc.nextInt(); 

      for (int i = 0; i < no; i++) { 
       System.out.println("Enter name of student" + (i + 1)); 
       // Store in variables and use a proper constructor 
       String names = sc.next(); 
       System.out.println("Enter marks for same student"); 
       int marks = sc.nextInt(); 
       // StudenDetails variable in loop now, caring for scope now 
       StudentDetails sDetails = new StudentDetails(names, marks); 
       sd.add(sDetails); 
      } 
     } 

     public void display() { 
      for (int i = 0; i < sd.size(); i++) { 
       System.out.println("The name of student" + " " + (i + 1) + " " + "is" + " " + sd.get(i).getNames() 
         + " and marks are" + " " + sd.get(i).getMarks()); 
      } 
     } 
    } 

    static class StudentDetails { 
     int marks; 
     String names; 

     public int getMarks() { 
      return marks; 
     } 

     public void setMarks(int marks) { 
      this.marks = marks; 
     } 

     public String getNames() { 
      return names; 
     } 

     public void setNames(String names) { 
      this.names = names; 
     } 

     // Use a proper constructor 
     public StudentDetails(String names, int marks) { 
      this.names = names; 
      this.marks = marks; 
     } 

    } 
} 
+0

私は2つのセッターメソッドはここでは使い道がないと感じます。 –

関連する問題