通常可以说四边形具有4条边,或者更具体点,平行四边形是具有对边平行且相等特性的特殊四边形,等腰三角形是其中两边相等的三角形,这些描述都是合乎情理的,但是对于图形对象却不能使用具体的语言进行描述,他有几条边,究竟是什么图像,没有人能说清楚,这种类在java中被定义为抽象类。
一:抽象类
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回想继承与多态的原理,继承树中越是在上边的类越抽象,如鸽子类继承鸟类,鸟类继承动物类等。在多态机制中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在java中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图形,但他们的子类可以。
抽象类的语法:
public abstract class Test{
abstract void testAbstract();//定义抽象方法
}
其中,abstract是定义抽象类的关键字。
使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法;抽象方法没有方法体,这个方法本身没有任何意义,除非他被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。
反过来讲,如果声明一个抽象的方法,就必须将继承这个抽象方法的类定义为抽象类,不可能在非抽象类中获得抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
抽象类被继承后需要实现其中所有的抽象方法,也就是保证相同的方法名称,参数列表和相同返回值类型创建出非抽象方法,当然也可以是抽象方法。
继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。这样在多态机制中,就可以将父类修改为抽象类,将方法修改成抽象方法,然后每个子类都重写这个方法类处理。但这又会出现我们刚探讨的多态是讨论的问题,程序中灰有太多冗余的代码,同时这样的父类局限性很大,也许某个不需要父类方法的子类也不得不重写方法。如果将方法放置在另外一个类中,这样让那些需要方法的类继承该类,而不需要方法的类继承图形类,但所有的子类都需要图形类,因为这些类是从图形类中被导出的,同时某些类还需要方法,但是在java中规定,类不能同时继承多个父类,面临这种问题,接口的概念就出现了。
二:接口
1.接口简介
接口是抽象类的延伸,可以将它看做是纯粹的抽象类,接口中的所有方法,都没有方法体。对于上面的问题,可以将方法封装到一个接口中,使需要方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。
接口使用interface关键字进行定义,其语法如下:
public interface drawTest{
void draw();//接口内的方法,省略abstract关键字
}
*public :接口可以像类一样被权限修饰符修饰,但public关键字仅限用与接口在与其同名的文件中被定义。
*interface :定义接口关键字。
*drawTest:接口名称。
一个类实现一个接口可以使用implements关键字,代码如下:
public class S extends Y implements drawTest{
········
}
注意:在接口中定义的方法必须被定义为public或abstract形式,其他修饰符权限不被java编译器认可,即使不将该方法声明我public形式,他也是public。
说明:在接口中定义的任何字段都自动是static 和final的。
2、接口与继承
我们知道在java中不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要继承的接口放置在implements关键字后并使用逗号隔开,但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。
多重继承的语法如下:
class 类名 implements 接口1,接口2,接口3·····,接口n
在定义一个接口时可使该接口继承另外一个接口:
interface f1{
}
interface f2 extends f1{
}