Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Konstruktør | Klasser
Java Utvidet
course content

Kursinnhold

Java Utvidet

Java Utvidet

1. Dyp Java-struktur
2. Metoder
3. Avansert Streng
4. Klasser
5. Avanserte Klasser

book
Konstruktør

Hvordan forenkle initialisering av klasser?

Å initialisere hvert felt hver gang kan være tungvint. For slike formål har klasser konstruktører. Syntaksen for en konstruktør er som følger:

Main.java

Main.java

copy
1234
modifier ClassName(ParameterType parameter1, ParameterType parameter2) { this.parameter1 = parameter1; this.parameter2 = parameter2; }

La oss gå gjennom hvert ord som er skrevet her:

  • modifier: Dette refererer til tilgangsmodifikatoren, som ofte er public for konstruktører. Tilfeller der en konstruktør kan ha en annen tilgangsmodifikator, vil bli dekket i et eget kurs;
  • ClassName: Dette er rett og slett navnet på klassen der du oppretter denne konstruktøren;
  • ParameterType: Dette er typen parameter som skal brukes i konstruktøren. Det er viktig å være oppmerksom her fordi denne parameteren skal være samme type som feltet i klassen; For eksempel: Hvis klassen har to parametere, String name og int age, skal konstruktøren ha de samme parameterne (hvis vi ønsker å initialisere alle feltene gjennom konstruktøren). Hvis vi ønsker å initialisere kun et spesifikt klassefelt gjennom konstruktøren, for eksempel name, bør vi bruke kun én parameter med samme type og navn som feltet i klassen;
  • Deretter, inne i konstruktørens kropp, tildeler vi verdier til klassefeltene ved å bruke verdiene som sendes inn som parameter.

"this"-nøkkelordet

Ved hjelp av this-nøkkelordet kan vi referere til klassefeltet i klassen der vi skriver verdien til dette nøkkelordet. For eksempel, når vi har en klasse med to felt: name og age, kan vi skrive this.name inne i konstruktøren eller en metode, og det vil spesifikt referere til klassefeltet, ikke den lokale variabelen som sendes som parameter til konstruktøren eller metoden. På denne måten kan vi initialisere klassefelt gjennom konstruktøren ved å bruke syntaksen: this.name = name;.

Eksempel

La oss se på et eksempel på en konstruktør i en klasse som hjelper oss å initialisere alle feltene for å gjøre det tydeligere:

Person.java

Person.java

copy
1234567891011
class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } }

Vi har en klasse kalt Person med tre felt. Hvert av disse feltene har blitt lagt til konstruktøren ved hjelp av nøkkelordet this. Derfor initialiserer konstruktøren feltene med verdiene fra parameterne. La oss bruke denne konstruktøren i main-metoden slik at du kan se at feltene blir initialisert med det vi sender inn som parametere:

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); } }

Vi initialiserte Person-objektet bob ved å bruke konstruktøren ved å sende inn name, age og gender som parametere. Deretter skrev vi ut parameterne til skjermen og ser at objektet har feltverdier som angitt i konstruktørens parametere.

Konstruktøroverlasting

Konstruktøren kan også overlastes og trenger ikke å dekke initialisering av alle klassefeltene. For eksempel, hvis vi ikke ønsker å spesifisere kjønn for Alice, kan vi overbelaste konstruktøren til å akseptere kun 2 parametere og initialisere feltene med dem:

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); } }

Det kan konkluderes at en konstruktør, på lik linje med en metode, kan overbelastes og ta imot ulike antall og typer parametere.

Standardkonstruktør

En standardkonstruktør er en konstruktør som ikke tar noen parametere og initialiserer ingen felt. Den finnes i alle klasser som standard dersom de ikke har noen annen type konstruktør, og det er derfor den kalles standardkonstruktør. Hver gang vi oppretter et objekt av en klasse, bruker vi en konstruktør. For å kunne bruke standardkonstruktøren når vi allerede har en konstruktør som tar parametere, må vi også skrive en tom konstruktør:

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); Person john = new Person(); System.out.println("John's name: " + john.name + ", John's age: " + john.age); } }

Vi bruker tre forskjellige konstruktører for å initialisere hvert av Person-objektene. Som vi ser i det siste eksempelet, har John verken navn eller alder fordi disse feltene ikke er initialisert for objektet. Dermed kan vi overbelaste konstruktøren så mange ganger vi trenger og opprette objekter gjennom den.

1. Hvilke av følgende påstander om konstruktører er riktige?

2. Hva er formålet med en konstruktør i Java?

3. Hvilket av følgende kodeeksempler viser korrekt måte å lage en parameterisert konstruktør på?

question mark

Hvilke av følgende påstander om konstruktører er riktige?

Select the correct answer

question mark

Hva er formålet med en konstruktør i Java?

Select the correct answer

question mark

Hvilket av følgende kodeeksempler viser korrekt måte å lage en parameterisert konstruktør på?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 6

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

