10.8-抽象类、接口与多态

抽象类

抽象(abstract):笼统、模糊、不具体

抽象类的特点

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

  2. 抽象类不可以被实例化(不可以使用new)

  3. 抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化;否则,这个子类仍为抽象类。

  4. 抽象类和抽象方法非常适合做”系统的分析和设计的工具“。

注意问题

  1. 抽象类中拥有构造器,用于给子类进行初始化。

  2. 抽象类中可以不定义抽象方法,但此行为比较少见。

  3. 抽象关键字不可以和private static final 关键字共存。

  4. 抽象类一定是父类。

  5. 一般类和抽象类的的异同

    • 抽象类和一般类都是用来描述事物的,都在内部定义了成员。

    • 抽象类描述事物的信息可能不足,一般类则有足够的信息描述事物。

    • 一般类中不能定义抽象方法,但抽象类中可以定义抽象方法,也可以定义非抽象方法。

    • 一般类可以被实例化,但抽象类不可以被实例化。

接口(interface)

格式

interface 接口名{
    
}

注意问题

  • 接口中成员的修饰符都是固定的

  • 成员常量:public static final

  • 成员方法:public abstract

  • 类与类之间可以是继承(extends)关系,类与接口之间是实现(implements)关系。

  • 接口不可以被实例化,只能由实现了接口的子类覆盖了接口中所有的抽象方法中,该子类(实现类)才可以实例化;否则该实现类依旧为抽象类。

特点

  1. 接口是一个特殊的抽象类(纯抽象类)

  2. 接口是程序的功能扩展

  3. 接口的出现降低了代码的耦合性

    • 耦合性:也成为块间联系;指的是软件系统结构中各个模块之间相互联系紧密程度的一种度量。

    • 内聚性:也称为块内联系;指的是模块内部各个元素之间相互联系紧密程度的一种度量。

  4. 接口可以用来多实现。

  5. 类与接口之间是实现关系,而且一个类在继承另外一个类的同时还可以实现多个接口。

  6. 接口中的属性默认是常量。

  7. 接口中的方法一定是public abstract修饰的。

  8. 接口和接口之间,可以有多继承关系。

  9. 抽象类与接口的不同

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

    2. 抽象类既可以定义抽象方法,也可以定义非抽象方法;接口中只能定义抽象方法。

    3. 抽象类中有构造器,但接口中没有构造器。

多态

方法的多态

方法的重载

对象的多态

父类型引用指向子类的对象

class Animal{}
class Cat extends Animal{}
Animal a = new Cat();

instanceof运算符

Java中的instance运算符是一个二元运算符,它的作用是用来判断该运算符左边的对象是否属于右边类的实例

多态的特点

成员变量

编译时

参考引用类型变量所属的类中是否有调用的成员变量。有,编译通过;无,编译失败。

运行时

参考引用类型变量所属的类中是否有调用的成员变量。并运行该所属类中的成员变量。

简单说

编译与运行都看左边的类型

成员方法

编译时

参考引用类型变量所属的类中是否有调用的成员方法。有,编译通过;无,编译失败。

运行时

参考对象所属的类中是否有调用的成员方法

简单说

编译看左边,运行看右边

访问控制修饰符

修饰Java类、属性、方法的可见范围

​ 类内 包内 子类 任意

public √ √ √ √ protected √ √ √ default √ √ private √

private:私有的,仅仅在类的内部可见 public:公有的,任意位置可见 protected:受保护的,在同一个包中和子类中可见 default:默认的,什么都不写,在同一包中可见

访问控制的原则:尽可能的封装

JavaBean

指的是符合某种特点规范的Java类

规范

  1. 所有的属性私有化

  2. 提供默认的构造器

  3. 提供所有属性的get/set方法

  4. 实现Serializable接口(序列化接口)

最后更新于