Pemalar

"Amigo, adakah anda tahu bahawa di Java tidak semua pembolehubah boleh diubah?"

"Bagaimana itu, Kim? Sesungguhnya, perkataan 'pembolehubah' bercakap tentang perubahan."

"Tidak ada keraguan tentang itu. Seperti banyak bahasa pengaturcaraan lain, Java mempunyai pemalar , iaitu pembolehubah yang nilainya tidak boleh diubah . Dan perkataan 'malar' bercakap tentang kemakalan."

"Dan untuk apa mereka?"

"Biasanya, ia digunakan untuk beberapa jenis perkara asas seperti bilangan Piatau bilangan hari dalam bulan dalam setahun. Yang berkata, pada dasarnya, seorang pengaturcara boleh menjadikan sebarang pembolehubah sebagai pemalar, jika dia memutuskan untuk melakukan itu. begitu juga perlu."

"Maksud anda seperti nama, warna kereta, atau nama hari dalam seminggu?"

"Anda mendapat idea yang betul. Apa-apa sahaja yang tidak boleh diubah."

"Dan apakah rupa pemalar ini di Jawa?"

"Java mempunyai kata kunci khas untuk mereka: final. Mencipta pembolehubah tidak berubah kelihatan sama seperti mencipta yang biasa. Satu-satunya perbezaan ialah sebelum jenis pembolehubah anda perlu menulis perkataan final, seperti ini:

final Type name = value;

"Apakah yang berlaku jika anda mencipta pemalar dan kemudian cuba memberikan nilai yang berbeza kepadanya?"

"Itu soalan yang betul untuk ditanya! Dan jawapan yang betul ialah ini: jika anda cuba memberikan nilai yang berbeza kepada pembolehubah final, maka program anda tidak akan dikompil."

"Bagaimana jika anda mengisytiharkan finalpembolehubah tetapi tidak memberikan nilai kepadanya?"

"Tidak ada gunanya melakukan ini, jadi ia juga tidak dibenarkan di Java. Pembolehubah finalmesti dimulakan apabila ia diisytiharkan, iaitu, anda mesti menetapkan nilai kepadanya. Terdapat satu pengecualian kepada peraturan ini: anda boleh memindahkan permulaan bagi pembolehubah kelas statik menjadi pembina. Tetapi anda akan mengetahuinya kemudian.

"Yang berkata, bukan semua yang adalah finalpemalar. Untuk mengurangkan bilangan kata kunci, pembangun Java menggunakan perkataan itu finaluntuk lebih daripada sekadar mengisytiharkan pemalar. finaljuga boleh digunakan untuk kaedah dan juga kelas. Kaedah yang diisytiharkan sebagai finaltidak boleh ditindih, dan kelas diisytiharkan sebagai finaltidak boleh diwarisi."

"Eh... Ditindih? Diwarisi? Bahasa apa yang awak cakap sekarang?"

"Bahasa pengaturcaraan berorientasikan objek. Anda akan sampai ke sana tidak lama lagi. Sehingga itu, nikmati terminologi yang indah."

"Baiklah. Jadi, finalboleh diletakkan sebelum pembolehubah, kelas dan kaedah, dan kata kunci ini menjadikannya tidak boleh diubah dalam erti kata tertentu?"

"Ya. Tambahan pula, finalpengubah suai boleh ditambah sebelum sebarang pembolehubah: pembolehubah tempatan, parameter kaedah, medan kelas dan pembolehubah kelas statik.

"Inilah perkara penting yang perlu diingat: finalsebelum nama pembolehubah hanyalah perlindungan terhadap sebarang perubahan pada pembolehubah itu . Jika pembolehubah menyimpan rujukan kepada objek, maka objek itu masih boleh ditukar."

"Saya tidak begitu faham."

"Anda akan faham tidak lama lagi. Berikut ialah contoh:

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 tatasusunan.

Ini tidak dibenarkan: pembolehubah datadiisytiharkan sebagai final.

Tetapi anda boleh melakukan ini.
Dan juga ini.

"Faham. Itu rumit."

Pemalar global

