Java高级3——面向对象中多态、抽象类、接口总结


前言

最近学习了多态、抽象类、接口相关知识,有些混乱,便作笔记总结一下它们的特点和使用方法以及我个人的理解。


一、多态

1. 含义和基本思想

多态含义上是从一个父类派生出多个子类,可以使子类之间有不同的行为,这种情况称之为多态。
我个人的理解,就是父类(在不同情况下)有多种表达形式,如果换算到现实世界就是人本身是人(父类),但是可以有不同身份或者干不同的事情,如果说没有多态而只有继承的话,那可能就要多创建多几个对象,而这样就会有所冗余,所以多态从功能上可以支持对对象(父类)多种表达的一种归类管理和总结表达,这样在逻辑上就能更好区分理解还有在项目上可以更好管理表现在代码会更加简洁且可维护性更好。

2. 条件

  • 子类继承父类

  • 子类改写父类方法

    子类是来表现(通过改写)父类不同形态的东西,本身肯定要先继承父类基本(相同)的东西。

  • 父类引用指向子类对象

    整体是父类,但是具体实现是子类对象

3. 语法格式

	 父类类型(接口) 引用变量名 = new 子类类型();

4. 特点

  • 当父类类型的引用指向子类类型的对象时(即满足多态时),父类类型的引用可以直接调用父类独有的方法,但不可以直接调用子类独有的方法和成员变量,其差别主要是在子类和父类的同名(重写)方法上

    虽然你是我的儿子(不同形态),但毕竟还是我(父类)引用的,还是我charge,而不像继承是单独出来 继承:子类类型 引用变量名 = new 子类类型 ,但是注意,多态与继承子类使用体现差别在于使用上,子类继承父类内容没差的,只是你用不了而已。

    当需要调用子类方法或实例变量的时候需要进行类型转换,引用类型的类型转换有自动类型转换和强制类型转换,前者就是多态使用的子类类型引用指向父类类型变量(向上转型),后者是强制类型转换即父类转子类(要有继承关系),可以使用关键字instanceof防止报错,下面是一些用法

		Teacher t2 = (Teacher) p1; // p1 是父类People的引用变量
        t2.teach(); // Teacher子类的私有方法

      //可能存在问题:编译阶段有继承关系就可以强制转换,但是如果类型不符合运行报类型转换异常(ClassCastException),建议用instance of
      //某个方法使用p1当参数但传入的变量不确定的时候这样写在方法里面
       
        if(p1 instanceof Student){
            Student s2 = (Student) p1;
            s2.test();
        }else {
            Teacher t2 = (Teacher) p1;
            t2.teach();
        }
  • 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类重写的版本(动态绑定,即编译期只看父类,执行时候看实际指向)
  • 对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本

5. 优点

  • 逻辑简化和统一管理

    可以认为这是父类(对象)的不同表达(分化),统一管理(用父类的对象名称)是你以后可以替换或者拓展都可以很方便,可以消除类型间耦合关系。

6. 总结

  1. 多态是让父类(对象)能有多种表达,(逻辑)主体还是父类(对象是子类,不能调用独有方法之类)
  2. 继承是前提,改写是基础,作用是逻辑简化和统一管理(可扩展替换)

二、抽象类

1. 含义和基本思想

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

一个还需要补充内容的故而不能实例化的类便是抽象类

2. 抽象方法

2.1 含义

没有具体内容(方法体)的方法

public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   
   //其余代码
}

2.2 注意

  • 如果一个类包含抽象方法,那么该类必须是抽象类
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类
  • private、final、static等关键字不能跟abstract共同修饰一个方法

抽象类本身就是一个需要补充信息去继承执行的类,所以任何阻止这些操作的都是没必要的

2.3 特点

  • 除了不能实例化对象,其他都有(成员变量、构造方法等)
  • 不一定有抽象方法,有的肯定是抽象类
  • 只能继承使用,继承的类不重写抽象方法则也变抽象类

正如上面说的本质,它本身是一个待补充信息执行的类(模板),所以没必要实例化对象,Java是规范性很强的语言,也不一定就要有抽象方法(可以理解抽象类是一个让你强制继承的类,所以一般都是提前设计的),但一定只能继承使用,而且必须实现所有功能(工具本身不能作主体,而继承之后的类不重写完全部本质上也变成了需要补充信息的主体)

