接口
恰当的原则是优先使用类而不是接口。从类开始,如果使用接口的必要性变得很明确,那么就重构。接口是一个伟大的工具,但它们容易被滥用。
接口中可添加静态方法与默认方法
一个类实现一个接口的同时必须实现该接口的所有方法(可以不用实现默认方法即关键词为为 default的方法)
extends 只能用于单一类,但是在构建接口时可以引用多个基类接口。注意到,接口名之间用逗号分隔。
模板设计模式
把方法抽象封装到接口或抽象类中,在别的类中对其进行实现即,变得是内容,而其框架则始终如一。
就像我与大厨炒西红柿:大家都是加油、加鸡蛋、加西红柿。只是做出来时味道不同罢了。
接口与抽象类(选择)
特性
接口
抽象类
组合
新类可以组合多个接口
只能继承单一抽象类
状态
不能包含属性(除了静态属性,不支持对象状态)
可以包含属性,非抽象方法可能引用这些属性
默认方法 和 抽象方法
不需要在子类中实现默认方法。默认方法可以引用其他接口的方法
必须在子类中实现抽象方法
构造器
没有构造器
可以有构造器
可见性
隐式 public
可以是 protected 或友元
策略设计模式
创建一个能根据传入的参数类型从而具备不同行为的方法称为策略设计模式。
import java.util.*;
class Processor {
/*父类*/
public String name() {
return getClass().getSimpleName();
}
public Object process(Object input) {
return input;
}
}
/*子类开始,将所有传入类设置为同一个类的子类*/
class Upcase extends Processor {
// 返回协变类型
@Override
public String process(Object input) {
return ((String) input).toUpperCase();
}
}
class Downcase extends Processor {
@Override
public String process(Object input) {
return ((String) input).toLowerCase();
}
}
class Splitter extends Processor {
@Override
public String process(Object input) {
// split() divides a String into pieces:
return Arrays.toString(((String) input).split(" "));
}
}
/*策略开始*/
public class Applicator {
public static void apply(Processor p, Object s) {
//(Processor p。已知:所有传入类设置为同一个类的子类,故其父类的变量可以作为引用
System.out.println("Using Processor " + p.name());//获取其类名
System.out.println(p.process(s));//根据其类名调用其覆盖的相应的process方法
}
public static void main(String[] args) {
String s = "We are such stuff as dreams are made on";
//进入策略,以下3类均为Processor子类,故可用Processor p分别引用以下3个不同类型的对象
apply(new Upcase(), s);
apply(new Downcase(), s);
apply(new Splitter(), s);
}
}
常量字段
接口中的字段都自动是 static 和 final
public interface Months {
int
JANUARY = 1, FEBRUARY = 2, MARCH = 3,
APRIL = 4, MAY = 5, JUNE = 6, JULY = 7,
AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10,
NOVEMBER = 11, DECEMBER = 12;
}
注:以上代码除中文注释外均来自《on java 8》