CodeGym /Blog Jawa /Acak /Nilai tetep ing Jawa: final, konstanta, lan ora bisa diga...
John Squirrels
tingkat
San Francisco

Nilai tetep ing Jawa: final, konstanta, lan ora bisa diganti

Diterbitake ing grup
Hi! Sampeyan wis kenal karo tembung "modifier". Paling ora, sampeyan wis nemoni modifikasi akses (umum, pribadi) lan modifier statis. Dina iki kita bakal ngrembug modifier khusus sing diarani final . Sampeyan bisa ujar bagean "semen" modifier pungkasan saka program kita sing mbutuhake prilaku sing tetep, ora ambigu, ora owah. Ana telung panggonan ing program sampeyan sing bisa digunakake: kelas, metode, lan variabel. Nilai tetep ing Jawa: final, konstanta, lan ora bisa diganti - 2 Ayo dadi mbukak liwat mau supaya. Yen modifier pungkasan digunakake ing deklarasi kelas, tegese kelas kasebut ora bisa diwarisake. Ing pawulangan sadurunge, kita nggunakake conto warisan sing prasaja: kita duwe Animalkelas induk lan rong kelas anak: CatlanDog

public class Animal {
}



public class Cat extends Animal {
   // Fields and methods of the Cat class
}


public class Dog extends Animal {

   // Fields and methods of the Dog class
}
Nanging, yen kita nggunakake modifier final ing Animalkelas, Catlan Dogkelas ora bisa oleh warisan.

public final class Animal {

}

public class Cat extends Animal {

   // Error! Cannot inherit from final Animal
}
Compiler langsung nggawe kesalahan. Ing Jawa, akeh kelas pungkasan sing wis ditindakake. Antarane sing kerep digunakake, Stringiku paling kondhang. Kajaba iku, yen kelas diumumake minangka final , kabeh metode kelas uga dadi final . Apa tegese? Yen cara diumumake nggunakake modifier pungkasan , sampeyan ora bisa ngilangi metode kasebut. Contone, ing kene kita duwe Animalkelas sing nyatakake speak()metode. Nanging, asu lan kucing mesthi "ngomong" kanthi cara sing beda. Dadi, kita bakal ngumumake cara ngomong () ing loro Catlan Dogkelas, nanging kita bakal ngetrapake kanthi beda.

public class Animal {
  
   public void speak() {
       System.out.println("Hello!");
   }
}

public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}
Kita nggawe Catlan Dogkelas ngilangi cara sing diumumake ing kelas induk. Saiki, kewan bakal ngomong kanthi beda, gumantung saka jinis obyek kasebut:

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       Dog dog = new Dog();
      
       cat.speak();
       dog.speak();
   }
}
Output: Meow! woof! Nanging, yen kita nyatakake metode Animalkelas speak()minangka final, mula kita ora bisa ngilangi ing kelas liyane:

public class Animal {

   public final void speak() {
       System.out.println("Hello!");
   }
}


public class Cat extends Animal {

   @Override
   public void speak() {// Error! A final method can't be overridden!
       System.out.println("Meow!");
   }
}
Lan obyek kita bakal dipeksa nggunakake speak()metode kaya sing ditegesake ing kelas induk:

public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   cat.speak();
   dog.speak();
}
Output: Hello! Hello! Saiki, babagan variabel pungkasan . Padha uga dikenal minangka konstanta . Pisanan (lan sing paling penting), nilai awal sing diwenehake menyang nilai konstan ora bisa diganti. Iku diutus sapisan lan kanggo kabeh.

public class Main {
  
   private static final int CONSTANT_EXAMPLE = 333;

   public static void main(String[] args) {

       CONSTANT_EXAMPLE = 999;// Error! You can't assign a new value to a final variable!
   }
}
Konstanta ora perlu diinisialisasi langsung. Sing bisa ditindakake mengko. Nanging, nilai wiwitane ditugasake bakal tetep padha ing salawas-lawase.

