Konstanta

"Amigo, tahukah Anda bahwa di Jawa tidak semua variabel dapat diubah?"

"Bagaimana, Kim? Memang, kata 'variabel' berbicara tentang perubahan."

"Tidak diragukan lagi. Seperti banyak bahasa pemrograman lainnya, Java memiliki konstanta , yaitu variabel yang nilainya tidak dapat diubah . Dan kata 'konstanta' berbicara tentang keteguhan."

"Dan untuk apa mereka?"

"Biasanya, mereka digunakan untuk beberapa hal mendasar seperti jumlah Piatau jumlah hari dalam bulan dalam setahun. Yang mengatakan, pada prinsipnya, seorang programmer dapat membuat variabel apa pun menjadi konstanta, jika dia memutuskan bahwa melakukan jadi perlu."

"Maksudmu seperti nama, warna mobil, atau nama hari dalam seminggu?"

"Kamu punya ide yang tepat. Apa pun yang tidak boleh diubah."

"Dan seperti apa konstanta ini di Jawa?"

"Java memiliki kata kunci khusus untuk mereka: final. Membuat variabel yang tidak dapat diubah terlihat sama dengan membuat variabel biasa. Satu-satunya perbedaan adalah sebelum tipe variabel Anda perlu menulis kata final, seperti ini:

final Type name = value;

"Apa yang terjadi jika Anda membuat sebuah konstanta dan kemudian mencoba memberikan nilai yang berbeda padanya?"

"Itu adalah pertanyaan yang tepat untuk ditanyakan! Dan jawaban yang tepat adalah ini: jika Anda mencoba untuk menetapkan nilai yang berbeda ke sebuah finalvariabel, maka program Anda tidak dapat dikompilasi."

"Bagaimana jika Anda mendeklarasikan finalvariabel tetapi tidak memberikan nilai padanya?"

"Tidak ada gunanya melakukan ini, jadi itu juga tidak diperbolehkan di Jawa. Sebuah finalvariabel harus diinisialisasi ketika dideklarasikan, yaitu, Anda harus memberikan nilai padanya. Ada satu pengecualian untuk aturan ini: Anda dapat memindahkan inisialisasi dari variabel kelas statis menjadi konstruktor, tetapi Anda akan mempelajarinya nanti.

"Yang mengatakan, tidak semua yang merupakan finalkonstanta. Untuk mengurangi jumlah kata kunci, pengembang Java menggunakan kata finaluntuk lebih dari sekedar mendeklarasikan konstanta. finaljuga dapat diterapkan pada metode dan bahkan kelas. Metode yang dideklarasikan sebagai finaltidak dapat diganti, dan sebuah kelas dinyatakan finaltidak dapat diwariskan.”

"Uh... Diganti? Diwariskan? Bahasa apa yang kamu gunakan sekarang?"

"Bahasa pemrograman berorientasi objek. Anda akan segera memahaminya. Sampai saat itu, nikmati saja terminologi yang indah."

"Oke. Jadi, finalbisa diletakkan sebelum variabel, kelas, dan metode, dan kata kunci ini membuat mereka tidak dapat diubah dalam arti tertentu?"

"Ya. Selanjutnya, finalpengubah dapat ditambahkan sebelum variabel apa pun: variabel lokal, parameter metode, bidang kelas, dan variabel kelas statis.

"Inilah hal penting untuk diingat: finalsebelum nama variabel hanyalah perlindungan terhadap perubahan apa pun pada variabel itu . Jika variabel menyimpan referensi ke suatu objek, maka objek tersebut masih dapat diubah."

"Aku tidak begitu mengerti."

"Kamu akan segera mengerti. Ini contohnya:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Kami membuat array.

Ini tidak diperbolehkan: variabel datadideklarasikan sebagai final.

Tapi Anda bisa melakukan ini.
Dan juga ini.

"Mengerti. Itu rumit."

konstanta global

"Menurutmu apa itu konstanta global?"

"Saya kira konstanta global mungkin seperti variabel global, hanya konstanta?"

"Tepat. Jika Anda perlu mendeklarasikan konstanta global dalam program Anda, buat variabel kelas statis , dan buatlah publicdan final. Ada gaya khusus untuk nama variabel tersebut: ditulis dengan huruf besar semua, dengan karakter garis bawah digunakan untuk kata-kata terpisah.

Contoh:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}

Bayangan variabel

"Seperti yang saya katakan sebelumnya, Anda tidak dapat membuat banyak variabel lokal dengan nama yang sama dalam satu metode. Dalam metode yang berbeda, Anda bisa."

"Saya tahu itu!"

"Tapi apa yang Anda mungkin tidak tahu adalah bahwa variabel dalam kelas dan variabel lokal dalam metode mungkin memiliki nama yang sama.

Contoh:

Kode Visibilitas variabel
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}

count, sum
count, sum
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

"Dalam addmetode, kami mendeklarasikan variabel lokal bernama sum. Sampai akhir metode, itu membayangi (atau menutupi ) sumvariabel instan."

"Hmm... menurutku ini adalah perilaku yang diharapkan."

“Tapi itu bukan akhir dari cerita. Ternyata jika sebuah variabel instan dibayangi oleh variabel lokal, masih ada cara untuk merujuk ke variabel instan di dalam metode. Kami melakukannya dengan menulis kata kunci sebelum thisnamanya :

this.name

"Inilah contoh di mana konflik nama berhasil diselesaikan:

Kode Visibilitas variabel
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}

this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

Variabel countand sumtersedia di mana saja dengan atau tanpa thiskata kunci. Pada baris di mana sumvariabel lokal membayangi sumvariabel instan, sumvariabel instan hanya dapat diakses menggunakan thiskata kunci.

"Jelas, aku harus berlatih ini."

"Kamu akan berhasil."

"Bagaimana jika variabel kelas statis dibayangi daripada hanya variabel instan (non-statis)? Anda tidak dapat mengaksesnya melalui this?"

"Benar. Kata kunci ini tidak akan berfungsi. Anda harus merujuknya melalui nama kelas:

ClassName.name

Contoh:

Kode Visibilitas variabel
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

"Perhatikan: Anda dapat mengakses dan countvariabel sumstatis di mana saja dengan atau tanpa menggunakan nama kelas Solutionsebagai awalan. Di baris di mana sumvariabel lokal membayangi sumvariabel instan, akses ke sumvariabel kelas hanya dimungkinkan bila digunakan Solutionsebagai awalan.

Variabel di dalam sebuah forloop

"Dan satu lagi fakta kecil tapi menarik. Ada juga tempat di mana variabel dideklarasikan dengan cara khusus — yang saya bicarakan di dalam loop for. " Biasanya, sebuah forloop memiliki countervariabel dalam tanda kurung. Dan apa yang akan menjadi visibilitas variabel ini? Lagi pula, itu tidak ada di dalam tubuh loop. Apakah ini seluruh metode? Atau tidak?"

"Saya sudah mendengar sesuatu tentang ini. Seperti yang saya pahami, variabel yang dideklarasikan di header loop forhanya terlihat di badan loop dan di header loop for. "

"Bagus, Amigo. Tapi tetap saja, lihat contoh untuk memperkuat bahan ini:

Kode Visibilitas variabel
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

"Jadi Anda mengatakan bahwa dalam kode saya, saya dapat menulis beberapa loop satu demi satu dengan variabel penghitung dengan nama yang sama, dan tidak akan ada masalah?"

"Tidak akan ada masalah. Ini, lihat:

Kode Visibilitas variabel
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i--)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a