CodeGym /Java-blogg /Tilfeldig /Topp 50 jobbintervjuspørsmål og svar for Java Core. Del 1...
John Squirrels
Nivå
San Francisco

Topp 50 jobbintervjuspørsmål og svar for Java Core. Del 1

Publisert i gruppen
Hei alle sammen, mine damer og herrer, programvareingeniører! La oss snakke om intervjuspørsmål. Om hva du må forberede deg på og hva du trenger å vite. Dette er et flott tidspunkt for å gå gjennom eller studere disse punktene for første gang. Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 1 Jeg endte opp med en ganske omfattende samling av ofte stilte spørsmål om OOP, Java-syntaks, Java-unntak, samlinger og multithreading, som jeg vil dele opp i flere deler for enkelhets skyld. Det er vanskelig å dekke alt på en gang, men jeg håper dette materialet vil gi et godt grunnlag for de som forbereder seg på å finne sin første jobb som programmerer. For best mulig forståelse og oppbevaring, anbefaler jeg å gre gjennom andre kilder også. Du kan få et dypere grep om et konsept ved å nærme deg det fra flere forskjellige vinkler. Viktig:Vi skal kun snakke om Java før versjon 8. Alle innovasjoner som kom i versjon 9, 10, 11, 12 og 13 vil ikke bli vurdert her. Alle ideer/kommentarer om hvordan du kan forbedre svarene er velkomne . Nyt å lese. La oss gå!

Java-intervju: spørsmål om OOP

1. Hva kjennetegner Java?

Svar:
  1. OOP-konsepter:

    1. objektorientering
    2. arv
    3. innkapsling
    4. polymorfisme
    5. abstraksjon
  2. Cross-platform: Et Java-program kan kjøres på hvilken som helst plattform uten endringer. Dette krever selvfølgelig en installert JVM (virtuell Java-maskin).

  3. Høy ytelse: Just-In-Time (JIT) kompilatoren gjør høy ytelse mulig. JIT-kompilatoren konverterer bytekoden til maskinkode og deretter starter JVM kjøringen.

  4. Multithreading: JVM lager en utførelsestråd kalt main thread. En programmerer kan lage flere tråder ved å utlede fra Thread-klassen eller implementere grensesnittet Runnable.

2. Hva er arv?

Arv betyr at en klasse kan arve en annen klasse (ved å bruke nøkkelordet extends ). Dette betyr at du kan gjenbruke kode fra klassen du arver. Den eksisterende klassen er kjent som superclassog den nyopprettede klassen er subclass. Folk sier også bruke begrepene forelder og child.

public class Animal {
   private int age;
}

public class Dog extends Animal {

}
hvor Animaler parentog Doger child.

3. Hva er innkapsling?

Dette spørsmålet stilles ofte i intervjuer for Java-utviklerstillinger. Innkapsling skjuler implementeringen ved å bruke tilgangsmodifikatorer, gettere og settere. Dette gjøres for å hindre ekstern tilgang der utviklere mener det er nødvendig. Et enkelt eksempel fra det virkelige liv er bilen. Vi har ingen direkte tilgang til driften av motoren. Alt vi trenger å gjøre er å sette nøkkelen inn i tenningen og slå på motoren. Prosessene som foregår under panseret er ikke vår sak. Dessuten, hvis vi skulle blande oss inn i motorens aktivitet, kan det føre til en uforutsigbar situasjon, muligens skade bilen og føre til personskade. Nøyaktig det samme skjer i programmering. Dette er godt beskrevet på Wikipedia. Det er også en artikkel om innkapsling på CodeGym .

4. Hva er polymorfisme?

Polymorfisme er et programs evne til å behandle objekter med samme grensesnitt på samme måte, uten informasjon om objektets spesifikke type. Som det sies, "ett grensesnitt - mange implementeringer". Med polymorfisme kan du kombinere og bruke ulike typer objekter basert på delt atferd. For eksempel har vi en Dyreklasse som har to etterkommere: Hund og Katt. Den generiske dyreklassen har en oppførsel som deles av alle, evnen til å lage en lyd. Vi bruker polymorfe evner når vi skal samle alt som arver Animal-klassen og utføre «make sound»-metoden. Slik ser det ut:

List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
Med andre ord, polymorfisme er nyttig. Og dette gjelder også for polymorfe (overbelastede) metoder. Hvordan bruke polymorfisme

