CodeGym /Java blog /Tilfældig /Top 50 jobsamtale spørgsmål og svar til Java Core. Del 1
John Squirrels
Niveau
San Francisco

Top 50 jobsamtale spørgsmål og svar til Java Core. Del 1

Udgivet i gruppen
Hej alle sammen, mine damer og herrer, softwareingeniører! Lad os tale om interviewspørgsmål. Om hvad du skal forberede dig på, og hvad du skal vide. Dette er et godt tidspunkt at gennemgå eller studere disse punkter for første gang. Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 1 Jeg endte med en ret omfattende samling af ofte stillede spørgsmål om OOP, Java-syntaks, Java-undtagelser, samlinger og multithreading, som jeg vil opdele i flere dele for nemheds skyld. Det er svært at dække alt på én gang, men jeg håber, at dette materiale vil give et godt grundlag for dem, der forbereder sig på at finde deres første job som programmør. For den bedste forståelse og fastholdelse råder jeg til også at finde andre kilder. Du kan få et dybere greb om et koncept ved at gribe det an fra flere forskellige vinkler. Vigtig:Vi vil kun tale om Java før version 8. Alle innovationer, der kom i version 9, 10, 11, 12 og 13, vil ikke blive taget i betragtning her. Alle ideer/kommentarer til hvordan man kan forbedre svarene er velkomne . Nyd din læsning. Lad os gå!

Java-interview: spørgsmål om OOP

1. Hvad er kendetegnene ved Java?

Svar:
  1. OOP koncepter:

    1. objektorientering
    2. arv
    3. indkapsling
    4. polymorfi
    5. abstraktion
  2. Cross-platform: Et Java-program kan køres på enhver platform uden ændringer. Dette kræver selvfølgelig en installeret JVM (Java virtual machine).

  3. Høj ydeevne: Just-In-Time (JIT) compileren gør høj ydeevne mulig. JIT-kompileren konverterer bytekoden til maskinkode, og derefter starter JVM'en eksekvering.

  4. Multithreading: JVM'en opretter en udførelsestråd kaldet main thread. En programmør kan oprette flere tråde ved at udlede fra Thread-klassen eller implementere grænsefladen Runnable.

2. Hvad er arv?

Nedarvning betyder, at en klasse kan arve en anden klasse (ved at bruge nøgleordet extends ). Det betyder, at du kan genbruge kode fra den klasse, du arver. Den eksisterende klasse er kendt som superclassog den nyoprettede klasse er subclass. Folk siger også bruge udtrykkene forælder og child.

public class Animal {
   private int age;
}

public class Dog extends Animal {

}
hvor Animaler parentog Doger child.

3. Hvad er indkapsling?

Dette spørgsmål bliver ofte stillet i interviews til Java-udviklerstillinger. Indkapsling skjuler implementeringen ved at bruge adgangsmodifikatorer, gettere og sættere. Dette gøres for at forhindre ekstern adgang, hvor end udviklere mener, det er nødvendigt. Et simpelt eksempel fra det virkelige liv er bilen. Vi har ingen direkte adgang til driften af ​​motoren. Alt vi skal gøre er at sætte nøglen i tændingen og tænde for motoren. De processer, der foregår under emhætten, er ikke vores sag. Desuden, hvis vi skulle blande os i motorens aktivitet, kunne det føre til en uforudsigelig situation, muligvis beskadige bilen og resultere i legemsbeskadigelse. Præcis det samme sker i programmering. Dette er godt beskrevet på Wikipedia. Der er også en artikel om indkapsling på CodeGym .

4. Hvad er polymorfi?

Polymorfi er et programs evne til at behandle objekter med samme grænseflade på samme måde uden information om objektets specifikke type. Som man siger, "én grænseflade - mange implementeringer". Med polymorfi kan du kombinere og bruge forskellige typer objekter baseret på delt adfærd. For eksempel har vi en Dyreklasse, der har to efterkommere: Hund og Kat. Den generiske dyreklasse har en adfærd, der deles af alle, evnen til at give lyd. Vi bruger polymorfe evner, når vi skal samle alt, hvad der arver Animal-klassen, og udføre "gør lyd"-metoden. Sådan ser det ud:

