• 0
أحمد عصام

Java pass by value of a reference ! (سؤال)

سؤال

عارف ان java مش pass by reference
بس ممكن حد يشرحلي الكود ده 

public class ClassA {	public static void main(String[] arg) {		ClassB aClass = new ClassB();		int[][] y = aClass.getX();		y[0][0] = 6;		System.out.println(aClass.getX()[0][0]);	}}class ClassB {	private int[][] x;	public ClassB() {		x = new int[2][2];		x[0][0] = 5;	}	public int[][] getX() {		return x;	}}

الناتج بيكون 6 ازاي ؟
سمعت اجابة ان java ب 
pass objects by value of reference 
وطبعا انا مش فاهم :D

تم تعديل بواسطه أحمد عصام
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 0

passing by reference تخص طريقة تمرير المتغيرات، ولايوجد تمرير متغير في مثالك.

 

في برنامجك هناك كائن وحيد new int[2][2] في الذاكرة وتعيد getX عنوانه (مرجع reference)، انظر لمعرف الكائن:

public class ClassA {    public static void main(String[] arg) {        ClassB aClass = new ClassB();        int[][] y = aClass.getX();    System.out.println(y.hashCode());        y[0][0] = 6;        System.out.println(aClass.getX()[0][0]);    }}class ClassB {    private int[][] x;    public ClassB() {        x = new int[2][2];        x[0][0] = 5;    System.out.println(x.hashCode());    }    public int[][] getX() {        return x;    }}
>java ClassA29194312 نفس الكائن291943126>

في العادة لايلاحظ المبتدئين هذا الشيء لأن القيم المعادة من الوظائف غالباً لأنواع أساسية primitive مثل int و double، وهذه تعاد بالقيمة (تستنسخ)، أو تكون كائنات فعلاً يعاد مرجعها، لكنها كائنات غير قابلة للتغير immutable مثل String، فأي تغير يجرى على الكائن ينتج عنه كائن جديد.

 

كما في المثال:

public class ClassA{    public static void main(String[] arg)  {    ClassB object = new ClassB();        String str = object.getStr();    System.out.println(str.hashCode());        str += "EFGH"; // كائن جديد سينتج    System.out.println(str.hashCode());        }}class ClassB{  private String str;  public ClassB()  {    str = "ABCD";    System.out.println(str.hashCode());  }   public String getStr()  {    return str;  }}
>java ClassA200198620019862042300548>

لكن في مثالك فالكائن مصفوفة قابلة للتغير mutable فأي تغيير تجريه عليها فأنت تعدل على نفس الكائن.

 

لتفادي مثل هذا التأثير (غالباً لايضر)، فيلزم نسخ الكائن سواء نسخ خفيف shallow copy للكائن نفسه (باستخدام clone)، أو نسخ شامل deep copy للكائن والكائنات التي يشير لها (جافا لاتوفر طريقة قياسية لعمل نسخ شامل).

تم تعديل بواسطه Mr.B
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا علي التوضيح :)

انا كان قصدي ان نفس الفكرة بتحصل لما بتبعت object
بس عندي سؤال تاني لو سمحت
ليه النسخ الخفيف clone مش بتشتغل مع ال two dimensional arrays وازاي اعمل لل array ديه deep  copy

 

public class ClassA {	public static void main(String[] args) {		ClassB aClass = new ClassB();		int x[][] = aClass.getY();		x[0][0] = 5;		aClass.printY();	}}class ClassB {	private int[][] y;	public ClassB() {		y = new int[2][1];		y[0][0] = 2;		y[1][0] = 4;	}	public int[][] getY() {		return y;	}	public void printY() {		System.out.println(y[0][0]);	}}

الناتج بيكون 5

// لقيت الحل شكرا جدا علي التوضيح
// ساويت كل قيمة من ال array الاصل لل array التانية عشان القيمة المفردة بتكون primitive 

تم تعديل بواسطه أحمد عصام
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .