关键字:abstract,interface,implements
abstract 抽象类:
1.一个类仅仅提供一组子类共有的行为,而不是具体的实现细节。抽象类表示一个概念,从中派生的类代表的对在这一概念的实施。定义抽象类的主要目的是为他的子类定义公共接口。
2.java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract关键字来修饰一个方法时,这个方法叫做抽象方法。
例:
abstract class vehicle{
abstract void move();
abstract void stop();
}
//定义抽象类 vehicle类 有两种行为 move和stop,2种方法也为抽象方法
3.抽象类的方法是不完全的,它只有一个声明,没有方法体,所以上面的例子不需要加{}
4.从抽象类继承的子类必须覆盖所有的抽象方法,否则它自己会成为一个抽象类
5.一个抽象类可以包含非抽象类的方法和变量,但是,一个非抽象类不能包含抽象的方法
//抽象类可以包含非抽象类的方法和变量
例:abstract class vehicle{
void move(){}
int speed;
}
//非抽象类不可以包含抽象方法
例:horse extends vehicle{
void move(); //这是个抽象方法,这里是不能被编译通过的
} //void move(){} 必须加{}才能证明这个方法不是抽象方法
6.抽象类是不能被实例化的,即不能创建任何抽象类的对象
7.一个抽象类可以不包含抽象方法 譬如上面的例子,void move(){} 是个非抽象方法
8.抽象类在java中表示一种继承关系,而继承关系在本质上是"is a"关系。要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的.(子类方法覆盖父类)
interface 接口:
*同抽象类一样,实现接口的子类必须覆盖接口的所有方法
1.接口可以理解为一个比abstract类更加抽象的类,它更加纯,它的方法全部是抽象的
2.一个接口可以继承多个接口,但只能从接口得到继承
3.Java程序一次只能继承一个类但可以实现几个接口。(普通父类与子类继承只允许单线,子类之允许有一个父类,但可以间接继承到父类上面的类,好比现实生活中的,儿子继承父亲,也可以继承到爷爷)
4.接口不允许有任何具体的方法,只能使没有方法体的方法
例: interface BreathFire{
void breathFire(); //不能加任何方法体
}
5.在接口中所有的成员变量都是加过public static final修饰符的,即使没有声明
例:在接口中
int=500相当于 public static final int=500;
6.声明在接口中的方法,默认加public 访问修饰符,即使你没有声明
7.接口也可以用来定义可被类使用的一组常量
8.对于接口来说并不要求接口的实现者和接口定义在概念上本质是一致的,仅仅是实现了 接口定义的契约而已,表示"has a .. ablility",例如在java中,接口常常被命名为....albe(既能做什么),(Runnable,Cloneable,可以跑得,可以克隆的).接口的含义只是为实现者以供一种功能。
格式:
//有方法的接口
public interface Myinterface{
public void add(int x,int y);
void volume(int x,int y,int z);//这里不加public 和上面是一样,默认加一个public
}
//定义有常量的接口
public interface Yourinterface{
public static final int speed=100;
double dollar= 5.5; //同上,默认加public static final
使用接口:
使用关键字:implements来实现接口,好比extends来继承父类一样
例: public interface Water{ //洗衣机的放水功能
void water();
}
public class Washer implements{
void water(){
System.out.println("洗衣机可以洗衣");
}
}
如果想“实现”多个接口,可以用逗号来隔开接口名
例:public class Nightmare implements CanFire,CanWater,ImmuneEarth
抽象类与接口的比较:
语法定义的角度:
1.抽象类中,可以有自己的变量成员,也可以有非抽象的成员方法,而在接口中,只能有静态并且不可修改的成员变量(既加了public static final修饰符的,不过在接口中一般不定义成员变量),并且所有的成员方法都是抽象的。从某种意义上说,接口是一种特殊形式的抽象类.
2.一个类只能继承一个父类,但可以“实现”多个接口(可实现多种功能).接口不能继承类,但可以继承多个接口
3.在抽象类中,我们可以赋予方法的默认行为(既可以写方法体),而在接口中却不行,方法必须是抽象的,即不能加{}
在以下情况下,某个类将成为抽象类:
1.当一个类中的一个方法或多个方法为抽象方法时
2.当该类为一个抽象类的子类,并且没有覆盖所有抽象类的方法时(抽象类的子类必须覆盖所有抽象父类中的所有方法,否则子类自己也被成为抽象类,编译无法通过)
3.当一个类实现(既继承)一个接口,没有覆盖掉所有的接口的方法时,编译将无法通过