"Pada pendapat anda, apakah pemalar global?"

"Saya rasa pemalar global mungkin seperti pembolehubah global, hanya pemalar?"

"Tepat sekali. Jika anda perlu mengisytiharkan pemalar global dalam program anda, cipta pembolehubah kelas statik dan jadikannya publicdan final. Terdapat gaya khas untuk nama pembolehubah tersebut: ia ditulis dalam semua huruf besar, dengan aksara garis bawah yang digunakan untuk perkataan berasingan.

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;
}

Membayangkan pembolehubah

"Seperti yang saya katakan sebelum ini, anda tidak boleh mencipta berbilang pembolehubah tempatan dengan nama yang sama dalam satu kaedah. Dalam kaedah yang berbeza, anda boleh."

"Saya tahu itu!"

"Tetapi apa yang anda mungkin tidak tahu ialah pembolehubah dalam kelas dan pembolehubah tempatan dalam kaedah mungkin mempunyai nama yang sama.

Contoh:

Kod Keterlihatan berubah-ubah
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 addkaedah tersebut, kami mengisytiharkan pembolehubah tempatan bernama sum. Sehingga penghujung kaedah, ia membayangi (atau menutup ) sumpembolehubah kejadian."

"Hmm... Saya akan katakan dalam erti kata tertentu ini adalah tingkah laku yang diharapkan."

"Tetapi itu bukan penghujung cerita. Ternyata jika pembolehubah contoh dibayangi oleh pembolehubah tempatan, masih ada cara untuk merujuk kepada pembolehubah contoh dalam kaedah. Kami melakukan ini dengan menulis kata kunci sebelum thisnamanya :

this.name

"Berikut ialah contoh di mana konflik nama berjaya diselesaikan:

Kod Keterlihatan berubah-ubah
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

Pembolehubah countdan sumtersedia di mana-mana dengan atau tanpa thiskata kunci. Pada baris di mana sumpembolehubah tempatan membayangi sumpembolehubah contoh, sumpembolehubah tika hanya boleh diakses menggunakan thiskata kunci.

"Jelas sekali, saya perlu berlatih ini."

"Anda akan uruskan."

"Bagaimana jika pembolehubah kelas statik dibayangi dan bukannya pembolehubah contoh (bukan statik) sahaja? Anda tidak boleh mengaksesnya melalui this?"

"Betul. Kata kunci ini tidak akan berfungsi. Anda perlu merujuknya melalui nama kelas:

ClassName.name

Contoh:

Kod Keterlihatan berubah-ubah
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

"Beri perhatian: anda boleh mengakses dan countpembolehubah sumstatik di mana-mana dengan atau tanpa menggunakan nama kelas Solutionsebagai awalan. Dalam baris tersebut di mana sumpembolehubah tempatan membayangi sumpembolehubah contoh, akses kepada sumpembolehubah kelas hanya boleh dilakukan apabila digunakan Solutionsebagai awalan.

Pembolehubah di dalam forgelung

"Dan satu lagi fakta kecil tetapi menarik. Terdapat juga tempat di mana pembolehubah diisytiharkan dengan cara yang istimewa — saya bercakap tentang di dalam gelung for. " Biasanya, forgelung mempunyai counterpembolehubah dalam kurungan. Dan apakah keterlihatan pembolehubah ini? Lagipun, ia bukan dalam badan gelung. Adakah kaedah keseluruhannya? Atau tidak?"

"Saya telah pun mendengar sesuatu tentang perkara ini. Seperti yang saya fahami, pembolehubah yang diisytiharkan dalam pengepala gelung forhanya kelihatan dalam badan gelung dan dalam pengepala gelung for. "

"Syabas, Amigo. Tetapi tetap, lihat contoh untuk menguatkan bahan ini:

Kod Keterlihatan berubah-ubah
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 bahawa dalam kod saya, saya boleh menulis beberapa gelung satu demi satu dengan pembolehubah kaunter dengan nama yang sama, dan tidak akan ada masalah?"

"Tidak akan ada masalah. Di sini, lihat:

Kod Keterlihatan berubah-ubah
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