1. Създаване на обект

Е, стигнахме до създаването на обекти. Вече сте се сблъсквали с това преди, но сега ще анализираме тази тема по-подробно. Всъщност е много лесно да създавате обекти.

За да създадете обект, трябва да използвате оператора new . Създаването на обект изглежда приблизително така:

new Class(arguments)

След като създадем обект, най-често веднага записваме препратка към него в променлива, която много често споделя същия тип като създадения обект. Това означава, че когато създавате обект, обикновено виждате code като този:

Class name = new Class(arguments)

Къде е създаването на нова променлива, а codeът вдясно от знака за equalsство е създаването на нов обект, чийто тип е .Class nameClass

Примери:

Код Забележка
Object o = new Object();
Създайте Objectобект
Cat pet = new Cat();
Създайте Catобект
Scanner console = new Scanner(System.in)
Създайте Scannerобект

Програмистите често наричат ​​променливите след класовете си, но с малка буква. За начинаещ програмист такъв code може да бъде объркващ:

Код
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Няма нищо лошо в този code — това е най-обикновен code, в който се създава променлива и след това веднага се инициализира от обект от същия тип.

Вляво от знака за equalsство имаме създаването на променлива. Вдясно, създаването на обект. Това е.

2. Конструктор

Вероятно сте виждали, че някои аргументи често се предават при създаване на обект. Нещо повече, аргументите се подават за някои обекти, но не и за други. Как работи целият този механизъм с аргументите?

Тук също всичко е просто: всеки клас има специален метод (or методи), които отговарят за обработката на аргументите, предадени при създаването на обект. Тези методи се наричат ​​конструктори . Или когато говорим само за едно: конструкторът .

Разграничаването на метод на конструктор от обикновен метод е лесно. Този метод има две отличителни черти:

  • името на конструктора е същото като името на неговия клас (и започва с главна буква)
  • конструкторът няма тип връщане.

Най-общо ето How обикновено изглежда:

modifiers Class(arguments)
{
   Code
}

Пример:

Код Забележка
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Pointклас




Pointклас конструктор
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Създайте обект от Pointкласа. Ще бъде извикан конструкторът на класа.

Забележете How изглежда конструкторът: той няма тип връщане и името му е същото като името на класа.

И още нещо: погледнете codeа вътре в конструктора. Параметрите на конструктора имат същите имена като полетата на класа: x и y. Стандартна практика е да се избягва създаването на нови имена на параметри. Имената са същите като тези на полетата на класа. Конфликтът с имена се разрешава с помощта на ключовата дума this.

3. Извикване на конструктор

Когато използвате новия оператор и команда като "нов клас ( аргументи )", за да създадете нов обект, се случват две неща:

  • Java машината създава обект, чийто тип е Class
  • Java машината извиква конструктора на обекта и предава вашите аргументи

Като програмист вие трябва да решите Howви конструктори трябва да има вашият клас и Howви параметри трябва да имат тези конструктори.

Да предположим, че решите да създадете клас за следене на котки в приют за животни. Тогава вашият Catклас може да изглежда така:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
Това е разрешено
Cat cat = new Cat("Whiskers");
Но това не е позволено Този code няма да се компorра.
Cat cat = new Cat();
А това не е позволено. Този code няма да се компorра.

Класът Catима само един конструктор с параметри име и възраст. Тъй като няма други конструктори, трябва да подадете името на котката ( name) и възрастта ( age) като аргументи, когато създавате обект. Предаването на аргументи към конструктора не е задължително .

4. Множество конструктори

Но ако трябва, можете да добавите няколко конструктора към класа. Няма ограничение за броя на конструкторите и техните параметри. Когато създавате обект, компилаторът автоматично избира конструктора, който отговаря на параметрите

Код Забележка
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Това е позволено: първият конструктор ще бъде извикан
Cat cat = new Cat("Whiskers");
Това е позволено: ще бъде извикан вторият конструктор
Cat cat = new Cat();
Но това не е позволено Този code няма да се компorра.

Решихме да отчетем факта, че възрастта на котката може да не се знае. За да се справим с този случай, добавихме специалната константа UNKNOWNзаедно с конструктор, който има само един параметър - името на котката.

Имайте предвид, че ние все още инициализираме и двете променливи в двата конструктора. Заменяме неизвестните/липсващите параметри с константата UNKNOWN.

Ако не е присвоена стойност на променливата за възрастта, тогава тя ще има стойност по подразбиране 0. В крайна сметка, коте, намерено на улицата, може да е на 0 пълни години. Това означава, че нула във възрастовата променлива не означава непременно „неизвестна възраст“.

5. Конструктор по подразбиране

Ако искате вашите обекти да бъдат създадени без ниHowви параметри, вашият клас трябва да декларира конструктор без аргументи.

Конструктор без параметри не е непременно конструктор без code. Такъв конструктор може да съдържа code, който инициализира променливи с начални стойности:

Код Забележка
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Това е позволено: първият конструктор ще бъде извикан
Cat cat = new Cat();
Това е позволено: ще бъде извикан вторият конструктор

Конструктор по подразбиране

Има един много важен момент, който трябва да знаете и запомните.

Ако вашият клас не декларира нито един конструктор , компилаторът ще добави конструктор по подразбиране, който е конструктор без аргументи с публичен модификатор.

Но ако вашият клас декларира дори един конструктор , тогава няма да бъде добавен конструктор по подразбиране и ще трябва да го добавите сами, ако искате.

Код Забележка
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Това е позволено: ще бъде извикан конструкторът по подразбиране