class Test {
String x= "hello";
}
// make an object
Test myTest = new Test();
Test = name of the class
myTest = object reference variable
Test() = contractor of test

Credit: screen shot from SlideNerd videos on youtube
myTest does not actually hold an object, it holds a REFERENCE to an abject, which is a memory location. The object itself is stored somewhere else – this is for efficiency of memory usage.
System.out.println(myTest);
will produce something like
Test@4u254por
4u254por is the memory location of the actual Test object.
If we say:
Test myTest = new Test();
Test yourTest = myTest;

Credit: screen shot from SlideNerd videos on youtube
we are saying yourTest points to the same memory address as myTest.
PRIMITIVE TYPES
int y=15;
y and 15 are in the same place in memory. This is because primitive types require little storage to the reference and the value are stored in the same place.

Credit: screen shot from SlideNerd videos on youtube
When you copy primitive types, the original and copy are independent values.
Take a look at the following:

Credit: screen shot from SlideNerd videos on youtube
Here Vivs gives a good example using objects. Unlike primitive types, with objects, if we use =, and then use a method to change the variable in one object, change(), both object yourTest and myTest contain the same value of x.
Here is a code example of this:
public class TestMain {
public static void main(String[] args) {
// primitive data types
int x=20;
int y=10;
System.out.println("x= "+x +" y= "+y);
x=y;
System.out.println("x= "+x +" y= "+y);
y=5;
System.out.println("x= "+x +" y= "+y);
// object references
Test myTest = new Test();
System.out.println("myTest= "+myTest.message);
Test anotherTest = new Test();
System.out.println("anotherTest= "+anotherTest.message);
Test copiedTest = myTest;
System.out.println("copiedTest= "+copiedTest.message);
copiedTest.change();
System.out.println("myTest= "+myTest.message);
System.out.println("anotherTest= "+anotherTest.message);
System.out.println("copiedTest= "+copiedTest.message);
}
}
class Test
{
String message="hello!";
public void change()
{
message="good bye";
}
}
Outputs:
x= 20 y= 10
x= 10 y= 10
x= 10 y= 5
myTest= hello!
anotherTest= hello!
copiedTest= hello!
myTest= good bye
anotherTest= hello!
copiedTest= good bye