13-面向对象--抽象类+接口

一、抽象类(abstract)

1、当一个类在描述事物时,没有足够的信息来描述这类事物,这个类就是抽象类。这类事物都具备某个功能,但功能的内容不明确,该功能不能用{ }结束(定义不了内容),只能用 ; 结束

2、抽象类的由来:抽象类也是向上抽取而来的,但是越向上抽取越不具体 -- 功能的声明相同,但具体的实现方式不同

3、抽象类的特点:

(1)方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中,该类也必须被abstract修饰(抽象方法定义的类就是抽象类)

(2)抽象类不可以被实例化,即不能用new创建对象。因为调用抽象方法无意义(抽象方法没有方法体,无法运行)

(3)抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化。否则,这个子类还是抽象类

4、抽象类中有构造函数,用于给子类对象进行初始化(只要是类,一般都有默认构造函数。一个类的构造函数既可以给本类对象初始化,也可以给子类对象初始化)

5、抽象类也可以不定义抽象方法,目的就是不让该类创建对象,因为这个类创建对象没有意义。通常这个类中的方法有方法体,但是却没有内容(空方法体)

注:一个类里面一个抽象方法都没有,但是却是个抽象类

6、抽象关键字(abstract)不可以和以下关键字共存:

(1)private:抽象方法要被覆盖,私有之后子类不知道,覆盖不了

(2)static:类名调用抽象方法无意义

(3)final:抽象方法要被覆盖,被final修饰的方法不能被覆盖;抽象类要被继承,被final修饰的类不能被继承

注:构造方法(无法覆盖)、类方法(static修饰的方法,可用类名调用)不能声明为抽象方法

7、抽象类和一般类的异同点:

相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员(成员变量、成员函数)

不同点:

(1)一般类有足够的信息描述事物,而抽象类描述事物的信息一般都不足

(2)一般类中不能定义抽象方法,只能定义非抽象方法。而抽象类中可以定义抽象方法,也可以定义非抽象方法

(3)一般类可以被实例化,抽象类不可以被实例化(不能创建对象)

8、抽象类一定是一个父类,因为抽象类必须有子类覆盖才可以使用

9、抽象类中可以定义静态代码块和静态方法(static),但抽象方法不能是静态(static)的

二、接口(interface)

1、接口中的方法都是抽象的,且必须要全部实现。所以接口的权限类型是public,不能用private和protected

2、interface Xxx 编译后的文件也是Xxx.class,是java的运行文件(java最终都是以.class文件来封装字节码数据的)

3、接口中的成员(常见的)都有固定的修饰符(不写默认也有):  -- 修饰符最好不要省略,增强阅读性

(1)全局常量:public static final  -- 接口名调用、值不可改变(常量) -- 一般不在接口中定义成员变量/全局常量

(2)抽象方法:public abstract  -- 覆盖时权限是public

结论:接口中的成员都是公共的权限(权限都是最大的)

4、类与类之间是继承关系,类与接口之间是实现关系。一个类在继承另一个类的同时,还可以实现多个接口(接口不会出现调用的不确定性)

5、一个类实现了接口,就相当于获取了接口中的全部内容。接口不可以实例化,只能由实现了接口的子类覆盖接口中的所有方法后,该子类才可以实例化。否则,这个子类就是一个抽象类

6、继承一个,类属于一个体系。接着用接口的形式来扩展该类的其他功能

7、java支持多继承吗?

    支持。只不过多继承在java中进行了改良,用多实现的方式来体现。但是接口可以进行多继承,原理在于是否有方法体存在

类--类:(单)继承

类--接口:(多)实现

接口--接口:(多)继承

8、接口的特点:

(1)接口是对外暴露的规则

(2)接口是程序的功能扩展

(3)接口的出现降低耦合性

(4)接口可以用来多实现

9、开发时,凡是要让程序提高功能扩展性的,必须要留有接口(凡是对外暴露的内容都可以称为接口)

10、接口和抽象类的异同点:

相同点:都是不断向上抽取而来的,描述都不具体

不同点:

(1)抽象类需要被继承,而且只能单继承。接口需要被实现,而且可以多实现

(2)抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。接口中只能定义抽象方法,必须由子类去实现

注:抽象类有构造函数,而接口没有构造函数

(3)抽象类的继承是 is a 关系(所属关系),在定义该体系的基本共性内容。接口的实现是 like a 关系(像,不是),在定义体系的额外功能

即:类在确定体系(基本功能),接口在确定扩展(额外功能)

额外补充:抽象类是对类抽象(自底向上),接口是对行为抽象(自顶向下)

11、在定义应用程序之前,先把规则定义好,应用程序中就在使用这个规则

12、接口的特点在于两部分,一部分在定义规则并使用规则,另一部分是在实现规则。开发时常做实现的部分,因为接口已经设计好了,我们只需要用类把接口实现了,创建自定义的内容即可

eg:

//定义规则
interface USB {
    public void open();
}
//使用规则
class PC {
    public static void main(String[] args) {
        useUsb(new UPan());    //功能扩展
    }
    //使用规则
    public static void useUsb(USB u) {    //接口类型的引用。使用符合USB接口的设备,降低耦合性
        u.open();
    }
}
//实现规则
class UPan implements USB {    //实现接口才是符合规则
    @Override
    public void open( ) {
        System.out.println("UPan open !");
    }
}定义规则
interface USB {
    public void open();
}
//使用规则
class PC {
    public static void main(String[] args) {
        useUsb(new UPan());    //功能扩展
    }
    //使用规则
    public static void useUsb(USB u) {    //接口类型的引用。使用符合USB接口的设备,降低耦合性
        u.open();
    }
}
//实现规则
class UPan implements USB {    //实现接口才是符合规则
    @Override
    public void open( ) {
        System.out.println("UPan open !");
    }
}

注:接口类型的引用指向的都是自己的子类对象。因为接口不能创建对象,接口的子类只要覆盖了接口中所有的方法,这个子类就可以实例化,该子类就符合这个接口的规则

13、接口的命名规则:在给接口命名时,通常前面会加一个I,以便区分普通类和接口

14、标记接口:

参考链接:https://www.cnblogs.com/xinhuaxuan/p/6349165.html

(1)标记接口是没有任何方法和属性的接口。它仅仅表明它的类属于一个特定的类型,使后面创建的对象拥有某个或某些特权

(2)最常用的接口的继承,是没有包含任何方法的接口,即标记接口

(3)标记接口主要用于以下两个目的:

a. 向一个类添加数据类型。实现标记接口的类不需要定义任何接口方法(标记接口本身没有方法),但该类通过多态性变成一个接口类型

b. 建立一个公共的父接口。可以使用一个标记接口来建立一组接口的父接口

15、接口补充

(1)ISP(Interface Segregation Principle):面向对象的一个核心原则。它表明使用多个专门的接口比使用单一的总接口要好

(2)一个类对另外一个类的依赖性应当是建立在最小的接口上的

(3)一个接口代表一个角色,不应当将不同的角色都交给一个接口

猜你喜欢

转载自blog.csdn.net/ruyu00/article/details/79721223