example - this java




如何在Java中調用另一個構造函數? (11)

[ 注意:我只想添加一個方面,我在其他答案中沒有看到:如何克服()必須位於第一行的要求的限制)。 ]

在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;
  }
}

這必須出現在第一行看起來像一個很大的限制,但你可以通過靜態方法構造其他構造函數的參數。 例如:

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;

  }

}

是否有可能從另一個(在同一個類中,而不是從一個子類)調用構造函數? 如果是的話如何? 調用另一個構造函數的最佳方式是什麼(如果有幾種方法可以這樣做)?


我會告訴你一個簡單的方法

兩種類型的構造函數:

  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. this()對此的調用必須是構造函數中的第一條語句
  2. 這是名稱較少的對象。 這會自動調用默認的構造函數。 3.這將調用參數化的構造函數。

注意: 這必須是構造函數中的第一條語句。


在構造函數中,可以使用this關鍵字來調用同一個類中的另一個構造函數。 這樣做被稱為顯式構造函數調用

這裡是另一個Rectangle類,它與Objects部分中的不同。

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;
    }

}

這個類包含一組構造函數。 每個構造函數初始化矩形的一些或全部成員變量。


對的,這是可能的:

public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

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

要鏈接到特定的超類構造函數而不是同一個類中的構造函數,請使用super而不是this 。 請注意, 您只能鏈接到一個構造函數 ,並且它必須是構造函數體中的第一條語句

另請參閱這個相關的問題 ,這是關於C#,但在相同的原則適用。


從另一個構造函數調用構造函數

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

你也可以使用super()調用來調用父構造函數


您可以使用“this”關鍵字從同一個類的另一個構造函數構造函數。 示例 -

class This1
{
    This1()
    {
        this("Hello");
        System.out.println("Default constructor..");
    }
    This1(int a)
    {
        this();
        System.out.println("int as arg constructor.."); 
    }
    This1(String s)
    {
        System.out.println("string as arg constructor..");  
    }

    public static void main(String args[])
    {
        new This1(100);
    }
}

輸出 - 字符串作為arg構造函數..默認構造函數.. int作為arg構造函數..


是的,任何數量的構造函數都可以存在於一個類中,並且可以由另一個構造函數使用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");
    }
}

這被稱為構造函數重載。
請注意,對於構造函數,只有重載概念是適用的,而不是繼承或覆蓋。


是的,可以使用this()從另一個構造器中調用另一個構造器。

class Example{
   private int a = 1;
   Example(){
        this(5); //here another constructor called based on constructor argument
        System.out.println("number a is "+a);   
   }
   Example(int b){
        System.out.println("number b is "+b);
   }

有一些設計模式可以滿足複雜構建的需要 - 如果不能簡潔地完成,可以創建工廠方法或工廠類。

使用最新的java和lambda表達式,可以很容易地創建一個構造函數,它可以接受任何您想要的初始化代碼。

class LambdaInitedClass {

   public LamdaInitedClass(Consumer<LambdaInitedClass> init) {
       init.accept(this);
   }
}

用...來稱呼它...

 new LambdaInitedClass(l -> { // init l any way you want });

正如大家已經說過的,你使用this(…) ,這被稱為顯式構造函數調用

但是,請記住,在這樣的顯式構造函數調用語句中, 您可能不會引用

  • 任何實例變量
  • 任何實例方法
  • 在此類或任何超類中聲明的任何內部類,或
  • this或者
  • super

正如JLS(§8.8.7.1)所述。


關鍵字this可用於從構造函數中調用構造函數,當為某個類編寫多個構造函數時,有時需要從另一個構造函數調用另一個構造函數以避免重複代碼。

Bellow是一個鏈接,我解釋了有關構造函數和getters()和setters()的其他主題,並且我使用了一個帶有兩個構造函數的類。 我希望這些解釋和例子能幫助你。

Setter方法或構造函數





constructor