نفس القاعدة
Java تستخدم Pass-by-Value مع Objects أيضًا. القيمة المنسوخة هنا هي Reference إلى الكائن، وليست نسخة من كل حقوله.
Object Arguments Are Passed by Value
Java تستخدم Pass-by-Value مع Objects أيضًا. القيمة المنسوخة هنا هي Reference إلى الكائن، وليست نسخة من كل حقوله.
عند doubleSalary(e1) يحصل Parameter e على نسخة من المرجع. يشير e وe1 إلى الكائن نفسه؛ لذلك e.setSalary(s * 2) تغيّر الكائن الذي تراه main.
تصحيح عنوان الشريحة 44: عنوان Call-by-Reference غير دقيق لوصف Java. المثال يوضح تعديل كائن عبر Reference منسوخ بالقيمة، ولا يعني أن متغير e1 نفسه مُرّر بالمرجع.
إذا أعدنا إسناد e داخل Method إلى new Employee، فسيتغير Parameter المحلي فقط. e1 في main يظل يشير إلى الكائن الأصلي. هذا البديل توضيح إضافي يبيّن الفرق، وليس كودًا من الشريحة.
public class TestEmployee {
public static void main(String[] args) {
Employee e1 = new Employee("Mohammed", 20, 5000);
e1.writeOutput();
doubleSalary(e1);
e1.writeOutput();
}
public static void doubleSalary(Employee e) {
double s = e.getSalary();
e.setSalary(s * 2);
}
}public class Employee {
private String name;
private int age;
private double salary;
public Employee(String n, int a, double s) {
name = n;
age = a;
salary = s;
}
public String getName() { return name; }
public void setName(String n) { name = n; }
public double getSalary() { return salary; }
public void setSalary(double s) { salary = s; }
public void writeOutput() {
System.out.println("Name: " + name + " Age: " + age + " Salary: " + salary);
}
}فرّق بين تعديل الكائن الذي يشير إليه e، وتغيير e نفسه ليشير إلى كائن آخر. الأولى تظهر عبر e1، والثانية لا تغيّر مرجع e1.
غيّر الراتب، ثم بدّل جسم Method بين تعديل الكائن وإعادة إسناد e. قارن Before/After وملف TestEmployee.java.
محاكاة لهذا المثال المحدد، وليست تشغيلًا لكود Java عشوائي.