抽象类
- 抽象类中既有方法的实现和抽象的方法。有一个或多个抽象方法的类必须声明为抽象类,没有抽象方法的类也可以声明为抽象类。
- 抽象方法访问修饰符为
public
,protected
,default(什么也不写)
。 - 抽象类不能实例化。如果将一个类声明为
abstract
,就不能创建这个类的对象;但是可以定义一个抽象类的对象变量,它只能引用非抽象子类的对象。 - 抽象类中可以有实例域和构造方法。
- 子类使用
extends
来继承抽象类,如果子类不是抽象类的话,那么需要提供抽象类所有抽象方法的实现。
abstract class B{
private String s;//抽象类可以有实例域
public B(String s){//抽象类可以有构造方法
this.s=s;
}
public String getS(){
return s;
}
public abstract String getDescription();
}
public class Outer {
public static void main(String args[]){
B b=new B("Hello World!"){ //建立匿名内部类,并实现getDescription方法
public String getDescription(){ //在实现的时候不用在写abstract关键字
return "implement getDescription methon!";
}
};
System.out.println(b.getS());
System.out.println(b.getDescription());
}
}
输出结果
Hello World!
implement getDescription methon!
接口
- 接口中只有方法的声明,但是没有方法的实现,也可以没有任何方法。
- 接口中的方法自动为
public
。因此,在接口中声明方法时,不必提供关键字public
- 接口中可以有常量,接口中的域被自动设为
public static final
。 - 接口不能有构造方法,并且不能构造接口对象,但是声明接口变量。
- 子类通过
implements
来实现接口,该子类需要提供所有方法的实现。
interface B{ //定义接口
String getDescription(); //等价于public abstract String getDescription();
}
class BImpl implements B{ //实现B接口
private String s;
public BImpl(String s){
this.s=s;
}
@Override
public String getDescription() {
return s+",i implement getDescription methon of interface B!";
}
}
public class Outer {
public static void main(String args[]){
B b=new B(){ //建立匿名内部类并实现接口B中的getDescription方法
private String s="Hello";
public String getDescription(){ //在实现的时候不用在写abstract关键字
return s+",i implement getDescription methon of interface B!";
}
};
System.out.println(b.getDescription());
B b1=new BImpl("Hello World");
System.out.println(b1.getDescription());
}
}
输出结果
Hello,i implement getDescription methon of interface B!
Hello World,i implement getDescription methon of interface B!