1. Skapa ett objekt

Nåväl, vi har kommit fram till att skapa objekt. Du har redan stött på detta tidigare, men nu kommer vi att analysera det här ämnet mer i detalj. Det är faktiskt väldigt enkelt att skapa objekt.

För att skapa ett objekt måste du använda den nya operatorn. Att skapa ett objekt ser ungefär ut så här:

new Class(arguments)

Efter att ha skapat ett objekt sparar vi oftast omedelbart en referens till det i en variabel, som väldigt ofta delar samma typ som det skapade objektet. Det betyder att när du skapar ett objekt, ser du vanligtvis kod så här:

Class name = new Class(arguments)

Var är skapandet av en ny variabel, och koden till höger om likhetstecknet är skapandet av ett nytt objekt vars typ är .Class nameClass

Exempel:

Koda Notera
Object o = new Object();
Skapa ett Objectobjekt
Cat pet = new Cat();
Skapa ett Catobjekt
Scanner console = new Scanner(System.in)
Skapa ett Scannerobjekt

Programmerare namnger ofta variabler efter sina klasser, men med en liten bokstav. För en nybörjare kan sådan kod vara förvirrande:

Koda
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Det är inget fel med den här koden - det här är den vanligaste koden, där en variabel skapas och sedan omedelbart initieras av ett objekt av samma typ.

Till vänster om likhetstecknet har vi skapandet av en variabel. Till höger, skapandet av ett objekt. Det är allt.

2. Konstruktör

Du har säkert sett att vissa argument ofta skickas när du skapar ett objekt. Dessutom skickas argument för vissa objekt, men inte andra. Hur fungerar hela denna mekanism med argument?

Allt är enkelt här också: varje klass har en speciell metod (eller metoder) som är ansvariga för att hantera argument som skickas när ett objekt skapas. Dessa metoder kallas konstruktörer . Eller när vi bara pratar om en: konstruktören .

Att skilja en konstruktormetod från en vanlig metod är lätt. Denna metod har två utmärkande egenskaper:

  • namnet på en konstruktor är detsamma som namnet på dess klass (och börjar med en stor bokstav)
  • en konstruktor har ingen returtyp.

I allmänhet, så här ser det vanligtvis ut:

modifiers Class(arguments)
{
   Code
}

Exempel:

Koda Notera
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Pointklassklasskonstruktör




Point_
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Skapa ett objekt av Pointklassen. Klasskonstruktören kommer att anropas.

Lägg märke till hur konstruktorn ser ut: den har ingen returtyp och dess namn är detsamma som klassnamnet.

Och en sak till: ta en titt på koden inuti konstruktorn. Konstruktorns parametrar har samma namn som fälten i klassen: x och y. Det är standardpraxis att undvika att hitta på nya parameternamn. Namnen är desamma som för klassens fält. Namnkonflikten löses med detta nyckelord.

3. Anropa en konstruktör

När du använder den nya operatorn och ett kommando som "new Class ( arguments )" för att skapa ett nytt objekt händer två saker:

  • Java-maskinen skapar ett objekt vars typ är Klass
  • Java-maskinen anropar objektets konstruktor och skickar in dina argument

Som programmerare får du bestämma vilka konstruktörer din klass ska ha, och vilka parametrar dessa konstruktörer ska ha.

Anta att du bestämmer dig för att skapa en klass för att hålla reda på katter på ett djurhem. Då Catkan din klass se ut så här:

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);
Detta är tillåtet
Cat cat = new Cat("Whiskers");
Men detta är inte tillåtet. Denna kod kommer inte att kompileras.
Cat cat = new Cat();
Och detta är inte tillåtet. Den här koden kommer inte att kompileras.

Klassen Cathar bara en konstruktor med namn och åldersparametrar. Eftersom det inte finns några andra konstruktörer måste du skicka kattens namn ( name) och ålder ( age) som argument när du skapar ett objekt. Att skicka argument till konstruktorn är inte valfritt .

4. Flera konstruktörer

Men om du behöver kan du lägga till flera konstruktörer till klassen. Det finns ingen gräns för antalet konstruktörer eller deras parametrar. När du skapar ett objekt väljer kompilatorn automatiskt den konstruktor som matchar parametrarna

Koda Notera
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);
Detta är tillåtet: den första konstruktorn kommer att anropas
Cat cat = new Cat("Whiskers");
Detta är tillåtet: den andra konstruktören kommer att anropas
Cat cat = new Cat();
Men detta är inte tillåtet. Denna kod kommer inte att kompileras.

Vi bestämde oss för att ta hänsyn till det faktum att en katts ålder kanske inte är känd. För att hantera det här fallet lade vi till den speciella konstanten UNKNOWNtillsammans med en konstruktor som bara har en parameter - namnet på katten.

Observera att vi fortfarande initierar båda variablerna i båda konstruktörerna. Vi ersätter de okända/saknade parametrarna med konstanten UNKNOWN.

Om inget värde tilldelas åldersvariabeln kommer den att ha standardvärdet 0. Trots allt kan en kattunge som hittas på gatan vara 0 hela år. Det betyder att en nolla i åldersvariabeln inte nödvändigtvis betyder "okänd ålder".

5. Standardkonstruktör

Om du vill att dina objekt ska instansieras utan några parametrar, måste din klass deklarera en no-argument-konstruktor.

En konstruktor utan parametrar är inte nödvändigtvis en konstruktor utan kod. En sådan konstruktor kan innehålla kod som initierar variabler med startvärden:

Koda Notera
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);
Detta är tillåtet: den första konstruktorn kommer att anropas
Cat cat = new Cat();
Detta är tillåtet: den andra konstruktören kommer att anropas

Standardkonstruktör

Det finns en mycket viktig punkt som du bör känna till och komma ihåg.

Om din klass inte deklarerar en konstruktor kommer kompilatorn att lägga till en standardkonstruktor, som är en konstruktor utan argument med den offentliga modifieraren.

Men om din klass deklarerar ens en konstruktor , kommer ingen standardkonstruktor att läggas till och du måste lägga till den själv om du vill ha den.

Koda Notera
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Detta är tillåtet: standardkonstruktorn kommer att anropas