List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
Med andre ord er polymorfi nyttig. Og det gælder også for polymorfe (overbelastede) metoder. Sådan bruges polymorfi

Interviewspørgsmål om Java-syntaks

5. Hvad er en konstruktør i Java?

Konstruktører har følgende egenskaber:
  1. Når et nyt objekt er oprettet, bruger programmet den relevante konstruktør til at oprette det.
  2. En konstruktør er som en metode. Dens karakteristiske træk ligger i, at der ikke er nogen returværdi (inklusive void), og at dens navn er det samme som navnet på klassen.
  3. Hvis der ikke er oprettet en konstruktør eksplicit, oprettes der automatisk en tom konstruktør.
  4. En konstruktør kan tilsidesættes.
  5. Hvis du erklærer en konstruktør med parametre, men også har brug for en uden parametre, skal du oprette den separat, da den ikke bliver oprettet automatisk.

6. Hvilke to klasser arver ikke Objekt?

Lad dig ikke narre af trickspørgsmål - der er ingen sådanne klasser. Alle klasser arver objektklassen enten direkte eller gennem forfædre!

7. Hvad er en lokal variabel?

Dette er et andet populært interviewspørgsmål for Java-udviklere. En lokal variabel er en variabel, der er defineret inde i en metode og eksisterer, så længe metoden udføres. Så snart eksekveringen slutter, ophører den lokale variabel med at eksistere. Her er et program, der bruger en lokal variabel ved navn helloMessage i main()-metoden:

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

8. Hvad er en instansvariabel?

En instansvariabel er en variabel, der er erklæret inde i en klasse. Det eksisterer, så længe et objekt eksisterer. For eksempel har vi en Bee-klasse, som har to instansvariabler - 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. Hvad er adgangsmodifikatorer?

Adgangsmodifikatorer er en mekanisme til at tilpasse adgang til klasser, metoder og variabler. Følgende modifikatorer findes i rækkefølge efter øget adgang:
  1. private— Denne adgangsmodifikator bruges på metoder, felter og konstruktører. Adgangen er begrænset til den klasse, hvor de er deklareret.
  2. package-private (default)— Dette er standardadgangsniveauet for klasser. Adgang er begrænset til den specifikke pakke, hvori en klasse, metode, variabel eller konstruktør er erklæret.
  3. protected— Denne adgangsmodifikator tilbyder det samme adgangsniveau som package-privatemed tilføjelsen af ​​adgang for klasser, der arver en klasse med protectedmodifikatoren.
  4. public— Dette adgangsniveau bruges også til klasser. Dette adgangsniveau betyder, at der er fuld adgang i hele applikationen.
Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 2

10. Hvad er metodeoverordnet?

Vi tilsidesætter metoder, når en børneklasse ønsker at ændre adfærden i sin forældreklasse. Hvis vi også skal gøre det, der er i den overordnede metode, kan vi bruge super.methodName() i barnet, som vil udføre den overordnede metode. Vi kan tilføje vores yderligere logik bagefter. Krav der skal overholdes:
  • metodesignaturen skal være den samme
  • returværdien skal være den samme

11. Hvad er metodesignaturer?

Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 3En metodesignatur er kombinationen af ​​metodenavnet og de argumenter metoden tager. Metodesignaturen er en metodes unikke identifikator ved overbelastning af metoder.

12. Hvad er metodeoverbelastning?

Metodeoverbelastning er et træk ved polymorfi, hvor vi ændrer metodesignaturen for at skabe flere metoder, der udfører den samme handling:
  • samme navn
  • forskellige argumenter
  • der kan være forskellige returtyper
For eksempel kan ArrayListklassens add()metode være overbelastet, hvilket giver os mulighed for at tilføje på forskellige måder afhængigt af input-argumenterne:
  • add(Object o)— Denne metode tilføjer simpelthen et objekt
  • add(int index, Object o)— Denne metode tilføjer et objekt til et bestemt indeks
  • add(Collection<Object> c)— Denne metode tilføjer en liste over objekter
  • add(int index, Collection<Object> c)— Denne metode tilføjer en liste over objekter, der starter fra et specifikt indeks.

13. Hvad er en grænseflade?