2.4 优点

  • 概念抽象化支持多态

可以把它理解为继承的子集,将父类这个概念浓缩抽象成一个基础(指向)类,因为很多继承本质上也许父类就是用来继承的,父类根本就没必要存在,而抽象类的出现就是相当于把它抽象化,省去没必要的实体

3. 总结

  1. 抽象类本质是一个支持多态需要补充信息去继承实现的(基础)类,所有的操作都是围绕这个本质去实现的
  2. 概念简化支持多态

4. 补充注意

Java一个类不能继承一个以上的非抽象类,当一个类需要继承另外一个实体类而又要实现接口的时候,需要用继承抽象类(而抽象类继承原来实体类)再实现方法

// 具体类
class Vehicle {
    // 具体类的属性和方法
}

// 抽象类
abstract class ElectricVehicle extends Vehicle {
    // 抽象类可以包含具体方法和抽象方法
    public void start() {
        // 具体方法的实现
    }
    
    // 抽象方法,子类必须实现
    public abstract void charge();
}

// 接口
interface Charging {
    void charge();
}

interface Navigation {
    void navigate();
}

// ElectricCar 类继承自 ElectricVehicle 抽象类,并实现 Charging 和 Navigation 接口
class ElectricCar extends ElectricVehicle implements Charging, Navigation {
    // ElectricCar 类必须实现 ElectricVehicle 的抽象方法和 Charging、Navigation 接口的方法
    public void charge() {
        // 充电方法的实现
    }

    public void navigate() {
        // 导航方法的实现
    }
}

抽象类和接口其实各有各的负责,不是完全功能重复,简要来说,抽象类更加注意的是不同类之间的相同之处(概念一样但实操不同)并提供基本的信息将其统一起来,同时能让它们有不同的实操,而接口更多是在这个基础上给抽象类再进行拓展,即抽象类用于建立类之间的层次结构和共享通用多态特性,而接口用于定义行为契约和更好实现行为多态性。

三、接口

1. 概念和基本思想

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

简要来说,接口是更抽象且可多继承的抽象类,但从功能体现来说,像是对象外展性的抽象类,用于对对象(类)功能的拓展,所以本身不太需要基础信息,而是需要实现各种方法,而抽象类是对象(类)内聚性,更加关注不同类之间的整合。

2. 特点

2.1 基本组成上

  • 默认常量和抽象方法,每一个变量和方法前面分别会被隐式指定public abstract 和 public static final
  • 比起抽象类连补充信息的机会都没有了,一般只有常量和抽象方法

    Java 1.8之后可以有静态方法和方法体以及默认方法,1.9后允许将方法定义为private,但还是不能有静态代码块(抽象类可以)这些主要考虑到完全抽象的接口还是有些不便,不如保留这个思想概念但是加入一些工程实际操作会更加方便的东西,让以后实现类拓展的时候不用写那么多代码。

2.2 使用方法上

  • 接口可以继承多个接口,但是只有类可以实现接口,其余跟抽象类差不多,类都要全部实现所有方法,否则变成抽象类

2.3 优点

  • 支持多继承和多实现(弥补类不能多继承的拓展)

    我个人理解以前不支持多继承主要还是因为抽象类方法上还有部分实质信息(不是全都抽象方法,而这些信息从抽象层面看如果多继承(同一个成员方法名字一样但是内容不同会不知道执行谁的,跟子类不多继承原因一样)可能会造成冲突,Java作为一个规范性很强你也可以理解为害怕程序员犯蠢的语言,它会从设计上就避免这种操作,虽然会有些不便,但保证不会出错,但也许确实不便,以至于后面又加了些特性功能,但即便如此,所谓静态方法也是含义大家共享的方法,也是从开始设计上就应该不会有冲突的。


四、总结

从组成成分来说,抽象类以及接口和类区别不太大(成员变量、实例方法都有),只是少了自己操作的部分(成员变量的具体内容、抽象类构造器只能改写不能构造),根本来说,多态这个特点相对于继承来讲更多像是逻辑上的复用简化,继承是代码上的复用,通过多态可以让一个父类表现出不同特点从而可以用一个父类囊括(管理)众多子类提高代码的维护性和拓展性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值