sista och andra Java nyckelord - 1

"Hej, Amigo!"

"Hej, Bilaabo!"

"Idag ska jag berätta om flera nyckelord i Java. Men jag börjar med det mest intressanta: nyckelordet final. "

"Du kan använda nyckelordet final när du deklarerar en variabel, metod eller klass."

"Och varför behöver vi final?"

"Det är ganska enkelt. Om vi ​​markerar en variabel som final blir den oföränderlig:"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"Jag förstår."

"Om vi ​​markerar en metod som slutgiltig, är det förbjudet att åsidosätta metoden i härledda klasser:"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"Jag förstår. Men varför skulle du behöva förbjuda att åsidosätta en metod?"

"Tja, anta som ett exempel att en programmerare har skrivit mycket viktig kod i en metod och vill garantera att alla klasser som ärver hans klass kommer att ha det specificerade beteendet."

"Och slutligen den tredje användningen."

"Om vi ​​markerar en klass med nyckelordet final kan den inte ärvas."

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

"Och varför skulle vi förhindra att en klass går i arv?"

"Du bör förstå att vi inte förhindrar att arv är irriterande, utan snarare för säkerhetens och kodintegritetens skull. Om klassarv inte är förbjudet så är innebörden att det är tillåtet. Och att koden skriven av klassens designer kommer att fungera korrekt för objekt av den här klassen såväl som objekt av alla härledda klasser."

"Men om en utvecklare inser att även små förändringar i hans klass kommer att få allt att sluta fungera som förväntat, då är det bättre att förbjuda arv."

"Till exempel, klassen String deklareras som final, liksom alla primitiva typer: heltal, booleskt, dubbelt, tecken..."

"Ah, förstår. String-klassen skapades som en oföränderlig klass och om de plötsligt var föränderliga, så skulle många saker sluta fungera."

"Tja, nästan. Låt oss uttrycka det så här: allt skulle fungera nästan som förut, men ibland skulle det vara fel som skulle vara väldigt svåra att hitta och förstå. Så i vissa fall är det egentligen inte synd att ärva klasser eller metoder, men att förbjuda det innebär färre fel att fånga senare."

"Var annars kan du använda final?"

"Du kan använda final före funktionsparametrar och före variabler i en metod. Här är ett exempel:"

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

"Och vad är poängen med det?"

"Tja, det finns två. Först deklarerar vi en variabel som final om vi vill berätta för andra utvecklare att detta värde är en specifik konstant, och inte bara en variabel."

Till exempel vill vi beräkna momsen baserat på ett pris:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"Och för det andra behöver vi den här typen av variabel när vi skriver lokala eller anonyma inre klasser. Jag ska berätta om den här typen av klasser snart. Men inte idag."

"Okej, hittills har det inte varit något för komplicerat."

"Observera att endast variabeln blir oföränderlig, inte ett objekt den kan referera till. Objektet kan fortfarande ändras."

"Jag var faktiskt precis på väg att fråga om det. Och det finns inget sätt att göra objektet oföränderligt?"

"Nej, om du inte skriver en oföränderlig klass."

"Observera att eftersom värdet på en slutlig variabel inte kan ändras måste du tilldela dess initiala värde omedelbart."

Denna kod kommer att kompileras Den här koden kommer inte att kompileras
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"Men som sagt, Java låter dig fördröja initialiseringen av en klasss slutvariabler tills konstruktorn."

Denna kod kommer att kompileras Den här koden kommer inte att kompileras
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"Dessutom kan olika konstruktörer initiera slutvariabler med olika värden. Detta är ganska bekvämt:"

Denna kod kommer att kompileras
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"Det var ett riktigt intressant ämne, och absolut allt är vettigt. Tack, Bilaabo!"