Java understøtter ikke multipel nedarvning. For at overvinde denne begrænsning blev der tilføjet grænseflader i den form, som vi kender og elsker ;) I lang tid havde grænseflader kun metoder uden nogen implementering. I forbindelse med dette svar, lad os tale om dem. For eksempel:


public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
Nogle detaljer følger heraf:
  • Alle metoder i en grænseflade er offentlige og abstrakte
  • Alle variabler er offentlige statiske endelige
  • Klasser arver ikke grænseflader (dvs. vi bruger ikke udvides nøgleordet). I stedet implementerer klasser dem (dvs. vi bruger nøgleordet implements). Desuden kan du implementere så mange grænseflader, som du vil.
  • Klasser, der implementerer en grænseflade, skal give en implementering af alle de metoder, der er i grænsefladen.
Sådan her:

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

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. Hvad er en standardmetode i en grænseflade?

Lad os nu tale om standardmetoder. Hvad er de til? Hvem er de til? Disse metoder blev tilføjet for at tjene "begge hænder". Hvad taler jeg om? Nå, på den ene side var der behov for at tilføje ny funktionalitet: lambdas og Stream API. På den anden side var det nødvendigt at bevare det, Java er berømt for - bagudkompatibilitet. For at gøre dette havde grænseflader brug for nogle nye færdige løsninger. Sådan kom standardmetoderne til os. En standardmetode er en implementeret metode i en grænseflade, markeret med nøgleordet default. For eksempel den velkendte stream()metode i Collectiongrænsefladen. Tro mig, denne grænseflade er ikke så enkel, som den ser ud til. Eller også den lige så berømte forEach()metode iIterableinterface. Det eksisterede heller ikke, før standardmetoderne blev tilføjet. Det kan du i øvrigt også læse om på CodeGym her .

15. Hvordan arver vi så to identiske standardmetoder?

Det tidligere svar om, hvad en standardmetode er, rejser et andet spørgsmål. Hvis du kan implementere metoder i grænseflader, så kan du teoretisk implementere to grænseflader med samme metode. Hvordan gør vi det? Her er to forskellige grænseflader 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, der implementerer disse to grænseflader. Men hvordan vælger vi en bestemt metode i grænseflade A eller B? Følgende specielle konstruktion tillader dette: A.super.foo():

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

   public void fooB() {
       B.super.foo();
   }
}
Metoden vil således fooA()bruge interfacets standardmetode foo(), Amens fooB()metoden vil bruge foo()interfacets metode B.

16. Hvad er abstrakte metoder og klasser?

I Java abstracter et reserveret ord. Det bruges til at betegne abstrakte klasser og metoder. For det første har vi brug for definitioner. En abstrakt metode er en metode, der er erklæret ved hjælp af nøgleordet abstractuden en implementering i en abstrakt klasse. Det vil sige, at dette er en metode som i en grænseflade, men med tilføjelse af et nøgleord, for eksempel:

public abstract void foo();
En abstrakt klasse er en klasse, der også er markeret med nøgleordet abstract:

public abstract class A {

}
En abstrakt klasse har flere funktioner:
  • du kan ikke oprette et objekt af en abstrakt klasse
  • det kan have abstrakte metoder
  • det kan heller ikke have abstrakte metoder
Abstrakte klasser er nødvendige for abstraktion (undskyld tautologien), der har et sæt fælles adfærd og tilstande (det vil sige metoder og variabler). Det virkelige liv er fyldt med eksempler. Alt omkring os. "Dyr", "Bil", "Geometrisk figur" og så videre.

17. Hvad er forskellen mellem String, StringBuilder og StringBuffer?

Stringværdier gemmes i en konstant strengpulje. Så snart en streng er oprettet, vises den i denne pulje. Og du kan ikke slette det. For eksempel:

String name = "book";
Variablen vil pege på den konstante strengpulje Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 4Ved at indstille navnevariablen til en anden værdi, har vi:

name = "pen";
Den konstante strengpulje ser således ud: Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 5Med andre ord forbliver begge værdier der. Stringbuffer:
  • Stringværdier gemmes i en stak. Hvis en værdi ændres, vil den nye værdi erstatte den gamle.
  • String Bufferer synkroniseret og er derfor trådsikker.
  • På grund af trådsikkerheden er dens ydeevne dårlig.
