- 抽象类可以包含抽象方法,也可以不包含。
- 在父类构造器中调用方法,可能造成灾难。
public class Test12 {
public static void main(String[] args) {
SubClass12 sub = new SubClass12();
sub.print();
}
}
abstract class SuperClass12 {
public SuperClass12() {
print();
}
public abstract void print();
}
class SubClass12 extends SuperClass12{
private int i = 9;
public SubClass12() {
}
@Override
public void print() {
System.out.print("子类print:");
System.out.println(i);
}
}
- 接口中的域是自动public static final的,方法是自动public的。在接口中定义的域不能是“空final”,但是可以被非常量表达式初始化。
- 当不能对类进行修改,不能为其实现接口时,可以使用适配器设计模式,将其与现有接口适配。
import java.util.Arrays;
public class Test13 {
public static void main(String[] args) {
Apply.process(new StringProcessorAdapter(new StringProcessor()), "我 是 中 国 人");
Apply.process(new StringProcessorAdapter(new StringProcessor()), "美 好 新 世 界");
}
}
interface Processor {
String name();
Object process(Object input);
}
class Apply {
public static void process(Processor p, Object s) {
System.out.println("using processor:" + p.name());
System.out.println(p.process(s));
}
}
class StringProcessor {
private static long count;
private final long id = ++count;
public String name() {
return this.getClass().getSimpleName() + " " + id;
}
public String process(String input) {
return Arrays.toString(input.split(" "));
}
}
class StringProcessorAdapter implements Processor{
private StringProcessor stringProcessor;
public StringProcessorAdapter(StringProcessor stringProcessor) {
this.stringProcessor = stringProcessor;
}
@Override
public String name() {
return stringProcessor.name();
}
@Override
public Object process(Object input) {
return stringProcessor.process((String)input);
}
}
- 接口也可继承接口,并且可以extends多个接口。
interface interface4 extends interface2, interface3{
}
- 当某个类既继承了某个父类,同时实现了某个接口,需要注意由继承得到的父类方法和要实现的接口方法会不会冲突(方法名参数列表相同,返回值类型不同会造成冲突,根源是重载方法仅通过返回值类型是不能区分开的),而两个方法完全相同不会造成冲突,但此时执行的是实现的接口方法而不是继承过来的父类方法。
public class Test14 {
public static void main(String[] args) {
SubClass14 sub = new SubClass14();
System.out.println(sub.m());
}
}
interface interface1 {
String m();
}
class SuperClass14 {
String m() {
return "SuperClass14的m方法执行!";
}
}
class SubClass14 extends SuperClass14 implements interface1{
@Override
public String m() {
return "实现interface1接口的m方法执行!";
}
}
- 接口可以嵌套在类中,也可以嵌套在接口中。嵌套在类中的接口可以设置为private,并且不能在定义它的类之外被实现;嵌套在另一个接口中的接口自动就是public的,而不能声明为private的,当实现某个接口时,并不需要实现嵌套在其内的任何接口。