The JavaTM Tutorial

| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form

Trail: Learning the Java Language
Lesson: Object Basics and Simple Data Objects

## Creating Objects

> As you know, a class provides the blueprint for objects; you create an object from a class. Each of the following statements taken from the `CreateObjectDemo` program creates an object:

> >     Point origin_one = new Point(23, 94);
> >     Rectangle rect_one = new Rectangle(origin_one, 100, 200);
> >     Rectangle rect_two = new Rectangle(50, 100);

> The first line creates an object from the `Point` class and the second and third lines each create an object from the `Rectangle` class.

> Each statement has three parts:

> 1. Declaration: The code set in red in the previous listing are all variable declarations that associate a name with a type. When you create an object, you do not have to declare a variable to refer to it. However, a variable declaration often appears on the same line as the code to create an object.
> 2. Instantiation: `new` is a Java operator that creates the new object (allocates space for it).
> 3. Initialization: The `new` operator is followed by a call to a constructor. For example, `Point(23, 94)` is a call to `Point`'s only constructor. The constructor initializes the new object.
> The next three subsections discuss each of these actions in detail:
> - Declaring a Variable to Refer to an Object
> - Instantiating an Object
> - Initializing an Object

### Declaring a Variable to Refer to an Object

> From the Variables section in the previous lesson, you learned that to declare a variable, you write:

> >     type name

> This notifies the compiler that you will use name to refer to data whose type is type.

> In addition to the primitive types, such as `int` and `boolean`, provided directly by the Java platform, classes and interfaces are also types. So to declare a variable to refer to an object, you can use the name of a class or an interface, as the variable's type. The sample program uses both the `Point` and the `Rectangle` class names as types to declare variables.

> >     Point origin_one = new Point(23, 94);
> >     Rectangle rect_one = new Rectangle(origin_one, 100, 200);
> >     Rectangle rect_two = new Rectangle(50, 100);

> Declarations do not create new objects. The code `Point origin_one` does not create a new `Point object`; it just declares a variable, named `origin_one`, that will be used to refer to a `Point` object. The reference is empty until assigned, as illustrated in the next figure. An empty reference is known as a null reference.

> To create an object you must instantiate it with the `new` operator.

### Instantiating an Object

> The `new` operator instantiates a class by allocating memory for a new object. The `new`operator requires a single, postfix argument: a call to a constructor. The name of the constructor provides the name of the class to instantiate. The constructor initializes the new object.

> The `new` operator returns a reference to the object it created. Often, this reference is assigned to a variable of the appropriate type. If the reference is not assigned to a variable, the object is unreachable after the statement in which the `new` operator appears finishes executing.

> #### Initializing an Object

> Here's the code for the `Point` class:

> >     public class Point {
> >         public int x = 0;
> >         public int y = 0;
> >         //A constructor!
> >         public Point(int x, int y) {
> >             this.x = x;
> >             this.y = y;
> >         }
> >     }

> This class contains a single constructor. You can recognize a constructor because it has the same name as the class and has no return type. The constructor in the `Point` class takes two integer arguments, as declared by the code `(int x, int y)`. The following statement provides 23 and 94 as values for those arguments:

> >     Point origin_one = new Point(23, 94);

> The effect of the previous line of code can be illustrated in the next figure:

> Here's the code for the `Rectangle` class, which contains four constructors:

> >     public class Rectangle {
> >         public int width = 0;
> >         public int height = 0;
> >         public Point origin;

> >         //Four constructors
> >         public Rectangle() {
> >             origin = new Point(0, 0);
> >         }

> >         public Rectangle(Point p) {
> >             origin = p;
> >         }

> >         public Rectangle(int w, int h) {
> >             this(new Point(0, 0), w, h);
> >         }

> >         public Rectangle(Point p, int w, int h) {
> >             origin = p;
> >             width = w;
> >             height = h;
> >         }

> >         //A method for moving the rectangle
> >         public void move(int x, int y) {
> >             origin.x = x;
> >             origin.y = y;
> >         }

> >         //A method for computing the area of the rectangle
> >         public int area() {
> >             return width * height;
> >         }
> >     }

> Each constructor lets you provide initial values for different aspects of the rectangle: the origin; the width, and the height; all three; or none. If a class has multiple constructors, they all have the same name but a different number of arguments or different typed arguments. The Java platform differentiates the constructors, based on the number and the type of the arguments. When the Java platform encounters the following code, it knows to call the constructor in the `Rectangle` class that requires a Point argument followed by two integer arguments:

> >     Rectangle rect_one = new Rectangle(origin_one, 100, 200);

> This call initializes the rectangle's `origin` variable to the `Point` object referred to by `origin_one`. The code also sets `width` to 100 and `height` to 200. Now there are two references to the same `Point` object; an object can have multiple references to it, as shown in the next figure:

> Multiple references can refer to the same object. The following line of code calls the constructor that requires two integer arguments, which provide the initial values for `width` and `height`. If you inspect the code within the constructor, you will see that it creates a new `Point` object whose `x` and `y` values are initialized to 0:

> >     Rectangle rect_two = new Rectangle(50, 100);

> The `Rectangle` constructor used in the following statement doesn't take any arguments, so it's called a no-argument constructor:

> >     Rectangle rect = new Rectangle();

> If a class does not explicitly declare any constructors, the Java platform automatically provides a no-argument constructor, called the default constructor, that does nothing. Thus, all classes have at least one constructor.

This section talked about how to use a constructor. Providing Constructors for Your Classes explains how to write constructors for your classes.

| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form

Copyright 1995-2004 Sun Microsystems, Inc. All rights reserved.