抽象类可以包含抽象方法,也可以不包含。 在父类构造器中调用方法,可能造成灾难。
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的,当实现某个接口时,并不需要实现嵌套在其内的任何接口。