En guide til å lage objekter i Java

1. Oversikt

Enkelt sagt, før vi kan jobbe med et objekt på JVM, må det initialiseres.

I de følgende avsnittene tar vi en titt på forskjellige måter vi kan initialisere primitive typer og objekter på.

2. Erklæring vs. initialisering

La oss begynne med å sørge for at vi er på samme side.

Erklæring er prosessen med å definere variabelen sammen med type og navn.

Her erklærer vi id variabel:

int id;

Initialisering handler derimot om å tildele en verdi; for eksempel:

id = 1;

For å demonstrere lager vi en Bruker klasse med en Navn og id eiendommer:

offentlig klasse bruker {privat strengnavn; privat int id; // standard konstruktør, getters, setters,}

Deretter ser vi at initialisering fungerer annerledes, avhengig av typen felt vi initialiserer.

3. Objekter vs. primitiver

Java tilbyr to typer datarepresentasjon: primitive typer og referansetyper. I denne delen vil vi diskutere forskjellene mellom de to med hensyn til initialisering.

Java har åtte innebygde datatyper, referert til som Java primitive typer; variabler av denne typen holder sine verdier direkte.

Referansetyper inneholder referanser til objekter (forekomster av klasser). I motsetning til primitive typer som holder verdiene i minnet der variabelen er tildelt, har referanser ikke verdien av objektet de refererer til.

I stedet, en referanse peker på et objekt ved å lagre minneadressen der objektet er plassert.

Merk at Java ikke tillater oss å oppdage hva den fysiske minneadressen er. Snarere kan vi bare bruke referansen til å referere til objektet.

La oss se på et eksempel som erklærer og initialiserer en referansetype ut av vår Bruker klasse:

@Test offentlig ugyldig nårIntializedWithNew_thenInstanceIsNotNull () {Bruker bruker = ny bruker (); assertThat (bruker) .isNotNull (); }

Som vi kan se her, kan en referanse tildeles en ny ved å bruke nøkkelordet ny, som er ansvarlig for å skape det nye Bruker gjenstand.

La oss fortsette med å lære mer om oppretting av objekter.

5. Lage objekter

I motsetning til primitiver er oppretting av objekter litt mer kompleks. Dette er fordi vi ikke bare legger til verdien i feltet; i stedet utløser vi initialiseringen ved hjelp av ny nøkkelord. Dette til gjengjeld påkaller en konstruktør og initialiserer objektet i minnet.

La oss diskutere konstruktører og ny nøkkelord i nærmere detalj.

De ny nøkkelord er ansvarlig for å tildele minne til det nye objektet gjennom en konstruktør.

En konstruktør brukes vanligvis til å initialisere forekomstvariabler som representerer hovedegenskapene til det opprettede objektet.

Hvis vi ikke leverer en konstruktør eksplisitt, vil kompilatoren opprette en standardkonstruktør som ikke har noen argumenter og bare tildeler minne til objektet.

En klasse kan ha mange konstruktører så lenge parameterlistene deres er forskjellige (overbelastning). Hver konstruktør som ikke ringer til en annen konstruktør i samme klasse, har et kall til foreldrekonstruktøren om den ble skrevet eksplisitt eller satt inn av kompilatoren gjennom super().

La oss legge til en konstruktør til vår Bruker klasse:

public User (String name, int id) {this.name = name; this.id = id; }

Nå kan vi bruke konstruktøren vår til å lage en Bruker objekt med opprinnelige verdier for dets egenskaper:

Brukerbruker = ny bruker ("Alice", 1);

6. Variabelt omfang

I de følgende avsnittene tar vi en titt på de forskjellige typer omfang som en variabel i Java kan eksistere i, og hvordan dette påvirker initialiseringsprosessen.

6.1. Instans- og klassevariabler

Forekomst- og klassevariabler krever ikke at vi initialiserer dem. Så snart vi deklarerer disse variablene, får de en standardverdi som følger:

La oss nå prøve å definere noen forekomst- og klasserelaterte variabler og teste om de har en standardverdi eller ikke:

@Test offentlig ugyldig nårValuesAreNotInitialized_thenUserNameAndIdReturnDefault () {Bruker bruker = ny bruker (); assertThat (user.getName ()). erNull (); assertThat (user.getId () == 0); }

6.2. Lokale variabler

Lokale variabler må initialiseres før bruk, siden de ikke har en standardverdi, og kompilatoren ikke lar oss bruke en ikke-initialisert verdi.

Følgende kode genererer for eksempel en kompilatorfeil:

offentlig tomtrykk () {int i; System.out.println (i); }

7. Den Endelig Nøkkelord

De endelig nøkkelord brukt på et felt betyr at feltets verdi ikke lenger kan endres etter initialisering. På denne måten kan vi definere konstanter i Java.

La oss legge til en konstant i vår Bruker klasse:

privat statisk endelig int ÅR = 2000;

Konstanter må initialiseres enten når de er erklært eller i en konstruktør.

8. Initialiserer i Java

I Java, an initializer er en blokk med kode som ikke har noe tilknyttet navn eller datatype og plasseres utenfor en hvilken som helst metode, konstruktør eller annen blokk med kode.

Java tilbyr to typer initialiserere, statiske initialiserere og instansestartere. La oss se hvordan vi kan bruke hver av dem.

8.1. Instans initialisering

Vi kan bruke disse til å initialisere forekomstvariabler.

For å demonstrere, la oss gi en verdi for en bruker id bruker en forekomstinitialiser i vår Bruker klasse:

{id = 0; }

8.2. Statisk initialiseringsblokk

En statisk initialisering eller statisk blokk - er en blokk med kode som brukes til å initialisere statisk Enger. Det er med andre ord en enkel initialisering merket med nøkkelordet statisk:

privat statisk String forum; statisk {forum = "Java"; }

9. Initialiseringsrekkefølge

Når vi skriver kode som initialiserer forskjellige typer felt, må vi selvfølgelig holde øye med rekkefølgen på initialiseringen.

I Java er rekkefølgen for initialiseringsuttalelser som følger:

  • statiske variabler og statiske initialiserere i rekkefølge
  • forekomstvariabler og forekomstinitialiserere i rekkefølge
  • konstruktører

10. Objektets livssyklus

Nå som vi har lært å erklære og initialisere objekter, la oss oppdage hva som skjer med objekter når de ikke er i bruk.

I motsetning til andre språk der vi må bekymre oss for ødeleggelse av objekter, tar Java vare på foreldede objekter gjennom søppeloppsamleren.

Alle objekter i Java lagres i programmets heapminne. Faktisk representerer dyngen et stort utvalg av ubrukt minne, tildelt for Java-applikasjonen vår.

På den annen side, den søppeloppsamler er et Java-program som tar seg av automatisk minnehåndtering ved å slette objekter som ikke lenger er tilgjengelige.

For at et Java-objekt skal bli utilgjengelig, må det møte en av følgende situasjoner:

  • Objektet har ikke lenger noen referanser som peker mot det
  • All referanse som peker på objektet er utenfor omfanget

Avslutningsvis blir et objekt først opprettet fra en klasse, vanligvis ved hjelp av nøkkelordet ny. Så lever objektet sitt liv og gir oss tilgang til dets metoder og felt.

Til slutt, når det ikke lenger er behov for det, ødelegger søppeloppsamleren det.

11. Andre metoder for å lage objekter

I denne delen tar vi en kort titt på andre metoder enn ny nøkkelord for å lage objekter og hvordan du bruker dem, spesielt refleksjon, kloning og serialisering.

Refleksjon er en mekanisme vi kan bruke til å inspisere klasser, felt og metoder i løpetid. Her er et eksempel på å lage vår Bruker objekt ved hjelp av refleksjon:

@Test offentlig ugyldig nårInitializedWithReflection_thenInstanceIsNotNull () kaster unntak {User user = User.class.getConstructor (String.class, int.class) .newInstance ("Alice", 2); assertThat (bruker) .isNotNull (); }

I dette tilfellet bruker vi refleksjon for å finne og påkalle en konstruktør av Bruker klasse.

Den neste metoden, kloning, er en måte å lage en eksakt kopi av et objekt. For dette, vår Bruker klassen må implementere Klonbar grensesnitt:

public class User implementerer Cloneable {// ...}

Nå kan vi bruke klone () metode for å lage en ny klonet bruker objekt som har samme eiendomsverdier som bruker gjenstand:

@Test offentlig ugyldig nårCopiedWithClone_thenExactMatchIsCreated () kaster CloneNotSupportedException {User user = new User ("Alice", 3); User clonedUser = (User) user.clone (); assertThat (clonedUser) .isEqualTo (bruker); }

Vi kan også bruke sun.misc. usikre klasse for å tildele minne til et objekt uten å ringe en konstruktør:

Bruker u = (Bruker) unsafeInstance.allocateInstance (User.class);

12. Konklusjon

I denne opplæringen dekket vi initialisering av felt i Java. Vi oppdaget forskjellige datatyper i Java og hvordan vi bruker dem. Vi tok også en grundig beskrivelse av flere måter å lage objekter på Java.

Den fulle implementeringen av denne veiledningen finner du på Github.


$config[zx-auto] not found$config[zx-overlay] not found