1. Objekter

Alt i Java er et objekt.

Mere præcist er der meget få ting i Java, der ikke er objekter. For eksempel primitive typer. Men dette er en ret sjælden undtagelse fra reglen.

Så hvad er et objekt?

Et objekt er en enhed, der grupperer data sammen med metoder, der behandler dataene . Når vi siger "data", mener vi selvfølgelig variabler.

Et objekts variabler kaldes dets "data" eller "tilstand".

Et objekts metoder siges at være dets "adfærd". Det er sædvanligt kun at ændre et objekts tilstand (variabler) ved at bruge det pågældende objekts metoder. At ændre et objekts variabler direkte (ikke ved at bruge dets metoder) betragtes som dårlig form.

Hvert objekt såvel som enhver variabel har en type . Denne type bestemmes én gang, når objektet oprettes og kan ikke ændres i fremtiden. Et objekts type er dets klasse.

Hvert objekt har sin egen kopi af instansvariabler (felter). Hvis en ikke-statisk int en variabel er erklæret i en klasse, og dit program opretter 10 objekter af den klasse, så vil hvert objekt have sin egen int en variabel.

Interagere med et objekt

Den mest bekvemme måde at arbejde med et objekt på er at gemme en reference til det i en variabel og derefter kalde metoder på den variabel. Dette vil se bekendt ud for dig:

variable.method()

Hvor variableer en variabel, der gemmer en reference til et objekt, og methoder en metode i den klasse.

Hvis du vil henvise til et felt (variabel) af et objekt, skal du også bruge prikoperatoren :

variable.field

Hvor variableer en variabel, der gemmer en reference til et objekt, og fielder en instansvariabel (felt).


2. newoperatør

For at oprette et objekt af en bestemt klasse, skal du bruge operatoren new. Generelt ser det sådan ud at oprette et objekt:

Class variable = new Class(arguments);

Hvor Classer navnet på klassen for variablen variablesamt navnet på klassen for det objekt, der skal oprettes. Og variable er en variabel, der gemmer en reference til det oprettede objekt. Og argumentser en pladsholder for en kommasepareret liste over argumenter, der sendes til konstruktøren.

Den specifikke liste over argumenter, der kan godkendes, bestemmes af programmørerne, der skriver klassen.

Du har oprettet objekter før og endda brugt denne særlige konstruktion. Du har ikke glemt det, håber jeg?

Scanner console = new Scanner(System.in);
int x = console.nextInt();

Scanner console— dette skaber en consolevariabel, hvis type er Scanner. — dette skaber et nyt objekt. Og tildelingsoperatoren sætter variablen lig med en reference til det nyoprettede objekt.new Scanner(System.in)Scannerconsole

I anden linje kalder vi nextInt()metoden på objektet Scannerved hjælp af consolevariablen, som gemmer en reference til objektet Scanner.

Eksempler på oprettelse af objekter:

Kode Beskrivelse
String s = new String("Hello");
Opret et Stringobjekt
Scanner console = new Scanner("");
Opret et Scannerobjekt
int[] data = new int[10];
Opret en int[]: en beholder med 10 intelementer

De oprettede objekter kaldes objekter af klassen eller forekomster af klassen , mens klassen kaldes objektets klasse . For eksempel sgemmer variablen en reference til en forekomst af Stringklassen.



3. Introduktion af klasser

Jeg tror, ​​du allerede har set, hvor meget praktisk det er at bruge klasser skrevet af andre programmører. Men hvad med at skrive dine egne klasser?

Hvordan ved du, hvornår og hvor du har brug for din egen klasse, og hvordan man laver en?

Programmører opretter normalt deres egne klasser, når de ønsker at bringe en ny enhed ind i programmet. Lyder det forvirrende? Så vil jeg prøve at forklare, men jeg vil starte langt væk.

Gruppe af data

For at forenkle lidt kan vi sige, at et objekt i Java er en hukommelsesblok, der indeholder de variable, der er erklæret i en klasse (instansfelter). Eller, med andre ord, variable kombineret til en gruppe.

Lad os sige, at dit program skal gemme koordinaterne for 100punkter og har brug for en metode til at vise dem på skærmen. Dette kan gøres ved hjælp af arrays. For eksempel sådan her:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Color of (" + x[i] + ", " + y[i] + ") = " + color[i]);
   }

   public static void main(String[] args)
   {
     int[] x = new int[100];
     int[] y = new int[100];
     int[] color = new int[100];
     printPoints(x, y, color);
   }
}

Det ville være meget mere bekvemt, hvis vi havde en enkelt type til at gemme al information om et punkt: x, y, color. Hvis en sådan type ikke findes i Java, kan du oprette den selv.

For at gøre dette skriver vi kode til en Pointklasse:

public class Point
{
   public int x;
   public int y;
   public int color;
}

Nu kan ovenstående kode omskrives som:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Color of (" + points[i].x + ", " + point[i].y + ") = " + points[i].color);
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Lad os nu tilføje en metode til Pointklassen, der viser information om objektet:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Color of (" + x + ", " + y + ") = " + color);
   }
}

Nu Solutionser klassen sådan ud:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       points[i].print();
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Vi skjulte dygtigt punktets koordinater og farveoplysninger inde i Pointklassen sammen med metoden, der viser punktets tilstand.

Klasser er en måde at håndtere programkompleksitet på. Et stort program bliver mindre komplekst, når det er opdelt i mange små klasser.


4. Foranderlige vs uforanderlige objekter

Engang studerede vi konstanter i Java og kom til en konklusion, der ikke er særlig trøstende. Konstanter lader dig beskytte variabler mod at blive ændret, men de kan ikke forhindre ændringer af de objekter, som de refererer til.

For at løse dette problem kom Java med konstante objekter. Eller, som de oftere kaldes, uforanderlige objekter.

Forresten kender du allerede sådan en klasse, hvis objekter ikke kan ændres: String. Et Stringobjekt forbliver for evigt uændret, efter det er oprettet. Og hvordan opnåede Javas skabere dette?

For det første er alle variabler i Stringklassen skjult, dvs. erklæret private.

For det andet kan du ikke arve Stringklassen: dens klasseerklæring inkluderer finalmodifikatoren.

For det tredje, og mest interessant, ændrer alle klassens metoder String, som i teorien ville forvente at ændre det eksisterende objekt, det faktisk ikke, men returnerer i stedet et nyt.

For eksempel toUpperCase()gør metoden alle bogstaver i strengen med store bogstaver. Men i stedet for at ændre det objekt, som metoden kaldes på, returnerer den et nyt Stringobjekt bestående af store bogstaver:

String text = "This is a very important message";
String message = text.toUpperCase();

Dette er, hvad der vil være i hukommelsen efter udførelse af denne kode:

Foranderlige vs uforanderlige objekter

Så send gerne dine strenge til enhver metode: ingen vil ændre dem.