java كلاس - كيف يمكنني استدعاء مُنشئ واحد من آخر في Java؟




8 Answers

نعم هذا ممكن:

public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

    public Foo(int x) {
        this.x = x;
    }
}

للتسلسل إلى مُنشئ فريد من نوع الطبقة العليا بدلاً من واحد في نفس الفصل ، استخدم super بدلاً من this . لاحظ أنه يمكنك فقط التسلسل إلى مُنشئ واحد ، ويجب أن يكون العبارة الأولى في نص المُنشئ الخاص بك .

راجع أيضًا هذا السؤال ذي الصلة ، وهو يتعلق بـ C # ولكن حيثما تنطبق نفس المبادئ.

جافا شرح

هل من الممكن استدعاء مُنشئ من آخر (ضمن نفس الفئة ، وليس من فئة فرعية)؟ إذا نعم كيف؟ وماذا يمكن أن يكون أفضل طريقة لاستدعاء منشئ آخر (إذا كان هناك العديد من الطرق للقيام بذلك)؟




[ ملاحظة: أريد فقط أن أضيف جانبًا واحدًا ، لم أره في الإجابات الأخرى: كيفية التغلب على قيود متطلبات أن يكون هذا () في السطر الأول). ]

في Java يمكن استدعاء مُنشئ آخر من نفس الفئة من مُنشئ عبر this() . لاحظ مع ذلك أن this يجب أن يكون في السطر الأول.

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, 0.0);
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }
}

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

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, getDefaultArg3(argument1, argument2));
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }

  private static double getDefaultArg3(double argument1, double argument2) {
    double argument3 = 0;

    // Calculate argument3 here if you like.

    return argument3;

  }

}



داخل مُنشئ ، يمكنك استخدام this الكلمة الأساسية لاستدعاء منشئ آخر في نفس الفئة. يسمى القيام بذلك استدعاء صريح منشئ .

فيما يلي فئة مستطيل أخرى ، مع تطبيق مختلف عن ذلك الموجود في قسم الكائنات.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(1, 1);
    }
    public Rectangle(int width, int height) {
        this( 0,0,width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

}

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




سأخبرك بطريقة سهلة

هناك نوعان من المنشئات:

  1. منشئ افتراضي
  2. منشئ معتبر

سأشرح في مثال واحد

class ConstructorDemo 
{
      ConstructorDemo()//Default Constructor
      {
         System.out.println("D.constructor ");
      }

      ConstructorDemo(int k)//Parameterized constructor
      {
         this();//-------------(1)
         System.out.println("P.Constructor ="+k);       
      }

      public static void main(String[] args) 
      {
         //this(); error because "must be first statement in constructor
         new ConstructorDemo();//-------(2)
         ConstructorDemo g=new ConstructorDemo(3);---(3)    
       }
   }                  

في المثال أعلاه عرضت 3 أنواع من الاتصال

  1. يجب أن يكون هذا استدعاء () إلى هذا أولاً العبارة في منشئ
  2. هذا هو اسم أقل كائن. هذا تلقائياً باستدعاء منشئ افتراضي. 3. هذا يستدعي المُنَظِر المُعْلَمي.

ملاحظة: يجب أن يكون هذا أول عبارة في المُنشئ.




استدعاء مُنشئ من مُنشئ آخر

class MyConstructorDemo extends ConstructorDemo
{
    MyConstructorDemo()
    {
        this("calling another constructor");
    }
    MyConstructorDemo(String arg)
    {
        System.out.print("This is passed String by another constructor :"+arg);
    }
}

كما يمكنك استدعاء منشئ الأهل باستخدام استدعاء super()




نعم من الممكن استدعاء منشئ من آخر. لكن هناك قاعدة لذلك. إذا تم إجراء مكالمة من مُنشئ إلى آخر ، فعندئذٍ

يجب أن يكون استدعاء منشئ جديد عبارة الأول في المنشئ الحالي

public class Product {
     private int productId;
     private String productName;
     private double productPrice;
     private String category;

    public Product(int id, String name) {
        this(id,name,1.0);
    }

    public Product(int id, String name, double price) {
        this(id,name,price,"DEFAULT");
    }

    public Product(int id,String name,double price, String category){
        this.productId=id;
        this.productName=name;
        this.productPrice=price;
        this.category=category;
    }
}

شيء من هذا القبيل أدناه لن ينجح.

public Product(int id, String name, double price) {
    System.out.println("Calling constructor with price");
    this(id,name,price,"DEFAULT");
}



نعم ، يمكن أن يكون أي عدد من المنشئين موجودًا في فصل ويمكن أن يتم استدعاؤه بواسطة مُنشئ آخر باستخدام this() [الرجاء عدم الخلط بين this() الاتصال بالمنشئ باستخدام this الكلمة الأساسية]. يجب أن يكون this() أو this(args) السطر الأول في المُنشئ.

مثال:

Class Test {
    Test() {
        this(10); // calls the constructor with integer args, Test(int a)
    }
    Test(int a) {
        this(10.5); // call the constructor with double arg, Test(double a)
    }
    Test(double a) {
        System.out.println("I am a double arg constructor");
    }
}

هذا هو المعروف باسم الحمولة الزائدة منشئ.
يرجى ملاحظة أنه بالنسبة للمُنشئ ، لا ينطبق سوى مفهوم الحمولة الزائدة وليس الميراث أو تجاوزه.




بسيط جدا

public class SomeClass{

    int number;
    String someString;

    public SomeClass(){
        number = 0;
    }

    public SomeClass(int number){
        this(); //set the class to 0
        this.setNumber(number); 
    }

    public SomeClass(int number, String someString){
        this(number); //call public SomeClass( int number )
    }

    public void setNumber(int number){
        this.number = number;
    }
    public void setString(String someString){
        this.someString = someString;
    }
    //.... add some accessors
}

الآن هنا بعض الائتمان الإضافي الصغير:

public SomeOtherClass extends SomeClass {
    public SomeOtherClass(int number, String someString){
         super(number, someString); //calls public SomeClass(int number, String someString)
    }
    //.... Some other code.
}

أتمنى أن يساعدك هذا.




Related

java constructor