Java接口
创建抽象类是为了希望通过这个接口操作一系列类。
抽象方法:仅有声明而没有方法体
abstract void f();
包含抽象方法的类叫做抽象类。
如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义。如果不这样做,导出类便也是抽象类。
interface关键字使抽象的概念更向前迈进了一步。
interface这个关键字产生一个完全抽象的类,它根本没有提供任何具体的实现。它允许创建者确定方法名,参数列表,返回类型,但是没有任何方法体。接口只提供了形式,并未提供任何具体实现。
一个接口表示:所有实现了该特定接口的类看起来都应该是这个样子的。
要想一个类遵循某个特定接口,需要使用implements关键字。
import java.util.*;
enum Node{
MIDDLE_C,C_SHARP,B_FLAT
}
interface Instructment{
public void play(Node n);
public void adjust();
}
class Winds implements Instructment{
public void play(Node n){
System.out.println(this+".play() "+n);
}
public String toString(){
return "Winds";
}
public void adjust(){
System.out.println(this+".adjust()");
}
}
class Percussion implements Instructment{
public void play(Node n){
System.out.println(this+".play() "+n);
}
public String toString(){
return "Percussion";
}
public void adjust(){
System.out.println(this+".adjust()");
}
}
class Stringed implements Instructment{
public void play(Node n){
System.out.println(this+".play() "+n);
}
public String toString(){
return "Stringed";
}
public void adjust()
{
System.out.println(this+".adjust()");
}
}
class Brass extends Winds{
public String toString(){
return "Brass";
}
}
class WoodWinds extends Winds{
public String toString(){
return "WoodWinds";
}
}
public class Music2{
public static void tune(Instructment i){
i.play(Node.MIDDLE_C);
}
static void tuneAll(Instructment[] e){
for(Instructment i:e)
tune(i);
}
public static void main(String[] args){
Instructment[] e={
new Winds(),
new Percussion(),
new Stringed(),
new Brass(),
new WoodWinds()
};
tuneAll(e);
}
}
多重继承:如果要从一个非接口的类继承,那么只能从一个类继承,其余的基元素都必须是接口,需要将所有的接口名都置于implements关键字之后,用逗号将它们一一隔开。可以继承任意多个接口,并可以向上转型为每个接口,因为每个接口都是一个独立的类型。
import java.util.*;
interface CanFight{
void fight();
}
interface CanSwim{
void swim();
}
interface CanFly{
void fly();
}
class ActionCharacter{
public void fight(){
System.out.println("Fight");
}
}
class Hero extends ActionCharacter
implements CanFight,CanSwim,CanFly{
public void swim(){
System.out.println("Swim");
}
public void fly(){
System.out.println("Fly");
}
}
public class Adventure{
public static void t(CanFight x){
x.fight();
}
public static void u(CanSwim x){
x.swim();
}
public static void v(CanFly x){
x.fly();
}
public static void w(ActionCharacter x){
x.fight();
}
public static void main(String[] args){
Hero h=new Hero();
t(h);
u(h);
v(h);
w(h);
}
}