• 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)设计层次不同

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

      

  • 相关阅读:
    《几何与代数导引》例2.7.2
    《几何与代数导引》例2.6
    《几何与代数导引》习题1.37.3
    《几何与代数导引》习题1.37.3
    《几何与代数导引》例2.7.1
    《几何与代数导引》例2.7.1
    《几何与代数导引》例2.7.2
    《几何与代数导引》习题1.38
    《几何与代数导引》例2.6
    Android ApiDemo 笔记(一)Content与Graphics
  • 原文地址:https://www.cnblogs.com/bigbigbigo/p/8422062.html
Copyright © 2020-2023  润新知