CodeGym /مدونة جافا /Random-AR /دعونا نتحدث عن الكلمة الرئيسية النهائية في جافا
John Squirrels
مستوى
San Francisco

دعونا نتحدث عن الكلمة الرئيسية النهائية في جافا

نشرت في المجموعة
جافا لديها هذه الكلمة الأساسية - نهائية. يمكن تطبيقه على الفئات والأساليب والمتغيرات (بما في ذلك معلمات الطريقة). بالنسبة للفئة، الكلمة الأساسية النهائية تعني أن الفئة لا يمكن أن تحتوي على فئات فرعية، أي أن الوراثة ممنوعة... وهذا مفيد عند إنشاء كائنات غير قابلة للتغيير (غير قابلة للتغيير). على سبيل المثال، يتم تعريف فئة السلسلة على أنها نهائية.
public final class String {
}

class SubString extends String { // Compilation error
}
يجب أن أشير أيضًا إلى أنه لا يمكن تطبيق المعدل النهائي على الفئات المجردة (تلك التي تحتوي على الكلمة الأساسية الملخص)، لأن هذه مفاهيم متنافية. بالنسبة للطريقة النهائية، يعني المعدل أنه لا يمكن تجاوز الطريقة في الفئات الفرعية. وهذا مفيد عندما نريد منع تغيير التنفيذ الأصلي.
public class SuperClass {
    public final void printReport() {
        System.out.println("Report");
    }
}

class SubClass extends SuperClass {
    public void printReport() { //Compilation error
        System.out.println("MyReport");
    }
}
بالنسبة للمتغيرات من النوع البدائي، الكلمة الأساسية النهائية تعني أن القيمة، بمجرد تعيينها، لا يمكن تغييرها. بالنسبة للمتغيرات المرجعية، فهذا يعني أنه بعد تعيين كائن، لا يمكنك تغيير المرجع إلى ذلك الكائن. هذا مهم! لا يمكن تغيير المرجع، ولكن يمكن تغيير حالة الكائن. قدمت Java 8 مفهومًا جديدًا: نهائي فعليًا. ينطبق فقط على المتغيرات (بما في ذلك معلمات الطريقة). خلاصة القول هي أنه على الرغم من الغياب الواضح للكلمة الأساسية النهائية، فإن قيمة المتغير لا تتغير بعد التهيئة. بمعنى آخر، يمكن تطبيق الكلمة الأساسية النهائية على مثل هذا المتغير دون حدوث خطأ في الترجمة. يمكن استخدام المتغيرات النهائية بشكل فعال داخل الفئات المحلية (الفئات الداخلية المحلية)، والفئات المجهولة (الفئات الداخلية المجهولة)، والتدفقات (Stream API).
public void someMethod() {
    // In the example below, both a and b are effectively final, since they are assigned values only once:
    int a = 1;
    int b;
    if (a == 2) b = 3;
    else b = 4;
    // c is NOT effectively final since its value changes
    int c = 10;
    c++;

    Stream.of(1, 2).forEach(s-> System.out.println(s + a)); // OK
    Stream.of(1, 2).forEach(s-> System.out.println(s + c)); // Compilation error
}
الآن، دعونا نجري مقابلة صغيرة. بعد كل شيء، الهدف من إكمال دورة CodeGym هو أن تصبح مطور Java وأن تجد وظيفة مثيرة للاهتمام وذات أجر جيد. لذلك، دعونا نبدأ.
  1. ماذا يمكننا أن نقول عن المصفوفة التي تم إعلانها نهائية؟

  2. نحن نعلم أن فئة السلسلة غير قابلة للتغيير: تم إعلان الفئة نهائية. يتم تخزين قيمة السلسلة في مصفوفة char التي تم وضع علامة عليها بالكلمة الأساسية النهائية.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
هل يمكننا استبدال قيمة كائن السلسلة (دون تغيير المرجع إلى الكائن)؟ هذه أسئلة المقابلة الحقيقية. وتظهر الممارسة أن العديد من المرشحين لا يجيبون عليهم بشكل صحيح. من المهم جدًا فهم كيفية استخدام الكلمة الأساسية النهائية، خاصة بالنسبة للمتغيرات المرجعية. بينما تفكر في هذا، سأقدم طلبًا صغيرًا إلى فريق CodeGym. يرجى منح محرر النصوص القدرة على إضافة كتلة يمكن إظهار/إخفاء محتواها عند النقر عليها. الإجابات:
  1. المصفوفة عبارة عن كائن، لذا فإن الكلمة الأساسية النهائية تعني أنه بمجرد تعيين مرجع للمصفوفة، لا يمكن تغيير المرجع. ومع ذلك، يمكنك تغيير حالة الكائن.

    final int[] array = {1, 2, 3, 4, 5};
    array[0] = 9;	 // OK, because we're changing the contents of the array: {9, 2, 3, 4, 5}
    array = new int[5]; // Compilation error
  2. نعم نستطيع. الشيء الرئيسي هو فهم ما تعنيه الكلمة الرئيسية الشائكة عند استخدامها مع الكائنات. يمكن استخدام Reflection API لاستبدال القيم.

import java.lang.reflect.Field;

class B {
    public static void main(String[] args) throws Exception {
        String value = "Old value";
        System.out.println(value);

        // Get the String class's value field
        Field field = value.getClass().getDeclaredField("value");
        // Make it mutable
        field.setAccessible(true);
        // Set a new value
        field.set(value, "CodeGym".toCharArray());

        System.out.println(value);

        /* Output:
         * Old value
         * CodeGym
         */
    }
}
يرجى ملاحظة أنه إذا حاولنا تغيير المتغير النهائي لنوع بدائي بهذه الطريقة، فلن يحدث شيء. أقترح عليك أن تقنع نفسك: قم بإنشاء فئة Java، على سبيل المثال، باستخدام حقل int نهائي وحاول تغيير قيمته باستخدام Reflection API. حظا موفقا للجميع!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION