ماذا 'ثابت' الكلمة في الصف ؟
-
03-07-2019 - |
سؤال
أن تكون محددة, كنت أحاول هذا الكود:
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
في هذه الحالة متغير ثابت سوف تحصل على الذاكرة مرة واحدة فقط ، إذا أي كائن تغيير قيمة متغير ثابت ، وسوف تحتفظ بقيمتها.
ثابت مع النهائي:
المتغير العالمي الذي أعلن نهائي ثابت لم يتغير طوال التنفيذ.لأن أعضاء ثابتة يتم تخزينها في الصف الذاكرة ويتم تحميلها مرة واحدة فقط في تنفيذ كامل.فهي مشتركة بين جميع الكائنات من فئة.إذا قمت بتعريف متغيرات ثابتة نهائيا ، أي من الكائنات لا يمكن تغيير قيمتها كما هو النهائي.ولذلك المتغيرات أعلن نهائية ثابتة في بعض الأحيان يشار إلى الثوابت.جميع الحقول من واجهات يشار الثوابت ، لأنها نهائية ثابتة بشكل افتراضي.
الصورة الموارد : النهائي ثابت
وثابت يعني أنه لم يكن لديك لإنشاء مثيل من فئة لاستخدام الأساليب أو المتغيرات المرتبطة بها في الصف. في المثال الخاص بك، هل يمكن الاتصال على:
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.
ويمكن تعيين حقل إما إلى فئة أو مثيل فئة. بواسطة الحقول الافتراضية متغيرات المثال. باستخدام static
مجال يصبح متغير الصف، وبالتالي هناك واحد وclock
واحد فقط. إذا قمت بإجراء تغييرات في مكان واحد، انها واضحة في كل مكان. يتم تغيير varables المثال بشكل مستقل عن بعضها البعض.
الكلمة static
يستخدم للدلالة على حقل أو طريقة ينتمون إلى الطبقة نفسها وليس على سبيل المثال.استخدام التعليمات البرمجية الخاصة بك ، إذا كان الكائن Clock
هو ثابت كل الحالات Hello
فئة وتبادل هذه Clock
بيانات الأعضاء (الميدان) مشترك.إذا كنت تجعل من غير ثابتة ، في كل حالة على حدة من Hello
يمكن أن يكون فريد من نوعه Clock
الحقل.
المشكلة هي أن إضافة الرئيسية طريقة صفك Hello
بحيث يمكن تشغيل التعليمات البرمجية.المشكلة هنا هي أن الرئيسية طريقة ثابتة وعلى هذا النحو ، فإنه يمكن الرجوع إلى غير ثابت الميادين أو الطرق داخل منه.يمكنك حل هذا بطريقتين:
- جعل جميع مجالات وأساليب
Hello
الدرجة ثابت بحيث يمكن أن يشار إلى داخل الرئيسية الأسلوب.هذا ليس شيء جيد القيام به (أو الخطأ سبب t جعل الميدانية و/أو أسلوب ثابت) - إنشاء مثيل
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()
هو أسلوب ثابت الذي فقد اثنين من القيود الأساسية:
- أسلوب ثابت لا يمكن استخدام غير ثابت عضو البيانات أو الاتصال مباشرة غير ثابت الأسلوب.
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
كائن. ولكنها تعترض على عدم تحديد حتى الان. لأن غير ثابت لها. ثم يأتي مثل هذا الخطأ.