3

授業でプログラムの課題があります。オーバーロードの基本はすでに理解していますが、ある点で完全に混乱しています。使用しようとしているメソッドのみから出力するにはどうすればよいですか? 説明するよりもコードをお見せしましょう。

public class Box {
 private int length, width, height;

 public Box(int length){
  this.length=length;
  System.out.println("Line created with length of" + length + ".");
 }
 public Box(int length, int width){
  this.length = length;
  this.width = width;
  System.out.println("Rectangle created with the length of " + length + " ");
  System.out.println("and the width of " + width + ".");
 }
 public Box(int length, int width, int height){
  this.length=length;
  this.width=width;
  this.height=height;
  System.out.println("Box created with the length of " + length + ", ");
  System.out.println("the width of " + width + ", ");
  System.out.println("and the height of " + height +".");

 }
}


class BoxTest {

 public static void main(String[] args) {
  Box BoxObject1 = new Box(1,0,0);
  Box BoxObject2 = new Box(1,2,0);
  Box BoxObject3 = new Box(1,2,3);



 }

}

よし、じゃあ!クラス BoxTest を呼び出して、与えられたものだけを出力するにはどうすればよいですか。たとえば、Box BoxObject1 を使用して、残りではなく「XX の長さで作成された行」を出力したいと考えています。Box Box Object2 に対して、「長さ XX、幅 XX で作成された長方形」を出力したいと考えています。これを実現するために次に何を追加すればよいかわかりません。どんな助けでも大歓迎です。

4

8 に答える 8

9

私は推測する

  Box BoxObject1 = new Box(1,0,0);
  Box BoxObject2 = new Box(1,2,0);
  Box BoxObject3 = new Box(1,2,3);

であることが意図されています

  Box BoxObject1 = new Box(1);
  Box BoxObject2 = new Box(1,2);
  Box BoxObject3 = new Box(1,2,3);

現時点では、3 つの呼び出しすべてが 3 番目のコンストラクターを呼び出しています (引数の一部に 0 を渡しています)。

于 2011-01-12T19:59:23.863 に答える
4
Box BoxObject1 = new Box(1,0,0);
Box BoxObject2 = new Box(1,2,0);
Box BoxObject3 = new Box(1,2,3);

これらはすべて 3 引数のコンストラクターを呼び出しています。おそらくあなたは実際に望んでいた:

Box BoxObject1 = new Box(1);
Box BoxObject2 = new Box(1,2);
Box BoxObject3 = new Box(1,2,3);
于 2011-01-12T19:59:49.277 に答える
3

だからあなたはこれが欲しい:

Box BoxObject1 = new Box(1);
Box BoxObject2 = new Box(1,2);
Box BoxObject3 = new Box(1,2,3);
于 2011-01-12T20:00:34.527 に答える
2

メソッドを呼び出すのと同様の方法でコンストラクターを呼び出すには、コンストラクターのシグネチャを使用します。つまり、パラメーターの名前、数、およびタイプです。

したがって、単一の int パラメーターを指定して最初のコンストラクターを呼び出すには、次のように呼び出します。

        new Box(1);

signature でコンストラクターを呼び出しますpublic Box(int length)

于 2011-01-12T19:59:44.353 に答える
2

コンストラクターが相互に活用してコードの重複の量を減らすことができるように、次のようにクラスを構築することを検討することもできます。

public class Box {

    private int length, width, height;

    public Box(int length) {
        this.length = length;
        System.out.println("Line created with length of " + length + ".");
    }

    public Box(int length, int width) {
        this(length);
        this.width = width;
        System.out.println("and the width of " + width + ".");
    }

    public Box(int length, int width, int height) {
        this(length, width);
        this.height = height;
        System.out.println("and the height of " + height + ".");
    }

}

このユースケースには適切ではありませんが (extraneon によって与えられた理由によると)、以下は別の可能性であり、可変数のパラメーターがある場合に役立ちます。

public class Box {

    private int length, width, height;

