2017-05-06 14 views
1

Javaクラスとオブジェクトの関係を理解し​​ようとしていますが、一つの問題に直面しています。論理が理解できない

ここで私は1つの単純なJava Beanクラスを持っている:

public class Student { 

    int id; 
    String name; 
    String marks; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getMarks() { 
     return marks; 
    } 

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

} 

そして、もう一つのエディタクラス:

public class EditStudent { 

    public static void editStd(Student st){ 

     st.setId(10); 
     st.setName("editAbleName"); 
     st.setMarks("133"); 


     // return st; 
    } 

私は私のプログラムのクラスで学生のオブジェクトに対して、このロジックを書いています:

public class TestProgram { 

    public static void main(String args[]){ 
     System.out.println("main"); 

     Student std = new Student(); 
     std.setId(1); 
     std.setName("zeeshan"); 
     std.setMarks("44"); 

     EditStudent.editStd(std); 

     System.out.println("id " +std.getId()); 
     System.out.println("name " +std.getName()); 
     System.out.println("marks " +std.getMarks()); 


    } 
} 

出力:

main 
id 10 
name editAbleName 
marks 133 

テストプログラムクラスで設定したオブジェクトの出力値を取得しますが、EditStudentクラスで設定した出力値を取得するとします。 私のstdオブジェクトとeditStudentクラスの間には関係がないと思われるのはなぜですか? この論理とプロセスの背後にある論理が私に説明してください!

+1

の利益のために必要無しEditStudentそのによって参照されるオブジェクトの値を変更するためパラメータ。 –

+2

'std'は**ではない**オブジェクトです。これはオブジェクトへの参照です。 「Javaは「参照渡し」または「渡し渡し」ですか?」(http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-値) –

+0

少し役立つが、より明確なexplinationにする必要があります –

答えて

1

EditStudent.editStd(std); - editStdメソッドでstdの変更オブジェクトを渡しても、editStdはメソッドの値でstdオブジェクトを再度変更します。これは、stdおよびsオブジェクトがヒープ上の同じオブジェクトを参照するためです。

+0

ありがとうございますAnkita Vashist。 –

0

EditStudentクラスは、あなたが作成した学生クラス(st)の引数を継承します。 EditStudentクラスでBaseクラス(学生)の値を定義する必要はありません。 testprogramクラスが正しい場合、EditStudentクラスの値がオーバーライドされ、派生クラス(テストプログラム)の出力が得られます。 EditStudentクラスから値を削除します。

2

stdではないオブジェクトです。オブジェクトに対する参照です。したがって、メソッドeditStdに渡すと、参照がオブジェクトに渡されます。それらが同じであるように、従って、stが指すオブジェクトへの変更は、またstdに反映されている(これらは同一符号をストアとして

したがって、stdstが同じオブジェクトを参照します。

+1

すばらしい説明! –

0

オブジェクトへの参照を渡しています。

編集学生で

EditStudent.editStd(std); // In java It is a reference 
    // IN C++ You used to write '&' in your method(function) 
    but in Java it is not like that. Java doesn't have pointers --> either 

あなたが新しく追加されたので、私は唯一のプライベートフィールドのゲッターとセッターを使う//適切

public class Student { 
     // Make them PRIVATE 
private int id; 
private String name; 
private String marks; 

    // create constructor 
     Student(){} // empty 
     Student(int id, String name, Strings marks){ 
     this.id = id; 
     this.marks = marks; 
     this.name = name;} // overloaded, If you want 

クラスを作成する方法を教えてくれます。..パブリック

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getMarks() { 
    return marks; 
} 

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

}

オーバーロードコンストラクタ パブリッククラスTestProgram {

public static void main(String args[]){ 
    System.out.println("main"); 

/* Student std = new Student(); 
    std.setId(1); 
    std.setName("zeeshan"); 
    std.setMarks("44"); */ 

// benefit of overloaded constructor 
     Student s = new Student(1,"zeeshan", 44); 
     // you only need one line 

// EditStudent.editStd(std);  // Here you are passing the reference to your object to another class.. Which changes the original 

// If you want to edit student Make a method in Student class 
// I am following your logic 
    // create an empty student and pass it. 
    Student s2 = EditStudent.editStd( new Student()); 
      // return the student from editstd goto method it is below 
    System.out.println("id " +std.getId()); 
    System.out.println("name " +std.getName()); 
    System.out.println("marks " +std.getMarks()); 


} 

}

public class EditStudent { 

    public static Student editStd(Student st){ 
     // return type student 
     st.setId(10); 
     st.setName("editAbleName"); 
     st.setMarks("133"); 


     return st; 
    } 
+0

この素晴らしい説明のためのRohaitasありがとう! –

+0

ようこそ! – Rohaitas

関連する問題