Spec-Zone .ru
спецификации, руководства, описания, API
|
Как Вы знаете, class обеспечивает проект объектов; Вы создаете объект из class. Каждый из следующих операторов, взятых от CreateObjectDemo
программа создает объект и присваивает его переменной:
Point originOne = new Point(23, 94); Rectangle rectOne = new Rectangle(originOne, 100, 200); Rectangle rectTwo = new Rectangle(50, 100);
Первая строка создает объект Point
class, и вторые и третьи строки каждый создает объект Rectangle
class.
У каждого из этих операторов есть три части (обсужденный подробно ниже):
Ранее, Вы узнали, что, чтобы объявить переменную, Вы пишете:
type name;
Это уведомляет компилятор, что Вы будете использовать имя, чтобы обратиться к данным, тип которых является типом. С примитивной переменной это объявление также резервирует надлежащий объем памяти для переменной.
Можно также объявить ссылочную переменную на ее собственной строке. Например:
Point originOne;
Если Вы объявляете originOne
как это, его значение будет неопределенным, пока объект не будет фактически создан и присваивается этому. Просто объявление ссылочной переменной не создает объект. Для этого Вы должны использовать new
оператор, как описано в следующем разделе. Следует присвоить объект originOne
прежде, чем Вы будете использовать это в своем коде. Иначе, Вы получите ошибку компилятора.
Переменная в этом состоянии, который в настоящий момент ссылки никакой объект, может быть иллюстрирована следующим образом (имя переменной, originOne
, плюс ссылка, не указывающая ни на что):
Оператор new инстанцирует class, выделяя память для нового объекта и возвращая ссылку на ту память. Оператор new также вызывает объектного конструктора.
Оператор new требует единственного, постфиксного параметра: звонок в конструктора. Имя конструктора обеспечивает имя class, чтобы инстанцировать.
Оператор new возвращает ссылку на объект, который она создала. Эта ссылка обычно присваивается переменной соответствующего типа, как:
Point originOne = new Point(23, 94);
Ссылка, возвращенная оператором new, не должна быть присвоена переменной. Это может также использоваться непосредственно в выражении. Например:
int height = new Rectangle().height;
Этот оператор будет обсужден в следующем разделе.
Вот является код для Point class:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; } }
Этот class содержит единственного конструктора. Можно распознать конструктора, потому что его объявление использует то же самое имя в качестве class, и у этого нет никакого типа возврата. Конструктор в Point class берет два целочисленных параметра, как объявлено кодом (int a, int b). Следующий оператор обеспечивает 23 и 94 как значения для тех параметров:
Point originOne = new Point(23, 94);
Результат выполнения этого оператора может быть иллюстрирован в следующем числе:
Вот является код для Rectangle class, который содержит четырех конструкторов:
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) { origin = new Point(0, 0); width = w; height = 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 getArea() { return width * height; } }
Каждый конструктор позволяет Вам обеспечивать начальные значения для размера прямоугольника и width, используя и типы примитивов и ссылочные типы. Если у class есть многократные конструкторы, у них должны быть различные подписи. Компилятор Java дифференцирует конструкторов, основанных на числе и типе параметров. Когда компилятор Java встречается со следующим кодом, он знает, чтобы вызвать конструктора в Rectangle class, который требует параметра Point, сопровождаемого двумя целочисленными параметрами:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Это вызывает один из Rectangle
's конструкторы, который инициализирует origin
к originOne
. Кроме того, наборы конструктора width
к 100 и height
к 200. Теперь есть две ссылки на тот же самый Point object — у объекта могут быть многократные ссылки на него, как показано в следующем числе:
Следующая строка кода вызывает Rectangle
конструктор, который требует двух целочисленных параметров, которые обеспечивают начальные значения для width и height. Если Вы осмотрите код в пределах конструктора, то Вы будете видеть, что он создает новый объект Point, x которого и значения y инициализируются к 0:
Rectangle rectTwo = new Rectangle(50, 100);
Конструктор Rectangle, используемый в следующем операторе, не берет параметров, таким образом, он вызвал конструктора без параметров:
Rectangle rect = new Rectangle();
У всех классов есть по крайней мере один конструктор. Если class явно не объявляет никого, компилятор Java автоматически предоставляет конструктору без параметров, названному конструктором по умолчанию. Этот конструктор по умолчанию вызывает конструктора родителя class без параметров, или Object
конструктор, если у class нет никакого другого родителя. Если у родителя нет никакого конструктора (Object
действительно имеет один), компилятор отклонит программу.