OCA Java imtahan mövzuları

Understanding Java Arrays

*FIGURE 1.  The basic structure of an array

array-in-java

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 2line 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]

 

 “OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808”, by J.Boyarsky & S.Selikoff

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.