سؤال

أن تكون محددة, كنت أحاول هذا الكود:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

لكنه أعطى خطأ

لا يمكن الوصول إلى غير ثابت الميدانية في أسلوب ثابت الرئيسية

حتى لقد غيرت إعلان clock إلى هذا:

static Clock clock = new Clock();

وعملت.ما يعني أن وضع هذه الكلمة قبل الإعلان ؟ بالضبط ما سوف تفعله و/أو تقييد من حيث ما يمكن القيام به هذا الكائن ؟

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

المحلول

static أعضاء تنتمي إلى فئة بدلا من معين سبيل المثال.

فهذا يعني أن مثيل واحد فقط من static الميدان موجود[1] حتى إذا قمت بإنشاء مليون مثيلات فئة أو أنك لا تخلق أي.وسوف تكون مشتركة من قبل جميع الحالات.

منذ static طرق أيضا لا تنتمي إلى مجموعة محددة سبيل المثال لا يمكنهم الرجوع إلى أعضاء مثيل.في المثال المذكور ، main لا أعرف أي مثيل Hello فئة (وبالتالي والتي مثيل Clock الدرجة) أن الرجوع إلى. static يمكن للأعضاء فقط أن أشير إلى static أعضاء.سبيل المثال يمكن للأعضاء بالطبع الوصول static أعضاء.

ملاحظة جانبية: وبطبيعة الحال ، static يمكن للأعضاء الوصول المثال أعضاء من خلال مرجع كائن.

على سبيل المثال:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]:اعتمادا على وقت الخصائص ، يمكن أن تكون واحدة في ClassLoader أو مجال أو موضوع ، ولكن هذا هو بجوار نقطة.

نصائح أخرى

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

وحتى لو كنت على القيام ب "مرحبا الجديد" في أي مكان في التعليمات البرمجية: A- في السيناريو الأول (ما قبل التغيير، دون استخدام "ثابت")، من شأنه أن يجعل ساعة جديدة كل مرة يتم استدعاء "مرحبا الجديد"، ولكن B- في السيناريو الثاني (بعد التغيير، وذلك باستخدام "ثابت")، فإن كل "جديد مرحبا" المثال لا يزال تبادل واستخدام "الساعة" المرجعية الأولية ونفس أنشئت لأول مرة.

وإلا إذا كنت بحاجة إلى "الساعة" في مكان ما خارج الرئيسي، وهذا من شأنه أن يعمل فقط كذلك:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}

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

للحصول على مزيد من المعلومات ، راجع ذات الصلة قليلا من جافا أوراكل التعليمي.


Sidenote

جافا للأسف يسمح يمكنك الوصول إلى أعضاء ثابتة كما لو كانوا أعضاء مثيل ، على سبيل المثال

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

أن يجعل اسمع كما لو sleep هو أسلوب مثيل, لكنه في الواقع أسلوب ثابت - أنه دائما يجعل الترابط الحالي النوم.إنه أفضل الممارسات لجعل هذا واضحا في كود الاتصال:

// Clearer
Thread.sleep(5000);

والكلمة static في جاوة تعني أن المتغير أو وظيفة هو مشترك بين جميع الحالات من تلك الفئة التي تنتمي إليها و<م> نوع ، وليس الأشياء الفعلية نفسها.

وحتى إذا كان لديك متغير: private static int i = 0; ولك زيادة عليه (i++) في حالة واحدة، وسوف ينعكس التغيير في جميع الحالات. سوف i الآن يكون 1 في جميع الحالات.

وسائل ثابتة يمكن استخدامها بدون instantiating كائن.

والاستخدام الأساسي لأعضاء ثابتة ...

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

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

Hello hello = new Hello();
hello.staticValue = "abc";

ويمكنك الاتصال فقط القيم أو أساليب ثابتة بالاسم الدرجة:

Hello.staticValue = "abc";

ثابت في جاوة:

ثابت هو عدم الوصول إلى معدل.ثابت الكلمة ينتمي إلى فئة من مثيل من فئة.يمكن أن تستخدم لتوصيل متغير أو الأسلوب إلى فئة.

ثابت الكلمة يمكن أن تستخدم مع:

طريقة

متغير

فئة متداخلة ضمن فئة أخرى

التهيئة كتلة

لا يمكن أن تستخدم مع:

فئة (غير متداخلة)

منشئ

واجهات

طريقة الطبقة الداخلية المحلية(الفرق ثم متداخلة فئة)

الطبقة الداخلية من أساليب

المتغيرات المثال

المتغيرات المحلية

على سبيل المثال:

تخيل المثال التالي الذي يحتوي على سبيل المثال متغير اسمه العد والتي في زيادة في منشئ:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

الإخراج:

1 1 1

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

الآن إذا كنا تغيير سبيل المثال متغير عد إلى ثابت واحدة ثم البرنامج سوف تنتج الانتاج المختلفة:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

الإخراج:

1 2 3

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

ثابت مع النهائي:

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

enter image description here

الصورة الموارد : النهائي ثابت

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

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

ومباشرة، بدلا من:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

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

هذا النقاش حتى الآن تجاهل classloader الاعتبارات.بالمعنى الدقيق للكلمة, جافا ثابت الحقول المشتركة بين كافة مثيلات فئة معينة classloader.

إضافة إلى القائمة إجابات ، اسمحوا لي أن أحاول مع الصورة:

سعر الفائدة من 2 ٪ تنطبق على حسابات الادخار.ومن ثم ثابت.

