ماذا يعني بالضبط "ثابت" عند إعلان المتغيرات "العالمية" في جافا؟

StackOverflow https://stackoverflow.com/questions/3415781

سؤال

لقد واجهت هذه المشكلة عدة مرات ولم أزعجني أبدًا معرفة سبب حدوثها ومعرفة معنى "الثابت" بالفعل. لقد قمت بتطبيق التغيير الذي اقترحه Eclipse وانتقلت.

public class Member {

 // Global Variables
 int iNumVertices;
 int iNumEdges;

 public static void main(String[] args) {

  // do stuff

  iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

  // do more stuff

 } // main end 
}

لذلك يخبرني Eclipse أن أفعل static int iNumVertices; ولست متأكدًا من السبب. إذن ما هو بالضبط "ثابت" ، كيف يتم استخدامه ، ما هو الغرض من استخدام "ثابت" ، ولماذا يعطيني هذه المشكلة؟

هل كانت مفيدة؟

المحلول

هذا مثالك:

public class Member {

    // Global Variables
    int iNumVertices;
    int iNumEdges;

    public static void main(String[] args) {

        // do stuff

        iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

    }
}

طريقة main هي طريقة ثابتة مرتبطة بالفئة. لا يرتبط بمثيل Member, ، لذلك لا يمكن الوصول إلى المتغيرات المرتبطة بمثيل من Member. حل هذا هو ليس لجعل تلك الحقول ثابتة. بدلاً من ذلك ، تحتاج إلى إنشاء مثيل Member باستخدام new الكلمة الرئيسية.

إليك نسخة معدلة:

public class Member {
    // Fields
    private int iNumVertices;
    private int iNumEdges;

    public Member(){
        // init the class
    }

    public static void main(String[] args) {
        Member member = new Member();
        member.iNumVertices = 0;
        // do more stuff
    }
}

إن العثور على نفسك في إنشاء إحصائيات عالمية هو مؤشر لك على أنه يجب عليك التفكير بعناية في كيفية تصميم شيء ما. ليست كذلك دائماً خطأ ، ولكن يجب أن يخبرك أن تفكر فيما تفعله.

نصائح أخرى

ثابتة المتغيرات هي تلك التي يتم مشاركتها عبر جميع كائنات الفصل. هنا في مثالك لكل كائن عضو أنت تنشئ ، ستحصل على كائنات لها ملكها inumvertices القيم. عندما تستخدم ثابتة مع متغير ، لا يوجد سوى متغير واحد مشترك عبر كل كائن من عضو. ثابتة الأساليب تعمل بنفس الطريقة - يتم مشاركتها عبر جميع الكائنات.

حيث ثابتة المتغيرات/الأساليب شائعة في جميع الكائنات ، لا يحتاج المرء إلى جعل كائن الفئة للوصول إلى هذه المتغيرات/الأساليب.

متغيرات غير متتالية مثل inumvertices ينتمي إلى كائن من الفصل. لا يمكن الوصول إليها دون إنشاء كائن. لذلك عند الوصول إلى متغير غير منتظم من سياق ثابت (هنا الأساسية الطريقة) ، ثم جافا لن تعرف أي كائن inumvertices أنت تحاول الوصول. وبالتالي الخطأ.

إما جعل inumvertices ثابت ، أو الرجوع إليه عن طريق إنشاء كائن عضو

Member m = new Member();
m.iNumVertices = 0;
learn what "static" actually means

ما يعنيه ثابت في الواقع أن متغير الفئة سيكون هو نفسه بالنسبة لجميع مثيل هذه الفئة بالذات ، ولكن إذا كنت ترغب في تجنب استخدام متغيرات ثابتة (وهي فكرة جيدة ، حيث يتم الاحتفاظ بالمتغيرات الثابتة في الذاكرة) يمكنك تمرير مُنشئ القيمة المتغيرة وبالتالي تجنب استخدام المعدل الثابت ، وتحقيق نفس التأثير (أي إذا قمت بتمرير نفس القيمة عند إنشاء مثيل للصف).

فيما يلي مثال رمز:

public class Car{

    private int speed;

    public Car(int speed){
        this.speed = speed;
    }

}

لذلك يمكنك القيام بذلك عند إنشاء مثيل جديد:

Car car = new Car(100);

وفي كل مرة تقوم فيها بإنشاء مثيل سيارة ، سيكون لها سرعة 100 ، وبالتالي تجنب الإعلان الثابت private static int speed = 100;

المتغيرات الثابتة هي متغيرات فئة. ستكون هناك نسخة واحدة من هذا المتغير المتغير لجميع حالات الفصل وسيشاركون هذا المتغير. يمكن أيضًا استخدام الأعضاء الثابتة دون الرجوع إلى مثيل محدد للفصل.

المزيد هنا:

http://download.oracle.com/javase/tutorial/java/javaoo/classvars.html

لا تحتاج المتغيرات الثابتة إلى إنشاء فئة من أجل الوصول إليها من أجل الوصول إليها ، لذلك إذا كنت تحاول الوصول إلى متغير غير استاتيكي من سياق ثابت ، فأنت تخاطر به في محاولة للوصول إلى شيء لم يتم تهيئته/إنشاء مثيل له.

يمكن للطرق الثابتة الوصول إلى المتغيرات الثابتة فقط. هناك نوعان من المتغيرات في الفصل. واحد هو متغيرات ثابتة (أيضا متغيرات الفئة) والآخر هو متغير مثيل. توجد نسخة واحدة فقط من متغير ثابت في الذاكرة ولكن سيتم إنشاء مثيل لكل كائن لكل كائن. لذلك بالنسبة للمتغيرات الثابتة ، فإن جميع الكائنات تصل إلى نفس المتغير وسيتم انعكاس أي تغيير من قبل كائن واحد في كائنات أخرى. والسؤال هنا هو لماذا يجب أن تكون هذه الأساليب ثابتة للوصول إلى المتغيرات الثابتة. عندما تقوم بعمل طريقة ثابتة ، يمكنك الوصول إلى الطريقة دون إنشاء كائنات من تلك الفئة. لذا ، إذا كانت هذه الطريقة قادرة على الوصول إلى متغيرات المثيل ، فعندئذ يجب على متغيرات الكائن إجراء التغيير؟ الطريقة الأخرى ممكنة ، أي الطرق غير الساكنة يمكنها الوصول إلى المتغيرات الثابتة.

يجب إعلان كل متغير فئة (متغير تم إعلانه داخل جسم الفصل وخارجها) المستخدمة في طريقة ثابتة ثابتة أيضًا.

يمكن الوصول إلى متغيرات الطبقة الثابتة والأساليب خارج تلك الفئة دون الحاجة إلى مثيل لتلك الفئة.

المتغيرات الثابتة شائعة في جميع حالات الفصل.

ملاحظة: كما قال سابقًا ، هذه هي متغيرات الفصل أي مشتركة بين جميع الحالات.

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

لمزيد من المعلومات راجع:http://download.oracle.com/javase/tutorial/java/javaoo/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top