Kursinnhold
Java Utvidet
Java Utvidet
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
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 erpublic
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
ogint 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 eksempelname
, 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
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
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
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
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å?
Takk for tilbakemeldingene dine!