Java核心(接口、继承和多态-接口)

喜夏-厌秋 提交于 2019-11-26 21:59:49

一、接口

    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{
}




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!