An object is a class instance or an array.
The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.
A class instance is explicitly created by a class instance creation expression (§15.8), or by invoking the newInstance
method of class Class
(§20.3.8). An array is explicitly created by an array creation expression (§15.8).
A new class instance is implicitly created when the string concatenation operator + (§15.17.1) is used in an expression, resulting in a new object of type String
(§4.3.3, §20.12). A new array object is implicitly created when an array initializer expression (§10.6) is evaluated; this can occur when a class or interface is initialized (§12.4), when a new instance of a class is created (§15.8), or when a local variable declaration statement is executed (§14.3).
Many of these cases are illustrated in the following example:
class Point { int x, y; Point() { System.out.println("default"); } Point(int x, int y) { this.x = x; this.y = y; } // A Point instance is explicitly created at class initialization time: static Point origin = new Point(0,0); // A String can be implicitly created by a + operator: public String toString() {
return "(" + x + "," + y + ")";
} }
class Test { public static void main(String[] args) { // A Point is explicitly created using newInstance: Point p = null; try { p = (Point)Class.forName("Point").newInstance(); } catch (Exception e) { System.out.println(e); }
// An array is implicitly created by an array constructor: Point a[] = { new Point(0,0), new Point(1,1) };
// Strings are implicitly created by + operators: System.out.println("p: " + p); System.out.println("a: { " + a[0] + ", "
+ a[1] + " }");
// An array is explicitly created by an array creation expression: String sa[] = new String[2]; sa[0] = "he"; sa[1] = "llo"; System.out.println(sa[0] + sa[1]); } }
default p: (0,0) a: { (0,0), (1,1) } hello
The operators on references to objects are:
+
(§15.17.1), which, when given a String
operand and a reference, will convert the reference to a String
by invoking the toString
method (§20.1.2) of the referenced object (using "null"
if either the reference or the result of toString
is a null reference), and then will produce a newly created String
that is the concatenation of the two strings
instanceof
operator (§15.19.2)
==
and !=
(§15.20.3)
? :
(§15.24).
There may be many references to the same object. Most objects have state, stored in the fields of objects that are instances of classes or in the variables that are the components of an array object. If two variables contain references to the same object, the state of the object can be modified using one variable's reference to the object, and then the altered state can be observed through the reference in the other variable.
class Value { int val; }
class Test { public static void main(String[] args) { int i1 = 3; int i2 = i1; i2 = 4; System.out.print("i1==" + i1); System.out.println(" but i2==" + i2); Value v1 = new Value(); v1.val = 5; Value v2 = v1; v2.val = 6; System.out.print("v1.val==" + v1.val); System.out.println(" and v2.val==" + v2.val); } }
i1==3 but i2==4 v1.val==6 and v2.val==6
because v1.val
and v2.val
reference the same instance variable (§4.5.3) in the
one Value
object created by the only new
expression, while i1
and i2
are different variables.
See §10 and §15.9 for examples of the creation and use of arrays.
Each object has an associated lock (§17.13), which is used by synchronized
methods (§8.4.3) and the synchronized
statement (§14.17) to provide control over concurrent access to state by multiple threads (§17.12, §20.20).