Intervjuspørsmål om Java-syntaks

5. Hva er en konstruktør i Java?

Konstruktører har følgende egenskaper:
  1. Når et nytt objekt er opprettet, bruker programmet riktig konstruktør for å lage det.
  2. En konstruktør er som en metode. Dens særtrekk ligger i det faktum at det ikke er noen returverdi (inkludert void) og at navnet er det samme som navnet på klassen.
  3. Hvis ingen konstruktør er opprettet eksplisitt, opprettes en tom konstruktør automatisk.
  4. En konstruktør kan overstyres.
  5. Hvis du erklærer en konstruktør med parametere, men også trenger en uten parametere, må du opprette den separat, siden den ikke blir opprettet automatisk.

6. Hvilke to klasser arver ikke Objekt?

Ikke la deg lure av lurespørsmål - det er ingen slike klasser. Alle klasser arver objektklassen enten direkte eller gjennom forfedre!

7. Hva er en lokal variabel?

Dette er et annet populært intervjuspørsmål for Java-utviklere. En lokal variabel er en variabel som er definert i en metode og eksisterer så lenge metoden kjøres. Så snart kjøringen avsluttes, slutter den lokale variabelen å eksistere. Her er et program som bruker en lokal variabel kalt helloMessage i main()-metoden:

public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. Hva er en forekomstvariabel?

En forekomstvariabel er en variabel som er deklarert inne i en klasse. Det eksisterer så lenge et objekt eksisterer. For eksempel har vi en Bee-klasse, som har to forekomstvariabler - nectarLoad og maxNectarLoad:

public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;
 
  ...
}

9. Hva er tilgangsmodifikatorer?

Tilgangsmodifikatorer er en mekanisme for å tilpasse tilgang til klasser, metoder og variabler. Følgende modifikatorer finnes, oppført i rekkefølge for å øke tilgangen:
  1. private— Denne tilgangsmodifikatoren brukes på metoder, felt og konstruktører. Tilgangen er begrenset til klassen de er deklarert i.
  2. package-private (default)— Dette er standard tilgangsnivå for klasser. Tilgang er begrenset til den spesifikke pakken der en klasse, metode, variabel eller konstruktør er deklarert.
  3. protected— Denne tilgangsmodifikatoren tilbyr samme tilgangsnivå som package-privatemed tillegg av tilgang for klasser som arver en klasse med modifikatoren protected.
  4. public— Dette tilgangsnivået brukes også for klasser. Dette tilgangsnivået betyr at det er full tilgang i hele applikasjonen.
Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 2

10. Hva er metodeoverstyring?

Vi overstyrer metoder når en barneklasse ønsker å endre oppførselen til foreldreklassen. Hvis vi også trenger å gjøre det som står i overordnet metode, kan vi bruke super.methodName() i barnet, som vil utføre den overordnede metoden. Vi kan legge til vår ekstra logikk etter det. Krav som må overholdes:
  • metodesignaturen må være den samme
  • returverdien må være den samme

11. Hva er metodesignaturer?

Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 3En metodesignatur er kombinasjonen av metodenavnet og argumentene metoden tar. Metodesignaturen er en metodes unike identifikator ved overbelastning av metoder.

12. Hva er metodeoverbelastning?

Metodeoverbelastning er et trekk ved polymorfisme der vi endrer metodesignaturen for å lage flere metoder som utfører samme handling:
  • samme navn
  • forskjellige argumenter
  • det kan være forskjellige returtyper
For eksempel kan ArrayListklassens add()metode bli overbelastet, slik at vi kan legge til på forskjellige måter avhengig av input-argumentene:
  • add(Object o)— Denne metoden legger rett og slett til et objekt
  • add(int index, Object o)— Denne metoden legger til et objekt ved en bestemt indeks
  • add(Collection<Object> c)— Denne metoden legger til en liste over objekter
  • add(int index, Collection<Object> c)— Denne metoden legger til en liste over objekter som starter fra en bestemt indeks.

13. Hva er et grensesnitt?

Java støtter ikke multippel arv. For å overvinne denne begrensningen ble grensesnitt lagt til i formen som vi kjenner og elsker ;) I lang tid hadde grensesnitt bare metoder uten noen implementering. I sammenheng med dette svaret, la oss snakke om dem. For eksempel:


