2014-01-24 3 views
0

Я искал образцы из тома I Core Java и разработал небольшой код.Объекты и переменная, проходящая в Java

import java.util.Date; 
import java.util.GregorianCalendar; 

class Test { 
    public static void main(String[] args) { 
     Employee[] staff = new Employee[3]; 
     staff[0] = new Employee("Tony Tester", 40000, 1990, 3, 15); 

    System.out.println("initial hireDay: " + staff[0].getHireDay()); 
    Date d = staff[0].getHireDay(); 
    double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000; 
    d.setTime(d.getTime() - (long) tenYearsInMilliSeconds); 
    System.out.println("d: " + d); 
    System.out.println("modified hireDay: " + staff[0].getHireDay()); 

    System.out.println("initial salary: " + staff[0].getSalary()); 
    int j = staff[0].getSalary(); 
    j += 10; 
    System.out.println("j: " + j); 
    System.out.println("modified salary: " + staff[0].getSalary()); 
} 
} 

class Employee { 
    private int salary; 
    private Date hireDay; 

public Employee(String n, int s, int year, int month, int day) { 
    salary = s; 
    GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); 
    hireDay = calendar.getTime(); 
} 

public int getSalary() { 
    return salary; 
} 

public Date getHireDay() { 
    return (Date) hireDay; 
} 
} 

Выход:

initial hireDay: Thu Mar 15 00:00:00 EST 1990 
d: Fri Mar 14 12:00:00 EST 1980 
modified hireDay: Fri Mar 14 12:00:00 EST 1980 
initial salary: 40000 
j: 40010 
modified salary: 40000 

В примере, конечное значение «» зарплаты не изменилась, а конечное значение «» hireDay изменилось. Как это произошло?? Это значит, что «зарплата» была передана по стоимости, когда «leaseDay» был передан по ссылке? Но потом я наткнулся на сообщение this, где упоминалось, что все прохождение в java по значению. Если да, то как может измениться значение «leaseDay»? Это связано с тем, что класс «Дата» изменен?

Заранее спасибо ...

+1

Возможный дубликат [Is Java «pass-by-reference»?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – vanza

+0

Вы забыли установить значение в Наемный рабочий ? Значение копируется, а не ссылка. или как @vanza - указанный дубликат – user1428716

ответ

1

Дата изменчива, вы получаете ссылку на объект даты и вызов SetTime на него. Таким образом, вы меняете вещь, на которую указывает объект Employee.

Зарплата - это примитивный int, поэтому, когда вы обращаетесь к нему с int j = staff[0].getSalary();, вы получаете примитивное значение, и когда вы меняете j, это не влияет на то, что имеет Работник.

+0

Означает ли это, что изменяемые объекты передаются по ссылке, а не по значению? – YoungSpice

+0

srk1990: ссылка передается по значению. Java передается по значению, ссылки - значения. Ссылка похожа на указатель на C. см. Ссылку vanza, предложенную как обман для этого. –

+0

Mutability не имеет к этому никакого отношения. – newacct

1

В этом примере окончательное значение «зарплата» не изменилось, когда окончательное значение «leaseDay» изменилось.

Технически значение hireDay не изменилось - напечатанное содержимое объекта, на который он указывает, имеет.

Как это происходит?

Вы сделали разные вещи к переменным, которые вы получили.

Вы назвали метод на объекте, на который указывает d: d.setTime(...);

Вы проводили задание (=) на j: j += 10; (который равен j = j + 10;)

Различные действия производят различные эффекты.

Это связано с тем, что класс «Дата» является изменяемым?

Не совсем. Если вы выполнили задание на d, например d = ...;, вы также увидите, что он не влияет на объект, на который указывает объект hireDay.

Смежные вопросы