    public Box(int... param) {
        if(param.length > 0) {
            length = param[0];
            System.out.println("Line created with length of " + length + ".");
        }
        if(param.length > 1) {
            width = param[1];
            System.out.println("and the width of " + width + ".");
        }
        if(param.length > 2) {
            height = param[2];
            System.out.println("and the height of " + height + ".");
        }
    }

}

これらのアプローチはどちらも、次の場合に機能します。

public class Demo {

    public static void main(String[] args) {
        //new Box(1);
        new Box(1,2);
        //new Box(1,2,3);
    }
}

目的の出力を得るには:

Line created with length of 1.
and the width of 2.
于 2011-01-12T20:13:07.727 に答える
1

あなたがしていることは、コンストラクターの伸縮に似ています。これはうまくスケーリングできず、提供されたリンクに記載されているのと同じ欠点があります。コンストラクターは、すべての不変条件を満たすオブジェクトを作成できる必要があります。オブジェクトを段階的に構築するには、ビルダーを使用します。

于 2011-01-12T20:06:03.907 に答える
0

あなたはこのようなことを考えるべきです。それはずっときれいです。1つのコンストラクターは「汎用コンストラクター」です。内部実装の詳細を変更する場合は、この1つのコンストラクターを変更します。

このソリューションには、多くの重複コードを排除するという利点があります。

public class Box
{
    private int length, width, height;

    public Box(int length)
    {
        this(length, 0, 0);
    }
    public Box(int length, int width)
    {
        this(length, width, 0);
    }
    public Box(int length, int width, int height){
    this.length=length;
    this.width=width;
    this.height=height;
    System.out.println("Box created with the length of " + length + ", ");
    System.out.println("the width of " + width + ", ");
    System.out.println("and the height of " + height +".");
    }
    public static void main(String[] args)
    {
        Box BoxObject1 = new Box(1);
        Box BoxObject2 = new Box(1,2);
        Box BoxObject3 = new Box(1,2,3);
    }
}

これがコマンドラインでの結果です。

morrison@odonata:~$ java Box
Box created with the length of 1, 
the width of 0, 
and the height of 0.
Box created with the length of 1, 
the width of 2, 
and the height of 0.
Box created with the length of 1, 
the width of 2, 
and the height of 3.
morrison@odonata:~$ 
于 2011-01-12T22:19:45.670 に答える
0

あなたの質問へのコメントとして、そして実際には答えではありません:

セットアップの一部を共有するコンストラクターがある場合(あなたのように)、コンストラクター内から他のコンストラクターを呼び出すことができます。

public class Box {
 private int length, width, height;

 public Box(int length){
  this.length=length;
  System.out.println("Line created with length of" + length + ".");
 }
 public Box(int length, int width){
  this(length); // calls Box(length)
  this.width = width;
  System.out.println("and the width of " + width + ".");
 }
 public Box(int length, int width, int height){
  this(length, width); // calls Box(length, width) which calls Box(length)
  this.height=height;
  System.out.println("and the height of " + height +".");    
 }
}    

この場合、コンストラクターは非常に簡単ですが、いくらか多くのコードを含むコンストラクターがある場合は、コードの重複を防ぎ、バグ修正(およびコンストラクターの1つを修正するのを忘れる可能性があります)を防ぐのに役立ちます。また、コンストラクター間の違いについても説明します。

ビルダーの使用に関するパンゲアのアドバイスも検討してください。それはより読みやすいです:

// if no parameters are required and all are optional
Box box0 = new Box.Builder().build();
Box box1 = new Box.Builder().length(1).build();
Box box2 = new Box.Builder().length(1).width(2).build();
Box box3 = new Box.Builder().length(1).width(2).height(3).build();

// if length is required and others are optional - that's your Box
Box box1 = new Box.Builder(1).build();
Box box2 = new Box.Builder(1).width(2).build();
Box box3 = new Box.Builder(1).width(2).height(3).build();

// For comparison - your constructors. It's less obvious what is length, 
// width or height
Box box1 = new Box(1);
Box box2 = new Box(1,2);
Box box3 = new Box(1,2,3);
于 2011-01-12T21:13:54.773 に答える