تسلسل تهيئة الكائن في سكالا في تسلسل هرمي متأصل

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

  •  27-10-2019
  •  | 
  •  

سؤال

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

class Point(val x: Int, val y: Int){
    val name = this.makeName;

    def makeName: String = {
        println("makeName at super.");

        "[" + x + ", " + y + "]";
    }

    override def toString: String = name;
}

class ColorPoint(override val x: Int, override val y: Int, var color: String) extends Point(x, y) {

    // key statement
    println(name);

    override def makeName: String = {
        println("makeName at sub.");

        super.makeName + ":" + myColor;
    }

    val myColor = color;

    override def toString: String = name;
}

دعونا مجرد النظر في رمز بايت من منشئ ColorPoint ملقاة مع javap.إذا كان الرمز يتضمن البيان الرئيسي println(name); رمز البايت هو

public ColorPoint(int, int, java.lang.String);
  Code:
   0:   aload_0
   1:   aload_3
   2:   putfield        #13; //Field color:Ljava/lang/String;
   5:   aload_0
   6:   iload_1
   7:   iload_2
   8:   invokespecial   #18; //Method Point."<init>":(II)V
   11:  getstatic       #24; //Field scala/Predef$.MODULE$:Lscala/Predef$;
   14:  aload_0
   15:  invokevirtual   #28; //Method name:()Ljava/lang/String;
   18:  invokevirtual   #32; //Method scala/Predef$.println:(Ljava/lang/Object;)V
   21:  aload_0
   22:  aload_3
   23:  putfield        #34; //Field myColor:Ljava/lang/String;
   26:  return

يمكننا أن نرى الحقل myColor تتم تهيئة بعد invokespecial, ، أي.بعد تهيئة الطبقة الأساسية.

إذا كنت أعلق على البيان println(name); رمز البايت هو:

public ColorPoint(int, int, java.lang.String);
  Code:
   0:   aload_0
   1:   aload_3
   2:   putfield        #13; //Field color:Ljava/lang/String;
   5:   aload_0
   6:   aload_3
   7:   putfield        #15; //Field myColor:Ljava/lang/String;
   10:  aload_0
   11:  iload_1
   12:  iload_2
   13:  invokespecial   #20; //Method Point."<init>":(II)V
   16:  return

نرى هذا المجال myColor تتم تهيئة قبل invokespecial, ، أي.قبل تهيئة القاعدة.

ثم ما هو السبب?أي وثيقة/تحدد المادة هذا النوع من السلوك?

راجع للشغل ، نسخة من بلدي سكالا هو 2.7.7 النهائي (أوبنجدك خادم فم ، جافا 1.6.0_20).شكرا وأطيب التحيات!

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

المحلول

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

https://github.com/paulp/scala-faq/wiki/Initialization-Order

الجزء الرئيسي منه هو ما يلي.

  1. تتم تهيئة الفئات الفائقة بالكامل قبل الفئات الفرعية.
  2. خلاف ذلك ، في ترتيب الإعلان.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top