course content

Kursinnhold

Java Utvidet

Java Utvidet

1. Dyp Java-struktur
2. Metoder
3. Avansert Streng
4. Klasser
5. Avanserte Klasser

book
Konstruktør

Hvordan forenkle initialisering av klasser?

Å initialisere hvert felt hver gang kan være tungvint. For slike formål har klasser konstruktører. Syntaksen for en konstruktør er som følger:

Main.java

Main.java

copy
1234
modifier ClassName(ParameterType parameter1, ParameterType parameter2) { this.parameter1 = parameter1; this.parameter2 = parameter2; }

La oss gå gjennom hvert ord som er skrevet her:

  • modifier: Dette refererer til tilgangsmodifikatoren, som ofte er public for konstruktører. Tilfeller der en konstruktør kan ha en annen tilgangsmodifikator, vil bli dekket i et eget kurs;
  • ClassName: Dette er rett og slett navnet på klassen der du oppretter denne konstruktøren;
  • ParameterType: Dette er typen parameter som skal brukes i konstruktøren. Det er viktig å være oppmerksom her fordi denne parameteren skal være samme type som feltet i klassen; For eksempel: Hvis klassen har to parametere, String name og int age, skal konstruktøren ha de samme parameterne (hvis vi ønsker å initialisere alle feltene gjennom konstruktøren). Hvis vi ønsker å initialisere kun et spesifikt klassefelt gjennom konstruktøren, for eksempel name, bør vi bruke kun én parameter med samme type og navn som feltet i klassen;
  • Deretter, inne i konstruktørens kropp, tildeler vi verdier til klassefeltene ved å bruke verdiene som sendes inn som parameter.

"this"-nøkkelordet

Ved hjelp av this-nøkkelordet kan vi referere til klassefeltet i klassen der vi skriver verdien til dette nøkkelordet. For eksempel, når vi har en klasse med to felt: name og age, kan vi skrive this.name inne i konstruktøren eller en metode, og det vil spesifikt referere til klassefeltet, ikke den lokale variabelen som sendes som parameter til konstruktøren eller metoden. På denne måten kan vi initialisere klassefelt gjennom konstruktøren ved å bruke syntaksen: this.name = name;.

Eksempel

La oss se på et eksempel på en konstruktør i en klasse som hjelper oss å initialisere alle feltene for å gjøre det tydeligere:

Person.java

Person.java

copy
1234567891011
class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } }

Vi har en klasse kalt Person med tre felt. Hvert av disse feltene har blitt lagt til konstruktøren ved hjelp av nøkkelordet this. Derfor initialiserer konstruktøren feltene med verdiene fra parameterne. La oss bruke denne konstruktøren i main-metoden slik at du kan se at feltene blir initialisert med det vi sender inn som parametere:

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); } }

Vi initialiserte Person-objektet bob ved å bruke konstruktøren ved å sende inn name, age og gender som parametere. Deretter skrev vi ut parameterne til skjermen og ser at objektet har feltverdier som angitt i konstruktørens parametere.

Konstruktøroverlasting

Konstruktøren kan også overlastes og trenger ikke å dekke initialisering av alle klassefeltene. For eksempel, hvis vi ikke ønsker å spesifisere kjønn for Alice, kan vi overbelaste konstruktøren til å akseptere kun 2 parametere og initialisere feltene med dem:

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); } }

Det kan konkluderes at en konstruktør, på lik linje med en metode, kan overbelastes og ta imot ulike antall og typer parametere.

Standardkonstruktør

En standardkonstruktør er en konstruktør som ikke tar noen parametere og initialiserer ingen felt. Den finnes i alle klasser som standard dersom de ikke har noen annen type konstruktør, og det er derfor den kalles standardkonstruktør. Hver gang vi oppretter et objekt av en klasse, bruker vi en konstruktør. For å kunne bruke standardkonstruktøren når vi allerede har en konstruktør som tar parametere, må vi også skrive en tom konstruktør:

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); Person john = new Person(); System.out.println("John's name: " + john.name + ", John's age: " + john.age); } }

Vi bruker tre forskjellige konstruktører for å initialisere hvert av Person-objektene. Som vi ser i det siste eksempelet, har John verken navn eller alder fordi disse feltene ikke er initialisert for objektet. Dermed kan vi overbelaste konstruktøren så mange ganger vi trenger og opprette objekter gjennom den.

1. Hvilke av følgende påstander om konstruktører er riktige?

2. Hva er formålet med en konstruktør i Java?

3. Hvilket av følgende kodeeksempler viser korrekt måte å lage en parameterisert konstruktør på?

question mark

Hvilke av følgende påstander om konstruktører er riktige?

Select the correct answer

question mark

Hva er formålet med en konstruktør i Java?

Select the correct answer

question mark

Hvilket av følgende kodeeksempler viser korrekt måte å lage en parameterisert konstruktør på?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 6
some-alt