好的,我们假设我有一个名为Pancake的课程。
Pancake.java看起来像这样:
public class Pancake {
public boolean shouldEat() {
return false;
}
}
现在,我根本不想编辑Pancake.java。我想做的就是改变shouldEat()
从不同的类返回的内容,例如“NotPancake.java”。
我知道我是否有像
这样的东西public boolean eat = false;
我可以通过执行类似Pancake.eat = true
之类的操作来轻松改变它,但有没有办法更改shouldEat()
返回的内容,而无需以类似的方式编辑类?
感谢。
答案 0 :(得分:7)
这样做的方法基于Object Oriented programming
public class NotPancake extends Pancake {
@Override
public boolean shouldEat() {
return true;
}
}
这里发生的魔法称为“继承”,是分配给OO的四个元素之一。
这里发生的是您定义从Pancake提供的新结构。
这意味着NotPancake
继承了Pancake
形式。所以NotPancake是一个煎饼。
Pancake p = new Pancake();
Pancake q = new NoPancake();
print(p.shouldEat()); //Will be false
print(q.shouldEat()); //Will be true
这种关系使我们有可能改变行为,我们可以从超类中重新定义所有public,protected和defaults方法。
在我们的子类中,我们定义了一个具有相同签名的方法,我们说这个方法覆盖了前一个方法。在Java中,您应该添加注释@Override
以便另外通知编译器。
这是一种方法。继承很简单,但在编写复杂程序时会产生很多问题,另一种解决方案称为composition。你应该总是喜欢组合而不是继承。
构图基于抽象性。要使用它,需要interface
。接口是对实现它的类的合同的描述。
public interface Dish {
boolean isEatable();
}
界面名称应代表一些抽象的一般概念。
public class Pancake implements Dish {
@Override
public boolean shouldEat() {
return false;
}
}
public class Carrot implements Dish {
@Override
public boolean shouldEat() {
return true;
}
}
用法更不一样。
Dish dish1 = new Pancake();
Dish dish2 = new NoPancake();
print(dish1.shouldEat()); //Will be false
print(dish2.shouldEat()); //Will be true
在这个小例子上很难说明构图的好处。但是展示了coding to interface方法。
答案 1 :(得分:3)
Pancake p = new Pancake() {
public boolean shouldEat() {
return true;
}
};