public static void main(String[] args) {

   final int CONSTANT_EXAMPLE;

   CONSTANT_EXAMPLE = 999;// This is allowed
}
Kapindho, cathet jeneng variabel kita. Jawa nduweni konvensi jeneng sing beda kanggo konstanta. Iku dudu notasi camelCase sing biasa . Yen wis dadi variabel biasa, kita bakal ngarani constantExample. Nanging, jeneng konstanta ditulis ing kabeh huruf kapital, kanthi garis ngisor ing antarane tembung (yen ana luwih saka siji tembung), contone "CONSTANT_EXAMPLE". Napa kita butuh konstanta? Iku banget migunani yen, contone, ana nilai tetep sing ajeg digunakake ing program. Contone, sampeyan wis mutusake nggawe sejarah lan nulis game "The Witcher 4" dhewe. Game kasebut kanthi temenan bakal nggunakake jeneng protagonis: "Geralt of Rivia". Senar iki (lan jeneng pahlawan liyane) paling diumumake minangka konstanta: regane bakal disimpen ing sak panggonan, lan sampeyan mesthi ora bakal salah ngetik nalika ngetik kaping yuta.

public class TheWitcher4 {

   private static final String GERALT_NAME = "Geralt of Rivia";
   private static final String YENNEFER_NAME = "Yennefer of Wengerberg";
   private static final String TRISS_NAME = "Triss Merigold";

   public static void main(String[] args) {

       System.out.println("The Witcher 4");
       System.out.println("It's already the fourth Witcher game, but " + GERALT_NAME + " still can't decide who" +
               " he likes more: " + YENNEFER_NAME + " or " + TRISS_NAME);

       System.out.println("But, if you've never played The Witcher before, we'll start from the beginning.");
       System.out.println("The protagonist's name is " + GERALT_NAME);
       System.out.println(GERALT_NAME + " is a witcher, a monster hunter");
   }
}
Output: The Witcher 4 Iki wis dadi game Witcher kaping papat, nanging Geralt saka Rivia isih ora bisa mutusake sapa sing luwih disenengi: Yennefer saka Wengerberg utawa Triss Merigold Nanging, yen sampeyan durung nate main The Witcher sadurunge, kita bakal miwiti saka wiwitan. Jeneng protagonis yaiku Geralt saka Rivia Geralt saka Rivia minangka penyihir, pamburu monster Kita wis nyatakake jeneng pahlawan minangka konstanta. Saiki kita mesthi ora bakal salah ketik, lan ora perlu nulis kanthi tangan saben wektu. Plus liyane: yen kita kudu ngganti nilai variabel ing kabeh program, sampeyan bisa nindakake ing sak panggonan, tinimbang ngowahi kanthi manual ing kabeh basis kode. :)

Jinis sing ora bisa diganti

Nalika sampeyan wis kerjo karo Jawa, sampeyan mbokmenawa wis nandang gerah karo idea sing programer wis meh lengkap kontrol ing negara kabeh obyek. Yen sampeyan pengin nggawe Catobyek, sampeyan bisa. Yen sampeyan pengin ngganti jeneng, sampeyan bisa. Yen sampeyan pengin ngganti umur utawa liya, sampeyan bisa. Nanging Jawa nduweni sawetara jinis data sing nduweni sifat khusus. Padha ora bisa diganti . Yen kelas ora bisa diganti, negara obyek kasebut ora bisa diganti. Pengin sawetara conto? Sampeyan bisa uga kaget, nanging kelas immutable sing paling kondhang yaiku String! Dadi, kita pancene ora bisa ngganti nilai String? Inggih, ayo nyoba:

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   str1 = "I love Python";// but changing str1 has no impact on str2
   System.out.println(str2);// str2 continues to point to the "I love Java" string, but str1 now points to a different object
}
Output: Aku tresna Jawa Aku tresna Jawa Sawise kita nulis

str1 = "I love Python";
obyek "I love Java"senar ora ngganti utawa menyang ngendi wae. Iki isih ana kanthi seneng lan nduweni teks sing padha karo sadurunge. Kode