التوازن ينبغي أن يكون الفردية, لذا فمن لا ساكنة.

enter image description here

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

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

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

  1. جعل جميع مجالات وأساليب Hello الدرجة ثابت بحيث يمكن أن يشار إلى داخل الرئيسية الأسلوب.هذا ليس شيء جيد القيام به (أو الخطأ سبب t جعل الميدانية و/أو أسلوب ثابت)
  2. إنشاء مثيل Hello الفئة داخل الأسلوب الرئيسي إلى أنه المجالات والأساليب الطريقة التي كانت تهدف في المقام الأول.

بالنسبة لك وهذا يعني التغيير التالي إلى التعليمات البرمجية الخاصة بك:

package hello;

public class Hello {

    private Clock clock = new Clock();

    public Clock getClock() {
        return clock;
    }

    public static void main(String args[]) {
        Hello hello = new Hello();
        hello.getClock().sayTime();
    }
}

في جافا ، static الكلمات الرئيسية يمكن ببساطة اعتبار تشير إلى ما يلي:

"دون اعتبار أو علاقة معينة سبيل المثال"

إذا كنت تعتقد أن من static في هذه الطريقة ، يصبح من الأسهل أن نفهم استخدامها في مختلف السياقات التي واجهتها:

  • A static الحقل هو الحقل الذي ينتمي إلى فئة بدلا من أن أي مثيل

  • A static الأسلوب هو الأسلوب الذي لا يوجد لديه فكرة this;ويعرف على فئة و لا أعرف عن أي حالة من تلك الفئة إلا إشارة يتم تمريرها إليه

  • A static الأعضاء الفئة هي فئة متداخلة دون أي فكرة أو معرفة مثيل لها تضم فئة (إلا إشارة إلى أرفق الدرجة سبيل المثال يتم تمريرها إلى ذلك)

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

Hello hello = new Hello();
hello.clock.sayTime();

وأساليب ثابتة لا تستخدم أية متغيرات مثيل من فئة يتم تعريفها في ويمكن العثور على تفسير جيد جدا من الفرق على <لأ href = "http://leepoint.net/notes-java/flow/ طرق / 50static-methods.html "يختلط =" noreferrer "> هذه الصفحة

ولقد وضعت تروق لأساليب ثابتة (إلا إذا كان ذلك ممكنا) في صفوف "المساعد".

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

وهناك مزايا أخرى ربما.

ويمكن أن نفكر أيضا من أعضاء ثابتة عدم وجود "هذا" المؤشر. فهي مشتركة بين جميع الحالات.

فهم ثابت المفاهيم

public class StaticPractise1 {
    public static void main(String[] args) {
        StaticPractise2 staticPractise2 = new StaticPractise2();
        staticPractise2.printUddhav(); //true
        StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */

        StaticPractise2.printUddhavsStatic1(); //true
        staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static  things and it organizes in its own heap. So, class static methods, object can't reference */

    }
}

الدرجة الثانية

public class StaticPractise2 {
    public static void printUddhavsStatic1() {
        System.out.println("Uddhav");
    }

    public void printUddhav() {
        System.out.println("Uddhav");
    }
}
//Here is an example 

public class StaticClass 
{
    static int version;
    public void printVersion() {
         System.out.println(version);
    }
}

public class MainClass 
{
    public static void main(String args[]) {  
        StaticClass staticVar1 = new StaticClass();
        staticVar1.version = 10;
        staticVar1.printVersion() // Output 10

        StaticClass staticVar2 = new StaticClass();
        staticVar2.printVersion() // Output 10
        staticVar2.version = 20;
        staticVar2.printVersion() // Output 20
        staticVar1.printVersion() // Output 20
    }
}

main() هو أسلوب ثابت الذي فقد اثنين من القيود الأساسية:

  1. أسلوب ثابت لا يمكن استخدام غير ثابت عضو البيانات أو الاتصال مباشرة غير ثابت الأسلوب.
  2. this() و super() لا يمكن أن تستخدم في ثابت السياق.

    class A {  
        int a = 40; //non static
        public static void main(String args[]) {  
            System.out.println(a);  
        }  
    }
    

الإخراج:وقت التحويل البرمجي خطأ

ويمكن الوصول إليها المتغيرات الثابتة فقط فقط في أساليب ثابتة، لذلك عندما نعلن المتغيرات ثابتة تلك الأساليب جالبة واضعة سيكون أساليب ثابتة

وأساليب ثابتة هو مستوى الفئة يمكننا الوصول باستخدام اسم الفئة

وفيما يلي مثال للحاصل على متغيرات ثابتة والمحددات:

public class Static 
{

    private static String owner;
    private static int rent;
    private String car;
    public String getCar() {
        return car;
    }
    public void setCar(String car) {
        this.car = car;
    }
    public static int getRent() {
        return rent;
    }
    public static void setRent(int rent) {
        Static.rent = rent;
    }
    public static String getOwner() {
        return owner;
    }

    public static void setOwner(String owner) {
        Static.owner = owner;
    }

}
<اقتباس فقرة>   

عند تشغيل بعض المشاريع تحميل أولا أشياء ثابتة (المتغيرات والأساليب وكتل ..).

عند تشغيل هذا الحمل الأسلوب الرئيسي المشروع أولا. لأن static method لها. ثم تبدو "a" object كائن. ولكنها تعترض على عدم تحديد حتى الان. لأن غير ثابت لها. ثم يأتي مثل هذا الخطأ.

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