public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
Noen detaljer følger av dette:
  • Alle metoder i et grensesnitt er offentlige og abstrakte
  • Alle variabler er offentlige statiske endelige
  • Klasser arver ikke grensesnitt (dvs. vi bruker ikke utvides nøkkelordet). I stedet implementerer klasser dem (dvs. vi bruker nøkkelordet implements). Dessuten kan du implementere så mange grensesnitt du vil.
  • Klasser som implementerer et grensesnitt må gi en implementering av alle metodene som er i grensesnittet.
Som dette:

public class Cat implements Animal {
   public void makeSound() {
       // Method implementation
   }

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. Hva er en standardmetode i et grensesnitt?

La oss nå snakke om standardmetoder. Hva er de for? Hvem er de for? Disse metodene ble lagt til for å tjene "begge hender". Hva snakker jeg om? Vel, på den ene siden var det behov for å legge til ny funksjonalitet: lambdas og Stream API. På den annen side var det nødvendig å beholde det Java er kjent for - bakoverkompatibilitet. For å gjøre dette trengte grensesnitt noen nye ferdige løsninger. Dette er hvordan standardmetoder kom til oss. En standardmetode er en implementert metode i et grensesnitt, merket med nøkkelordet default. For eksempel den velkjente stream()metoden i Collectiongrensesnittet. Tro meg, dette grensesnittet er ikke så enkelt som det ser ut til. Eller også den like kjente forEach()metoden iIterablegrensesnitt. Det eksisterte heller ikke før standardmetodene ble lagt til. Du kan forresten også lese om det på CodeGym her .

15. Hvordan arver vi da to identiske standardmetoder?

Det forrige svaret om hva en standardmetode er gir et annet spørsmål. Hvis du kan implementere metoder i grensesnitt, så kan du teoretisk implementere to grensesnitt med samme metode. Hvordan gjør vi det? Her er to forskjellige grensesnitt med samme metode:

interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
Og vi har en klasse som implementerer disse to grensesnittene. Men hvordan velger vi en spesifikk metode i grensesnitt A eller B? Følgende spesialkonstruksjon tillater dette: A.super.foo():

public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
Dermed fooA()vil metoden bruke standardmetoden foo()til grensesnittet A, mens fooB()metoden vil bruke foo()grensesnittets metode B.

16. Hva er abstrakte metoder og klasser?

I Java abstracter et reservert ord. Det brukes til å betegne abstrakte klasser og metoder. Først trenger vi definisjoner. En abstrakt metode er en metode som er deklarert ved å bruke abstractnøkkelordet uten implementering i en abstrakt klasse. Det vil si at dette er en metode som i et grensesnitt, men med tillegg av et nøkkelord, for eksempel:

public abstract void foo();
En abstrakt klasse er en klasse som også er merket med nøkkelordet abstract:

public abstract class A {

}
En abstrakt klasse har flere funksjoner:
  • du kan ikke lage et objekt av en abstrakt klasse
  • det kan ha abstrakte metoder
  • det kan heller ikke ha abstrakte metoder
Abstrakte klasser er nødvendig for abstraksjon (beklager tautologien) som har et sett med felles atferd og tilstander (det vil si metoder og variabler). Det virkelige liv er fullt av eksempler. Alt rundt oss. "Dyr", "Bil", "Geometrisk figur" og så videre.

17. Hva er forskjellen mellom String, StringBuilder og StringBuffer?

Stringverdier lagres i en konstant strengpool. Så snart en streng er opprettet, vises den i denne poolen. Og du kan ikke slette den. For eksempel:

String name = "book";
Variabelen vil peke til konstantstrengpoolen. Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 4Ved å sette navnvariabelen til en annen verdi, har vi:

name = "pen";
Den konstante strengpoolen ser slik ut: Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 5Med andre ord, begge verdiene forblir der. Stringbuffer:
  • Stringverdier lagres i en stabel. Hvis en verdi endres, vil den nye verdien erstatte den gamle.
  • String Bufferer synkronisert og er derfor trådsikker.
  • På grunn av trådsikkerheten er ytelsen dårlig.
Eksempel:

StringBuffer name = “book”;
Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 6Så snart verdien av navnevariabelen endres, endres verdien i stabelen: Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 7StringBuilder er nøyaktig den samme som StringBuffer, bare den er ikke trådsikker. Som et resultat er det merkbart raskere enn StringBuffer.

18. Hva er forskjellen mellom en abstrakt klasse og et grensesnitt?

Abstrakt klasse:
  • Abstrakte klasser har en standard konstruktør. Det kalles hver gang en etterkommer av den abstrakte klassen blir opprettet.
  • De kan inkludere både abstrakte metoder og ikke-abstrakte metoder. Generelt trenger ikke en abstrakt klasse å ha abstrakte metoder.
  • En klasse som arver en abstrakt må kun implementere abstrakte metoder.
  • En abstrakt klasse kan ha instansvariabler (se spørsmål #5).
Grensesnitt:
  • Et grensesnitt har ingen konstruktør og kan ikke initialiseres.
  • Bare abstrakte metoder kan legges til (unntatt standardmetoder).
  • Klasser som implementerer grensesnittet må implementere alle metoder (unntatt standardmetoder).
  • Grensesnitt kan bare ha konstanter.

19. Hvorfor er tilgang til et element i en matrise O(1)?

Dette spørsmålet ble bokstavelig talt stilt i mitt siste intervju. Som jeg lærte senere, er hensikten med dette spørsmålet å se hvordan en person tenker. Det er åpenbart liten praktisk verdi i denne kunnskapen. Bare å vite det er nok. Først må vi klargjøre at O(1) er notasjon for tidskompleksiteten til en "konstant tid"-algoritme. Med andre ord indikerer denne betegnelsen den raskeste utførelsestiden. For å svare på dette spørsmålet må vi vurdere hva vi vet om matriser. For å lage en intmatrise må vi skrive følgende:

int[] intArray = new int[100];
Flere konklusjoner kan trekkes fra denne syntaksen:
  1. Når en matrise er deklarert, er typen kjent. Hvis typen er kjent, er størrelsen på hver celle i matrisen kjent.
  2. Størrelsen på hele matrisen er kjent.
Det følger derfor at for å forstå hvilken celle vi skal skrive til, trenger vi bare å beregne hvilket område av minnet vi skal skrive til. For en datamaskin er dette enkelt. Datamaskinen vet hvor det tildelte minnet starter, antall elementer og størrelsen på hver celle. Alt dette betyr at stedet å skrive vil være lik startstedet til matrisen + størrelsen på hver celle multiplisert med indeksen.

Så hvordan kommer vi til O(1) når vi får tilgang til objekter i en ArrayList?

Dette spørsmålet følger umiddelbart etter det forrige. Sannheten er at når vi arbeider med en matrise som inneholder primitiver, vet vi på forhånd (på tidspunktet for opprettelsen) størrelsen på elementtypen. Men hva gjør vi hvis vi har denne typen arvehierarki og Topp 50 jobbintervjuspørsmål og svar for Java Core.  Del 1 - 8vi ønsker å lage en samling for elementer av type A og legge til forskjellige implementeringer (B, C og D):

List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
Hvordan beregner vi størrelsen på hver celle i denne situasjonen? Tross alt vil hvert objekt være forskjellig, muligens med forskjellige tilleggsfelt. Hva å gjøre? Her er spørsmålet stilt på en måte som er ment å forvirre deg. Vi vet at samlingen ikke direkte lagrer gjenstander. Den lagrer kun referanser til objekter. Og alle referanser har samme størrelse, og det er kjent. Som et resultat beregner vi adresser her på samme måte som i forrige spørsmål.

21. Autoboksing og unboxing

Historisk bakgrunn: autoboxing og unboxing er noen av hovedinnovasjonene i JDK 5. Autoboxing er prosessen med automatisk konvertering fra en primitiv type til en tilsvarende wrapper-klasse. Unboxing er det stikk motsatte av autoboxing. Det er prosessen med å konvertere en innpakningsklasse til en primitiv. Men hvis verdien av en wrapper er null, NullPointerExceptionvil a bli kastet under unboxing.

Primitiver og deres tilsvarende omslag

Primitiv Innpakningsklasse
boolsk boolsk
int Heltall
byte Byte
røye Karakter
flyte Flyte
lang Lang
kort Kort
dobbelt Dobbelt

// Autoboksing skjer:

  • når du tilordner en primitiv til en referanse til en innpakningsklasse:

    FØR Java 5:

    
    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
    
  • når en primitiv sendes som et argument til en metode som forventer en innpakning:

    
    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }
    

// Unboxing skjer:

