有人可以解释如何在以下代码行中使用构造函数

时间:2015-07-10 21:41:19

标签: java constructor

我指的是下面Quack()类中的FlyWithWings()MallardDuck构造函数。这可能是一件简单的事情,但我还没有遇到过以这种方式使用的构造函数。代码是策略模式的一个例子。

public class MallardDuck extends Duck {

    public MallardDuck() {
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

    public void display() {
        System.out.println("I'm a real Mallard duck");
    }
}

public class Quack implements QuackBehavior {
    public void quack() {
        System.out.println("Quack");
    }
}

public class FlyWithWings implements FlyBehavior {
    public void fly() {
        System.out.println("I'm flying!!");
    }
}

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
    }

    public void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }

    abstract void display();

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    public void swim() {
        System.out.println("All ducks float, even decoys!");
    }
}

3 个答案:

答案 0 :(得分:0)

您可以将MallardDuck构造函数更改为调用super(); 并将超级鸭子中的初始化移动到

public abstract class Duck {
FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
  quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }
..
}

 public MallardDuck() {
super();
    }

为了更好地封装,您应该在flyBehavior

中将quackBehaviorDuck定义为受保护

答案 1 :(得分:0)

Quack()FlyWithWings()是默认构造函数。它们默认添加,并在您使用

调用时执行
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();

初始化扩展Duck类的类时,将调用Duck中的构造函数。

执行

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

你将调用Duck的构造函数(实际上并没有做任何事情)。

答案 2 :(得分:0)

如果没有为类定义构造函数,Java编译器将为您创建它。但是,默认构造函数不包含任何有用的东西,只调用super(),它是超类的构造函数。

在您的情况下,您正在为Quack和FlyWithWings类调用隐式定义的构造函数。这些构造函数只包含对超类的调用,在您的情况下,它是Object类,因为它们不扩展任何其他类。 (顺便说一下,Object类的构造函数实际上什么都不做)。

所以基本上,你所做的只是实例化一个基本上空的对象,只是为了使用它的quack()方法,而对fly()方法也是如此。