Java 抽象类和接口

  一、抽象类

  子类的不断具体化,使得父类经常被设计得非常抽象,以至于没有具体的实例与之对应。

        抽象类有属性和方法,但无法通过new创建实例。

  

  1、抽象方法

  抽象方法只有方法声明,没有方法体的方法。它的实现由子类提供

  包含抽象方法的类必须是抽象的,但是也允许声明没有抽象方法的抽象类。

  而非抽象类不能有抽象方法,同时,从抽象父类派生的子类如果不能实现所有的抽象方法,它也必须声明为抽象的。

  子类可以是抽象的,即使它的父类是具体的。

  抽象类可以定义构造方法,且能被子类在构造方法中调用。

 

  2、抽象类的实例化

  通常,在抽象父类中声明子类的公共方法接口,调用者只需要了解抽象类的方法接口,就能知道子类的行为能力。

 

  3、final的作用

  有时候不希望类被其他子类派生或修改,可以用final关键字实现。

  final修饰的类不能被派生~

  final修饰方法,禁止子类重写。

 

  二、继承与组合

  继承是强耦合关系,父类变,子类必须变。而且继承破坏了封装。

  所以实践中,慎用继承,尽量选择组合。

  1、什么是组合?

  在新类里创建已有类的对象。(依赖)表达的是包含关系

  UML图,实线,实心菱形(主体类)

  2、用继承还是组合?

  考虑是否要从新类上转型回父类,若必须上溯,则需要使用继承。否则应该谨慎,防止继承滥用。

 

  三、接口(interface)

  Java中,单继承使得类层次结构更加清晰、易于管理。

  但是一个类可以实现多个接口。类通过暴露方法实现与外界的交互,这些方法形成和外部世界的规约。

  1、理解接口

  接口,像是一种特殊的抽象类,通过一组空的方法体的方法来声明需求。

  类若是实现了接口,就承诺了它会实现的行为。

  这样,接口构成了类和外部世界之间的契约,并且该契约在编译时由编译器强制检查。即接口中定义的所有方法都必须出现在其源代码,否则就不能成功编译。

  不同的类通过实现相同的接口而建立了联系。

 

  2、接口的定义

  接口的访问修饰符:public表明任意类和接口都能使用该接口;deafult表明只有定义在同一个包中的类和接口可以使用

  接口中的属性:默认被public static final修饰,不能被其他修饰符修饰

  接口中的方法:

    • 定义在接口中的方法默认为public abstract,也不能被其他修饰符限定;
    • 接口可以继承多个父接口,也能隐藏父接口的属性,覆盖父接口的方法;
    • 只进行方法声明,没有实现。但是Java 8后可以有default方法的实现;

 

  3、接口的实现

  implements声明要实现的接口,意味着遵循某个契约!

  UML中,类与接口实现关系用带空心三角形的虚线表示。

  实际中,通过接口实现多态比基于继承实现多态应用地更加广泛!!慎用继承!

 

  4、接口的特性

  一个接口,可以继承多个接口,Interface3 Extends Interface0, Interface1, interface……(可能是因为接口中的方法都是抽象方法,且只有方法声明,所以不存在选择哪一个父接口中的方法继承的问题)。

  一个类可以实现多个接口,这弥补了Java单继承的缺陷。(这时要避免多个接口中有方法同名)

 

  接口不是类,当然不能实例化,但是接口可以作为一种引用类型(即接口变量),指向实现了这个接口的类的对象!这就是上节所说的用接口方式实现多态吧,也就是说,可以通过接口变量调用不同的对象的接口方法(当然是实现了该接口的类的实例)。如下例:

public class InterfaceDemo {
    public static void main(String[] args) {
        Dog dog=new Dog();
        Cat cat=new Cat();
        Animals animals=dog;
        dog.talking();
        animals=cat;
        animals.talking();
    }
}
interface Animals{
    void talking();
 }
 class Dog implements Animals{
    public void talking(){
        System.out.println("Dogs:wang~wang~");
    }
 }
 class Cat implements Animals{
    public void talking(){
        System.out.println("Cats:mua~mua~");
    }
 }

 

  5、使用接口注意的点:

  • 接口中的方法的访问权限默认为public;
  • 接口中声明的属性,为public static final,它可以通过实现了该接口的类的类名访问;
  • 接口中没有方法实现,Java 8后可以有缺省实现;
  • 实现接口的非抽象类,必须实现该接口也的全部方法;但是抽象类不用全部实现;
  • 接口变量,必须指向一个实现了该接口的类的对象;
  • 可以用instanceof操作符检查一个对象是否实现了某个特定的接口
  • 实现多接口时,一定要避免方法名的重复

  

  6、接口设计

  接口隔离原则,是接口设计的一个核心原则,是接口设计的最佳实践。

  • 使用多个专门的接口比使用单一的总接口要好;
  • 一个类对另一个类的依赖性应当是建立在最小接口上;

  

  四、接口和抽象类比较

  抽象类和接口是Java中的双骄,相辅相成又各司其职。

  接口和抽象类的不同表现在下面三个方面:

  (1)抽象层次不同

    抽象类是对整个类的整体进行抽象,包括属性、行为,接口只对行为抽象。 

  (2)建模关系不同

    抽象类对有相似特点的类建模,体现的更多是一种继承关系。而接口可以对不相关的类建模。

  (3)设计层次不同

    抽象类是自下而上进行设计;接口只需要定义一个规则。

  

 

posted @ 2018-02-06 14:02  爆炸的果核  阅读(317)  评论(0编辑  收藏  举报