لماذا يمكن أن يكون لدينا أعضاء نهائيون ثابتون ولكن لا يمكننا أن يكون لدينا طريقة ثابتة في فصل داخلي؟
-
21-09-2019 - |
سؤال
لماذا يمكن أن يكون لدينا أعضاء نهائيون ثابتون ولكن لا يمكننا أن يكون لدينا طريقة ثابتة في فئة داخلية غير ثابتة؟
هل يمكننا الوصول إلى متغيرات الأعضاء النهائية الثابتة للفئة الداخلية خارج الفصل الخارجي دون إنشاء فئة داخلية؟
المحلول
يمكنك الحصول على طريقة ثابتة في ثابتة الطبقة "الداخلية".
public class Outer {
static String world() {
return "world!";
}
static class Inner {
static String helloWorld() {
return "Hello " + Outer.world();
}
}
public static void main(String args[]) {
System.out.println(Outer.Inner.helloWorld());
// prints "Hello world!"
}
}
ومع ذلك ، أن تكون دقيقًا Inner
يطلق عليه فئة متداخلة وفقًا لمصطلحات JLS (8.1.3):
قد ترث الطبقات الداخلية أعضاء ثابتة لا يتم تجميع ثوابت الوقت على الرغم من أنهم قد لا يعلنونهم. قد تعلن الفصول المتداخلة التي ليست فصولًا داخلية الأعضاء الثابتة بحرية ، وفقًا للقواعد المعتادة للغة البرمجة Java.
أيضا ، هو ليس صحيح تمامًا أن الفئة الداخلية يمكن أن تحتوي static final
أفراد؛ لكي تكون أكثر دقة ، يجب أن تكون أيضًا ترجمة ثوابت الوقت. يوضح المثال التالي الفرق:
public class InnerStaticFinal {
class InnerWithConstant {
static final int n = 0;
// OKAY! Compile-time constant!
}
class InnerWithNotConstant {
static final Integer n = 0;
// DOESN'T COMPILE! Not a constant!
}
}
السبب في أن ثوابت الترجمة المسموح بها في هذا السياق واضح: فهي مضمنة في وقت الترجمة.