Question: In java all methods are pass by value.But today i learnt that constructors are pass by reference.

```
// Attack the internals of a Period instance
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78);  // Modifies internals of p!

```

This works and is able to edit the private fields.

What is the reason of this decision? or am i missing something?

Answer: 
You've got that wrong:

> 
> In java all methods are pass by value.
> 
> 
> 

Instead: In Java all parameters are passed by value, even references are passed by value. 

You don't "pass objects", only references to objects. This is the same for methods and constructors.

So 

```
end.setYear(78);  // Modifies internals of p!

```

does not change the reference but only the object the reference points to.
You are dealing with only references,not objects.

The classic definition of pass by value.

*The value of a reference variable is an "address" in Java. When you pass a reference variable to a method, a new reference variable is placed on the stack and a copy of the passed reference variable's value is used to initialize the new local **reference varaible's value, just like any primitive type.***

**NOTE**: While you can think of the reference as a memory address, it's not. The underlying mechanism makes it act logically as if it were though.

**SHORT VERSION**: references are simple variables just like the other primitive types for purposes of passing arguments to methods. What you can do with them once passed is obviously different.