*FIGURE 1. The basic structure of an array
Burada numbers
referans dəyişəndir, özündə primitiv tip yox obyekt saxlayır. Şəkildəki formada massiv yaratdıqda, massivin elementlərinə müvafiq tipin default dəyərləri mənimsədilir, yəni:
numbers[0] = 0; numbers[1] = 0; numbers[2] = 0;
Dəyərləri birbaşa həmin sətirdə də mənimsətmək mümkündür:
int[] numbers = new int[] {11, 22, 33};
və yaxud
int[] numbers = {11, 22, 33};
İkinci yanaşma anonim massiv (anonymous array) adlanır, çünki nə tip bildirilir, nə də ölçü. Əgər sol tərəfdə tip qeyd olunubsa, sağ tərəfdə yenidən qeyd etməyə ehtiyac yoxdu (redundant), Java artıq tipi bilir. Amma burada incə bir məqam var, ona xüsusi diqqət yetirmək lazımdır. Qeyd etdik ki, anonim massivdə tipi qeyd etməyə ehtiyac yoxdur, amma massivi elan edib dəyəri növbəti sətirdə mənimsətsək, o zaman kod xəta verəcəkdir. Bu zaman sağ tərəfdə massivin tipi mütləq qeyd olunmalıdır:
int[] numbers; numbers = {11, 22, 33}; // does not compile numbers = new int[3]{11, 22, 33}; // does not compile numbers = new int[]{11, 22, 33};
Bundan əlavə, əgər massivə elan olunduğu sətirdə dəyər mənimsədilməyibsə, instansı yaradılarkən mütləq ölçüsü qeyd edilməlidir, əks halda compile xətası verəcəkdir. Massivin ölçüsü mənfi ola bilməz.
int[] a = new int[]; // does not compile int[] b = new int[-5]; // throws NegativeArraySizeException
Düzgün qaydada elan olunmuş massiv formaları:
int[] arr1; int arr2[]; int[] names1, types1; // both array int names2[], types2; // names2 is array, types2 is int
İstənilən java tipini massivin tipi olaraq seçmək mümkündür.
String[] games = {"football", "volleyball", "handball"}; String[] sports = games; System.out.println(games.equals(sports)); // true System.out.println(games.toString()); // [Ljava.lang.String;@19e0bfd System.out.println(Arrays.toString(games)); // [football, volleyball, handball]
equals() metodu massivin elementlərinin dəyərinə baxmır, referansların eyni obyektə işarə edib etmədiyini yoxlayır.
int[] arr1 = {1, 2, 3}; int[] arr2 = {1, 2, 3}; int[] arr3 = arr1; System.out.println(arr1.equals(arr2)); // false System.out.println(arr1 == arr2); // false System.out.println(arr1.equals(arr3)); // true System.out.println(arr1 == arr3); // true
Böyük tipdən kiçik tipə cast edərkən ehtiyatlı olmaq lazımdı:
String[] strings = {"stringValue"}; Object[] objects = strings; String[] againStrings = (String[]) objects; againStrings[0] = new StringBuilder(); // does not compile objects[0] = new StringBuilder(); // does compile, but throw ArrayStoreException
Sub class tipində olan massivi super class tipində olan massivə mənimsətmək mümkündür, qısaca polimorfizm, casting qaydaları burada da keçərlidir. Bənzər nümunə ilə Enthuware test bankında rastlaşacaqsınız:
public class NewClass { public static void main(String[] args) { A[] a1, a2; B[] b; a1 = new A[10]; b = new B[5]; a2 = a1; a1 = b; // 1 b =(B[]) a1; // 2 b =(B[]) a2; // 3 } } class A { } class B extends A { }
Polimorfizm özəlliyinə görə line 1 compile olunur, kiçik (sub) tipi böyük (super) tipə mənimsədəndə aşkar cast tələb edilmir. Amma line 2 və line 3‘də line 1‘in tərsi baş verdiyindən aşkar cast tələb edilir, əks halda compile xətası verəcəkdir. Ümumiyyətlə, bu kodda compile xətası yoxdur, amma run etdikdə line 3 ClassCastException
fırladacaq. Line 2 isə exception fırlatmır, çünki a1
referansı B[]
tipində olan obyektə işarə edir. Əgər line 1 kommentə salınsa, o zaman line 2 də exception fırladacaq. Bu mövzular barədə növbəti fəsillərdə geniş məlumat veriləcək.
Bəzi oxucular bu mövzunu qarışdırır, ona görə də qeyd edək ki, massivlər ayrılıqda bir obyekt hesab edilir. Əgər siz int
tipində bir massiv yaradırsınızsa, int
primitiv tip olmasına baxmayaraq yekunda yaradılan massivdir və o bir obyektdir. Ona görə də int
tipində olan bir massivi Object
tipində olan bir referansa mənimsədə bilərik. Amma int
primitiv tip olduğundan int
tipində olan massivi Object
tipində olan massivə mənimsədə bilmərik, nümunədən daha aydın olacaq:
Object obj = new int[]{-1, 0, 1}; // is valid Object[] intArr = new int[7]; // is not valid Object[] integerArr = new Integer[7]; // is valid
Son olaraq bir məqamı da qeyd edək. Hamımız bilirik ki, bir java proqramının çalışması üçün istifadə olunan əsas metod public static void main(String[] args)
metodudur və bu metod String massiv tipində parametr qəbul edir. Sadəcə bilməniz gərəkdir ki, əgər main metoda parametr ötürülməyibsə, args
referansının dəyəri ölçüsü sıfır olan bir massiv olur, yəni null
olmur.
Aşağıdakı nümunə ilə də sizi çaşdıra bilərlər, diqqətli olun. Kodun qaydasında olub-olmadığını isə özünüz təxmin etməyə çalışın 🙂
public static void main(String[] a) { Integer arr[] = {1, 2, 3, 4}; arr[1] = null; for(Integer a: arr) System.out.println(a); }
[topics lang=az]