  • når vi tilordner en forekomst av en wrapper-klasse til en primitiv variabel:

    
    // BEFORE Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    // And after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
    
  • Under aritmetiske operasjoner. Operasjonene gjelder bare for primitive typer, så unboxing til primitiver er nødvendig.

    
    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
          
    // In Java 5
    integerBox1 > integerBox2
    
  • når du sender en forekomst av en wrapper-klasse til en metode som tar den tilsvarende primitive:

    
    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }
    

22. Hva er det endelige nøkkelordet og hvor brukes det?

Nøkkelordet finalkan brukes på variabler, metoder og klasser.
  1. Verdien til en endelig variabel kan ikke endres etter at den er initialisert.
  2. En siste klasse er steril :) Den kan ikke få barn.
  3. En siste metode kan ikke overstyres av en etterkommer.
Vi har dekket ting på høyt nivå. La oss nå dykke dypere.

Endelige variabler

Java gir oss to måter å deklarere en variabel og tilordne en verdi til den:
  1. Du kan deklarere en variabel og initialisere den senere.
  2. Du kan deklarere en variabel og tilordne en verdi med en gang.
Her er et eksempel som viser disse bruken av sluttvariabler:

public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // The final FinalExample.FINAL_EXAMPLE_NAME field cannot be accessed
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // The final Config.creationTime field cannot be accessed
//    finalExample.creationTime = 1L;
   }
}

