الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه أحمد عصام في 15 يوليو 2014 · 2 رد · 1,147 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عارف ان 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

تم تعديل هذه المشاركة بواسطة أحمد عصام في 15 يوليو 2014 في 08:33

#2

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 في 15 يوليو 2014 في 10:24

1
#3

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

انا كان قصدي ان نفس الفكرة بتحصل لما بتبعت 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 

تم تعديل هذه المشاركة بواسطة أحمد عصام في 15 يوليو 2014 في 13:54

مواضيع مشابهة