لماذا يمكن تجاوز الثوابت النهائية في جافا؟ [java]


Answers

كنت إخفاء ذلك، انها ميزة "نطاق". في أي وقت كنت في نطاق أصغر، يمكنك إعادة تعريف جميع المتغيرات التي تريد والمتغيرات نطاق الخارجي سيكون "الظل"

بالمناسبة، يمكنك توسيع نطاقها مرة أخرى إذا أردت:

public class A implements I {
    public String KEY = "b";

    public String getKey() {
        String KEY = "c";
        return KEY;
    }
}

الآن كي سيعود "ج".

تحريرها لأن الأصلي امتص على إعادة القراءة.

Question

النظر في الواجهة التالية في جافا:

public interface I {
    public final String KEY = "a";
}

والطبقة التالية:

public class A implements I {
    public String KEY = "b";

    public String getKey() {
        return KEY;
    }
}

لماذا من الممكن أن تأتي الفئة (أ) على طول وتتجاوز الثبات النهائي للواجهة I؟

محاولة لنفسك:

A a = new A();
String s = a.getKey(); // returns "b"!!!



يجب عدم الوصول إلى ثابت الخاص بك بهذه الطريقة، استخدام إشارة ثابتة بدلا من ذلك:

I.KEY //returns "a"
B.KEY //returns "b"



يتم إرفاق الحقول والأساليب الثابتة إلى فئة / واجهة إعلانها (على الرغم من واجهات لا يمكن أن تعلن أساليب ثابتة لأنها فئات مجردة تماما التي تحتاج إلى تنفيذها).

لذلك، إذا كان لديك واجهة مع ثابت ثابت (فارتيب) (فارنام)، يتم إرفاق هذا المجال إلى تلك الواجهة.

إذا كان لديك فئة تنفيذ هذه الواجهة، تحويل خداع التحويل البرمجي (هذا.) فارنام في InterfaceName.varname. ولكن إذا أعاد فصلك تعريف اسم الحقل، فسيتم إرفاق ثابت جديد يدعى فارنام باسم صفك، ويعرف المترجم الآن ترجمة هذا (فارنام) إلى NewClass.varname. وينطبق الشيء نفسه على الأساليب: إذا كانت الفئة الجديدة لا إعادة تعريف الأسلوب، (هذا.) ميثودنام ترجم إلى SuperClass.methodName، وإلا، (هذا.) يتم ترجمة ميثودنام إلى CurrentClass.methodName.

هذا هو السبب في أنك سوف تواجه تحذير "x حقل / طريقة يجب الوصول إليها بطريقة ثابتة". المترجم يقول لك أنه على الرغم من أنه قد يستخدم خدعة، فإنه يفضل أن تستخدم ClassName.method / فيلدنام، لأنه أكثر وضوحا لأغراض القراءة.