Kan en endelig variabel betraktes som en konstant?

Siden vi ikke kan tildele nye verdier til sluttvariabler, ser det ut til at dette er konstante variabler. Men bare ved første øyekast: Hvis variabelens datatype er immutable, ja, det er en konstant. Men hvis datatypen er mutable, det vil si endres, vil det være mulig å bruke metoder og variabler for å endre verdien til objektet som refereres til av en finalvariabel. På grunn av dette kan det ikke kalles en konstant. Følgende eksempel viser at noen endelige variabler virkelig er konstanter, mens andre ikke er det, siden de kan endres.

public class FinalExample {

   // Immutable final variables
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

Lokale sluttvariabler

Når en finalvariabel opprettes innenfor en metode, kalles den en local finalvariabel:

public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
Vi kan bruke det siste nøkkelordet i en forbedret for loop, fordi en ny variabel opprettes etter hver iterasjon av loopen. Husk at dette ikke gjelder for en normal for loop, så vi får en kompileringstidsfeil.

// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

Siste klasse

En klasse erklært som finalkan ikke utvides. Enkelt sagt, ingen annen klasse kan arve det. Et utmerket eksempel på en finalklasse i JDK er String. Det første trinnet for å lage en uforanderlig klasse er å merke den som final, og dermed forhindre at den utvides:

public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

Endelige metoder

Når en metode er merket som endelig, kalles den en endelig metode (gir mening, ikke sant?). En siste metode kan ikke overstyres i en barneklasse. Forresten, Object-klassens wait() og notify() metoder er endelige, så vi har ikke muligheten til å overstyre dem.

public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // Compilation error!
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

Hvordan og hvor du skal bruke finalen i Java

  • Bruk det siste nøkkelordet for å definere noen konstanter på klassenivå;
  • Lag endelige variabler for objekter du ikke vil skal endres. For eksempel objektspesifikke egenskaper som vi kan bruke til loggformål.
  • Hvis du ikke ønsker at en klasse skal utvides, merk den som endelig.
  • Hvis du trenger å lage en uforanderlig klasse, må du gjøre den endelig.
  • Hvis du vil at implementeringen av en metode ikke skal endres i dens etterkommere, merker du metoden som final. Dette er svært viktig for å være sikker på at implementeringen ikke endres.

23. Hva er foranderlige og uforanderlige typer?

Mulig

Foranderlige objekter er objekter hvis tilstand og variabler kan endres etter opprettelse. Eksempler på foranderlige klasser inkluderer StringBuilder og StringBuffer. Eksempel:

public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // This setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("First address");
       System.out.println(obj.getAddress());

       // We are updating the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

Uforanderlig

Uforanderlige objekter er objekter hvis tilstand og variabler ikke kan endres etter at objektet er opprettet. En flott nøkkel for et HashMap, synes du ikke? :) For eksempel streng, heltall, dobbel og så videre. Eksempel:

// We'll make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // We remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("Old address");
       System.out.println(obj.getAddress());

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
I neste del tar vi for oss spørsmål og svar om samlinger. Min profil på GitHub Topp 50 jobbintervjuspørsmål og svar for Java Core. Del 2
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION