我指的是下面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!");
}
}
答案 0 :(得分:0)
您可以将MallardDuck构造函数更改为调用super(); 并将超级鸭子中的初始化移动到
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
..
}
和
public MallardDuck() {
super();
}
为了更好地封装,您应该在flyBehavior
类
quackBehavior
,Duck
定义为受保护
答案 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()
方法也是如此。