美文网首页
Java编程思想(七)

Java编程思想(七)

作者: MikeShine | 来源:发表于2019-05-12 11:55 被阅读0次

第9章 接口 (Interface)

9.1 抽象类和抽象方法

在 java 中,基类很多时候都只是为了给导出类提供一些公共的通用接口(方法),所以基类只表示一种基本形式。 这时候就有了抽象类的概念。
含有抽象方法的类叫做抽象类。是用 abstract 关键字定义的。抽象方法是说,只有定义,而没有具体实现的方法。

abstract chouxiangfangfa();  // 后面一般不写花括号。

所以这样来看,由于抽象类中含有无实现的方法,所以 抽象类并不能用来创建对象

抽象类无法创建对象
所以,正如上面第一段所说,抽象类生来就是为了继承而存在的。
这里看一下抽象类和普通类的区别:
  1. 抽象类不能创建对象;
  2. 抽象方法必须为可以被继承类访问的(因为继承类需要来写抽象方法的具体实现),所以应该为 public/protected,默认的 pub
  3. 抽象类的继承类必须给出父类中抽象方法的具体实现,否则,子类也必须 用 abstract 关键字定义成抽象类。

9.2 接口

这里的接口,特指 java 中的 Interface 关键字定义的接口(通常情况下,接口泛指别人调用的方法或者函数)。
接口实际上是对抽象类的进一步深化。抽象类中的抽象方法是没有任何实现的方法,而接口中所有的方法都是只有定义,而没有方法体的方法,是一个 极度抽象类
接口除了方法外,也可以包含域,但是隐式地被定义为 static & final。
让一个类遵循某个(也可以多个)特定接口,用 implements 关键字,表示 “interface 只是其外貌,现在要说明其具体是如何工作的”。

抽象类和接口的区别:

  1. 抽象类可以提供成员方法的实现细节,接口只能是 public abstract 方法;
  2. 抽象类中成员变量可以是各种,接口中 只能是 static final
  3. 一个类可以继承一个抽象类,而 一个类可以实现多个接口(extends 只能一个,implements 可以多个)

9.3 完全耦合

9.4 java 中的多重继承

这里说的意思就是,我们可以通过接口来实现多继承的形式。这里用 implements A,B,C 这样形式的关键字即可。看下面的代码:这里的接口就可以向上转型(和类的感觉是一样的),所以下面 main() 函数中,是有向上转型处理的。

package Interface;

interface CanFight{
    void fight();
}
interface CanSwim{
    void swim();
}
interface CanFly{
    void fly();
}

class ActionCharacter{
    public void fight(){}
}

class Hero extends ActionCharacter implements CanFight,
CanSwim, CanFly{
    public void swim(){}
    public void 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);   // 当做 CanFight 来处理
        u(h);   // 当做 CanSwim 来处理
        v(h);
        w(h);
    }
}

9.5 通过继承来扩展接口

意思是说这里的接口不仅可以 implements 实现,还可以 extends 来继承。和类的继承是一样的。

package Interface;

interface Monster{
    void menace();
}
interface DangerousMon extends Monster{  // 由于继承,DangMon 接口有 2 个方法。
    void destroy();
}
interface Lethal{
    void kill();
}

class DragonZilla implements DangerousMon{  // 这里就实现了 其 2 个方法。
    public void menace(){} //
    public void destroy(){}
}

interface Vampire extends DangerousMon, Lethal{
    void drinkBlood();
}

class VeryBadVampire implements Vampire{
    public void menace(){}
    public void destroy(){}
    public void kill(){}
    public void drinkBlood(){}
}

public class HorrowShow{
    static void u(Monster b){b.menace();}
    static void v(DangerousMon s){s.menace();
    s.destroy();}
    static void w(Lethal l){l.kill();}

    public static void main(String args[]){
        DangerousMon mike = new DragonZilla();
        u(mike);
        v(mike);
        Vampire shine = new VeryBadVampire();   // 向上转型
        u(shine);
        v(shine);
        w(shine);
    }
}

9.6 适配接口

9.7 接口中的域

前面我们说过,接口中的 域 自动声明为 static final。

9.8 嵌套接口

接口可以嵌套在其他的类或接口中。

9.9 接口和工厂 factory

生成遵循某个接口对象的典型方式就是 工厂方法 设计模式。
这里所谓的 “工厂方法” ,就是说用一个方法(这里是 getService()方法)来生成接口对象。如下面代码所示,Service接口有两个继承的接口 Imple1 和 Imple2,而 ServiceFactory 也有两个继承接口 分别可以生成 Imple1 接口对象和 Imple2 对象。

package Interface;

// 说的是接口和工厂

interface Service{
    void method1();
    void method2();
}
interface ServiceFactory{
    Service getService();
}

class Imple1 implements Service{
    Imple1(){}  // Package access
    public void method1(){System.out.println("实现1.方法1");}
    public void method2(){System.out.println("实现1.方法2");}
}
class Imple1Fact implements ServiceFactory{
    public Service getService(){
        return new Imple1();
    }
}

class Imple2 implements Service{
    Imple2(){}  // Package access
    public void method1(){System.out.println("实现2.方法1");}
    public void method2(){System.out.println("实现2.方法2");}
}
class Imple2Fact implements ServiceFactory{
    public Service getService(){
        return new Imple2();
    }
}

public class Factories {
    public static void serviceConsumer(ServiceFactory fact){
        Service s = fact.getService();
        s.method1();
        s.method2();
    }
    public static void main(String args[]){
        serviceConsumer(new Imple1Fact());  // upcast
        serviceConsumer(new Imple2Fact());
    }
}
/*output 
实现1.方法1
实现1.方法2
*/

相关文章

网友评论

      本文标题:Java编程思想(七)

      本文链接:https://www.haomeiwen.com/subject/pzoqaqtx.html