一、接口
1.1 抽象类
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回想继承与多态原理,继承树中越是在上方的类越抽象,如鸽子类继承鸟类,鸟类继承动物类等。在多态机制中,并不需要将父类初始化对象,我们需要的只是子类,所以在 Java 语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图形,但它的子类却可以。
抽象类的语法:
public abstract class Test{
abstract void testAbstract(); //定义抽象方法
}
其中 , sbatract 是定义抽象类的关键字。
使用 abstract 关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类畜类被继承之外没有任何意义。
反过来讲,如果声明一个抽象的方法,就必须将承载这个抽象方法的类定义为抽象类,不可能在非抽象类中获取抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。这样在多态机制中,就可以将父类修改为抽象类,将 draw() 方法设置为抽象方法,然后每个子类都重写这个方法来处理。但这又会出现冗余的代码,同时这样的父类局限性很大,也许某个不需要 draw() 方法的子类也不得不重写 draw() 方法。如果将 draw() 方法放置在另外一个类中,这样让那些需要 draw() 方法的类继承该类,而不需要 draw() 方法的类继承图形类,但是在 Java 中规定,类不能同时继承多个父类,面临这种问题,接口的概念便出现了。
1.2 接口
1.2.1 接口简介
接口是抽象类的延伸,可以将它看做是纯粹的抽象类,接口中的所有方法都没有方法体。 上述的问题可以将 draw() 方法封装到一个接口中,是需要 draw() 方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。
接口使用 interface 关键字进行定义,语法:
public interface drawTest{
void draw(); //接口内的方法,省略 abstract
}
public :接口可以像类一样被权限修饰符修饰,但 public 关键字权限用于接口在与其同名的文件中被定义
interface : 定义接口关键字
drawTest : 接口名称
一个类实现一个接口可以使用 implements 关键字
public class Parallelogram extends Quadrangle implements drawTest{
... //
}
在接口中定义的方法必须被定义为 public 或 abstract 形式,其他修饰权限不被 Java 编译器认可,即使不讲该方法声明为 public 形式,它也是 public 。
在接口中定义的任何字段都自动是 static 和 final 的。
eg : 创建类,在类中创建两个继承该类的内部类 ParallelogramUserInterface 和 SquareUserInterface ;再创建 drawTest 接口,并使前两个内部类实现该接口;然后再主方法中分别调用这两个内部类的 draw() 方法。
interface drawTest{ //定义接口
public void draw(); //定义接口方法
}
//定义平行四边形类,该类继承了四边形类,并实现了 drawTest 接口
class ParallelogramgleUseInterface extends QuadrangleUseInterface implements drawTest{
public void draw(){ //由于该类实现了接口,所以需要覆盖 draw() 方法
System.out.println("平行四边形 .draw()");
}
void doAnyThing(){ 覆盖父类方法
//SomeSentence
}
}
class SquareUseInterface extends QuadrangleUseInterface implements drawTest{
public void draw(){
System.out.println("正方形 .draw()");
}
void doAnyThing(){
//SomeSentence
}
}
class AnyThingUseInterface extends QuadrangleUseInterface{
void doAnyThing(){
}
}
public class QuadrangleUseInterface{ //定义四边形类
public void doAnyThing(){
//SomeSentence
}
public static void main(String[] args){
drawTest[] d={ //接口也可以进行向上转型操作
new SquareUseInterface(),new ParallelogramUseInterface()};
for(int i=0;i<d.length;i++){
d[i].draw(); //调用 draw() 方法
}
}
}
运行结果:
正方形 .draw()
平行四边形 .draw()
在本例中,平行四边类与正方形类分别实现了 drawTest 接口并集成了四边形类,所以需要覆盖接口中的方法。在调用 draw() 方法时,首先将平行四边形类对象与正方形类对象向上转型为 drawTest 接口形式。在 Java 中无论是将一个类向上转型为父类独享,还是向上转型为抽象父类对象,或者向上转型为该类实现接口,都是没有问题的。然后使用 d[i] 数组中的每一个对象调用 draw() ,由于向上转型,所以 d[i]数组中的每一个对象分别代表正方形类对象与平行四边形类对象,最后结果分别太哦用正方形类与平行四边形类中覆盖的 draw() 方法。
1.2.2 接口与继承
Java 中不允许多继承,但使用接口可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要继承的接口放置在 implements 关键字后并使用逗号隔开,但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。
多重继承的语法:
class 类名 implements 接口1,接口2,...,接口n
eg :在定义一个接口时使该接口继承另一个接口
interface intf1{
}
interface intf2 extends intf1{
}
来源:CSDN
作者:空零之旅
链接:https://blog.csdn.net/js940814/article/details/80398229