Eksempel:

StringBuffer name = “book”;
Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 6Så snart værdien af ​​navnevariablen ændres, ændres værdien i stakken: Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 7StringBuilder er nøjagtig den samme som StringBuffer, men den er ikke trådsikker. Som et resultat er det mærkbart hurtigere end StringBuffer.

18. Hvad er forskellen mellem en abstrakt klasse og en grænseflade?

Abstrakt klasse:
  • Abstrakte klasser har en standardkonstruktør. Det kaldes hver gang der skabes en efterkommer af den abstrakte klasse.
  • De kan omfatte både abstrakte metoder og ikke-abstrakte. Generelt behøver en abstrakt klasse ikke at have abstrakte metoder.
  • En klasse, der arver et abstrakt, skal kun implementere abstrakte metoder.
  • En abstrakt klasse kan have instansvariabler (se spørgsmål #5).
Interface:
  • En grænseflade har ingen konstruktør og kan ikke initialiseres.
  • Kun abstrakte metoder kan tilføjes (undtagen standardmetoder).
  • Klasser, der implementerer grænsefladen, skal implementere alle metoder (undtagen standardmetoder).
  • Grænseflader kan kun have konstanter.

19. Hvorfor er adgang til et element i et array O(1)?

Dette spørgsmål blev bogstaveligt talt stillet i mit sidste interview. Som jeg lærte senere, er formålet med dette spørgsmål at se, hvordan en person tænker. Det er klart, at der er ringe praktisk værdi i denne viden. Bare at vide det er nok. Først skal vi præcisere, at O(1) er notation for tidskompleksiteten af ​​en "konstant tid"-algoritme. Med andre ord angiver denne betegnelse den hurtigste udførelsestid. For at besvare dette spørgsmål skal vi overveje, hvad vi ved om arrays. For at oprette et intarray skal vi skrive følgende:

int[] intArray = new int[100];
Der kan drages flere konklusioner ud fra denne syntaks:
  1. Når en matrix erklæres, er dens type kendt. Hvis typen er kendt, er størrelsen af ​​hver celle i arrayet kendt.
  2. Størrelsen af ​​hele arrayet er kendt.
Det følger derfor, at for at forstå, hvilken celle vi skal skrive til, skal vi blot beregne, hvilket hukommelsesområde vi skal skrive til. For en computer er dette nemt. Computeren ved, hvor den tildelte hukommelse starter, antallet af elementer og størrelsen af ​​hver celle. Alt dette betyder, at stedet for at skrive vil være lig med startstedet for arrayet + størrelsen af ​​hver celle ganget med indekset.

Så hvordan kommer vi frem til O(1), når vi tilgår objekter i en ArrayList?

Dette spørgsmål følger umiddelbart efter det foregående. Sandheden er, at når vi arbejder med et array, der rummer primitiver, kender vi på forhånd (på tidspunktet for oprettelsen) størrelsen af ​​elementtypen. Men hvad gør vi, hvis vi har denne form for arvehierarki, og Top 50 jobsamtale spørgsmål og svar til Java Core.  Del 1 - 8vi vil oprette en samling for elementer af type A og tilføje forskellige 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 i denne situation størrelsen af ​​hver celle? Hvert objekt vil trods alt være forskelligt, muligvis med forskellige ekstra felter. Hvad skal man gøre? Her er spørgsmålet stillet på en måde, der er beregnet til at forvirre dig. Vi ved, at samlingen ikke direkte gemmer genstande. Den gemmer kun referencer til objekter. Og alle referencer har samme størrelse, og det er kendt. Som følge heraf beregner vi adresser her på samme måde som i det foregående spørgsmål.

21. Autoboxing og unboxing

Historisk baggrund: autoboxing og unboxing er nogle af de vigtigste nyskabelser i JDK 5. Autoboxing er processen med automatisk konvertering fra en primitiv type til en tilsvarende wrapper-klasse. Unboxing er det stik modsatte af autoboxing. Det er processen med at omdanne en indpakningsklasse til en primitiv. Men hvis værdien af ​​en indpakning er null, vil en NullPointerExceptionblive smidt under unboxing.

Primitiver og deres tilhørende indpakninger

Primitiv Indpakningsklasse
boolesk Boolean
int Heltal
byte Byte
char Karakter
flyde Flyde
lang Lang
kort Kort
dobbelt Dobbelt

// Autoboxing sker:

  • når du tildeler en primitiv til en reference til en indpakningsklasse:

    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 overføres som et argument til en metode, der forventer en indpakning:

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

// Unboxing sker:

  • når vi tildeler en forekomst af 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 operationer. Operationerne gælder kun 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 overfører en forekomst af en wrapper-klasse til en metode, der tager den tilsvarende primitive:

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

22. Hvad er det endelige søgeord, og hvor bruges det?

Nøgleordet finalkan bruges på variabler, metoder og klasser.
  1. Værdien af ​​en endelig variabel kan ikke ændres, efter at den er initialiseret.
  2. En sidste klasse er steril :) Den kan ikke få børn.
  3. En endelig metode kan ikke tilsidesættes af en efterkommer.
Vi har dækket ting på højt niveau. Lad os nu dykke dybere.

Endelige variabler

Java giver os to måder at erklære en variabel og tildele en værdi til den:
  1. Du kan erklære en variabel og initialisere den senere.
  2. Du kan erklære en variabel og tildele en værdi med det samme.
Her er et eksempel, der viser disse anvendelser af endelige variable:

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 betragtes som en konstant?

Da vi ikke kan tildele nye værdier til endelige variable, ser det ud til, at disse er konstante variable. Men kun ved første øjekast: Hvis variablens datatype er immutable, så er det en konstant. Men hvis datatypen er mutable, det vil sige kan ændres, så vil det være muligt at bruge metoder og variabler til at ændre værdien af ​​det objekt, der refereres til af en finalvariabel. På grund af dette kan det ikke kaldes en konstant. Det følgende eksempel viser, at nogle endelige variabler virkelig er konstanter, mens andre ikke er det, da de kan ændres.

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 slutvariabler

Når en finalvariabel oprettes inden for en metode, kaldes 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 bruge det endelige nøgleord i en forbedret for loop, fordi der oprettes en ny variabel efter hver iteration af loopet. Husk, at dette ikke gælder for en normal for-løkke, så vi får en kompileringsfejl.

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

Afsluttende klasse

En klasse, der er erklæret som, finalkan ikke forlænges. Sagt mere enkelt, ingen anden klasse kan arve det. Et glimrende eksempel på en finalklasse i JDK er String. Det første skridt til at oprette en uforanderlig klasse er at markere den som final, og dermed forhindre den i at blive udvidet:

public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

Endelige metoder

Når en metode er markeret som endelig, kaldes den en endelig metode (det giver mening, ikke?). En endelig metode kan ikke tilsidesættes i en børneklasse. I øvrigt er Object-klassens wait() og notify() metoder endelige, så vi har ikke mulighed for at tilsidesætte 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 man bruger final i Java

  • Brug det sidste nøgleord til at definere nogle konstanter på klasseniveau;
  • Opret endelige variabler for objekter, som du ikke ønsker skal ændres. For eksempel objektspecifikke egenskaber, som vi kan bruge til logningsformål.
  • Hvis du ikke ønsker, at en klasse skal forlænges, så marker den som endelig.
  • Hvis du har brug for at oprette en uforanderlig klasse, skal du gøre den endelig.
  • Hvis du ønsker, at en metodes implementering ikke ændrer sig i dens efterkommere, skal du markere metoden som final. Dette er meget vigtigt for at være sikker på, at implementeringen ikke ændrer sig.

23. Hvad er foranderlige og uforanderlige typer?

Foranderlig

Foranderlige objekter er objekter, hvis tilstand og variabler kan ændres efter oprettelse. 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 ændres, efter at objektet er oprettet. En fantastisk nøgle til et HashMap, synes du ikke? :) For eksempel, streng, heltal, dobbelt, 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 næste del overvejer vi spørgsmål og svar om samlinger. Min profil på GitHub Top 50 jobsamtale spørgsmål og svar til Java Core. Del 2
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION