抽象类:声明一个抽象类,就是在类的声明开头、在Class关键字的前面使用关键字abstract
下面定义一个抽象类,代码如下:
abstract classA{abstract voidcallme();voidcallmetoo(){
System.out.println("This is a concrete method.");
}
}class B extendsA{voidcallme(){
System.out.println("B‘s implementation of callme.");
}
}classAbstractDemo{public static voidmain(String args[]){
B b= newB();
b.callme();
b.callmetoo();
}
}
分析抽象类的代码,得出抽象类的一些特性:
1、 定义一个抽象类,必须使用关键字abstract;
2、 抽象类不存在对象,也就是说,不能使用new运算符直接实例化抽象类;
3、 抽象类不能声明抽象的构造方法,也不能声明抽象的静态(static)方法;
4、 抽象类的所有子类,要么实现父类中的所有抽象方法,要么自己也声明为抽象类;
5、 抽象类中的方法,可以定义为抽象方法(用abstract关键字),也可以为普通方法;[注意以上第3点中的区别];
6、 抽象类只能继承(extends)使用,也就是说父类为抽象类时,它的直接子类只有一个,这也是继承的特性;
接口:声明一个接口,使用interface关键字,可以指定类必须执行哪些工作,但是只定义工作的模版(方法),不具体实现工作的内容。
下面定义一个接口,代码如下:
interfaceCallback{public voidcallback(String param);
}class InterfaceDemo implementsCallback{public voidcallback(String who){
System.out.println("callback called with "+who);
}public static voidmain(String[] args)
{
InterfaceDemo ifd= newInterfaceDemo();
ifd.callback("me");
}
}
分析接口的代码,得出接口的一些特性:
1、 定义一个接口,必须使用关键字interface;
2、 接口不能直接实例化,并且它里面的方法是没有方法体的;[注意:实际上,它们是抽象方法,在接口中指定的所有方法都可以没有默认实现]
3、 实现接口的每个类,都必须实现接口中定义的所有方法;
4、 一旦定义了接口,任意数量的类都可以实现(implements)该接口,此外,一个类也可以实现任意数量的接口,使用逗号隔开;[注意:如果在类实现的两个接口中都声明了同一个方法,那么这两个方法的客户都将可以使用该方法]
5、 接口可以声明变量,它们被隐式地标识为final和static,这意味着实现接口的类不能修改它们,同时在接口必须初始化它们;
6、 在接口的实现类中,实现接口方法时,必须将方法声明为public;
7、 虽然接口不能直接实例化,但可以将变量声明为使用接口而不是类的对象引用;[代码如下:]
Callback c = newInterfaceDemo();
c.callback(“me”);//注意:变量c被声明为接口类型Callback,此时,可以使用c访问callback()方法,但是c不能访问InterfaceDemo类中的其他任何成员,接口的引用变量只知道由接口声明的方法。
8、 如果一个类实现了一个接口,但没有实现该接口定义的全部方法,那么必须将该类声明为抽象类(abstrace);
9、 在声明嵌套接口的类或接口之外,嵌套接口的名称必须是完全限定的;[代码如下:]
classA{//定义嵌套接口
public interfaceNestedIF{boolean isNotNegative(intx);
}
}class B implementsA.NestedIF{public boolean isNotNegative(intx){return x<0?false:true;
}
}classNestedIFDemo{public static voidmain(String[] args)
{
A.NestedIF nif= newB();if(nif.isNotNegative(10)){
System.out.println("10 is not nogative");
}if(nif.isNotNegative(-10)){
System.out.println("this won't be displayed");
}
}
}//注意:类A定义了成员接口NestedIF,并且声明为public,B类通过指定接口名称完全限定来实现嵌套接口:implements A.NestedIF
10、 接口可以通过关键字extends继承另一个接口,语法和继承类相同;