str1 = "I love Python";
mung digawe obyek liyane, kang str1 saiki nuduhake. Nanging, kita ora bisa duwe efek apa wae ing obyek string "Aku tresna Jawa". Oke, ayo nyoba liyane! Kelas Stringkebak cara, lan sawetara wong katon kanggo ngganti negara obyek! Contone, ana replace()cara. Ayo ngganti tembung "Jawa" dadi "Python" ing string kita!

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   str1.replace("Java", "Python");// We try to change the state of str1 by swapping the word "Java" with "Python"
   System.out.println(str2);
}
Output: Aku tresna Jawa Aku tresna Jawa Ora bisa maneh! Mungkin cara ngganti ora bisa digunakake? Ayo dadi nyoba liyane. Contone, substring(). Iki ngasilake substring adhedhasar indeks karakter sing diterusake minangka argumen. Ayo dipotong 10 karakter pisanan saka string kita:

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   str1.substring(10);// Truncate the original String 
   System.out.println(str2);
}
Output: Aku tresna Jawa Aku tresna Jawa Nilai tetep ing Jawa: final, konstanta, lan ora bisa diganti - 3 Ora ana owah-owahan. Lan kudune ora. Kaya sing wis dingerteni sadurunge, String ora bisa diganti. Dadi, apa karo kabeh metode ing Stringkelas? Sawise kabeh, dheweke bisa ngethok senar, ngganti karakter, lan liya-liyane. Apa gunane yen ora ana apa-apa? Padha bener bisa nindakake iku! Nanging, dheweke ngasilake String anyar saben wektu. Ora ana gunane kanggo nulis

str1.replace("Java", "Python");
amarga sampeyan ora bisa ngganti obyek asli. Nanging, yen sampeyan nulis asil metode kasebut menyang variabel referensi anyar, sampeyan bakal langsung ndeleng bedane!

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   String str1AfterReplacement =  str1.replace("Java", "Python");
   System.out.println(str2);

   System.out.println(str1AfterReplacement);
}
Kabeh Stringcara bisa digunakake kanthi cara iki. Ora ana sing bisa ditindakake kanggo "I love Java"obyek kasebut. Sampeyan mung bisa nggawe obyek anyar lan nulis: "<objek anyar> = asil manipulasi "I love Java" object ". Apa jinis liyane sing ora bisa diganti? Sawetara sing sampeyan kudu eling langsung yaiku kabeh kelas bungkus kanggo jinis primitif. Integer, Byte, Character. Short_ Boolean_ Long_ Double_ Float_ immutable_ BigInteger_ BigDecimal_ _ _ , guess apa, java.lang.StackTraceElementobyek uga immutable. Iki nggawe akal: yen ana wong sing bisa ngganti data tumpukan kita, kabeh bakal dadi ora ana gunane. Mbayangno wong arep liwat tilak tumpukan lan ngganti OutOfMemoryError menyang FileNotFoundException . Banjur sampeyan nggunakake tumpukan kasebut kanggo nemokake sababe kesalahan kasebut. Nanging program ora malah nggunakake file. :) Dadi, padha nggawe obyek iki immutable, mung ing kasus. Oke, dadi luwih utawa kurang masuk akal kanggo StackTraceElement . Nanging, kenapa ana sing kudu nggawe String ora bisa diganti? Apa sebabe ngganti nilai-nilai kasebut dadi masalah? Mbokmenawa malah luwih trep. :/ Ana sawetara alasan kanggo iki. Kaping pisanan, nyimpen memori. Senar sing ora bisa diganti bisa diselehake ing blumbang senar, ngidini strings bisa digunakake maneh tinimbang nggawe anyar. Kapindho, kanggo keamanan. Contone, jeneng pangguna lan sandhi minangka String ing meh kabeh program. Nggawe bisa ngganti bisa nyebabake masalah wewenang. Ana alesan liyane, nanging sinau babagan basa Jawa durung ana, mula mengko mengko.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION