抽象类为什么不能被实例化?
1.第一点:回归问题最初, 我们为什么要实例化?
我们先逆向思维来考虑,从面向对象的思想来看:
我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此我们需要对象,因此我们需要实例化。
那么回归本问题,什么是抽象类?
抽象:就是不具体的意思。类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以实例化一个苹果,但你不能实例化一个水果(这个现实中存在的实物)。
2.内存考虑:
对象实例化的时候,关键字new向JVM申请内存,这个类的成员(成员变量,成员方法)会被保存到内存中。而抽象类,没有具体的成员(成员变量,成员方法),没办法准确分配内存。
3.现实逻辑:
按照现实逻辑,抽象是从现实实物的抽离,总结,比如定义一个动物类接口。这个接口是所有动物所共有的特点组成在一起,但是并不能组成现实中真真正正存在的物种。那么为什么要有抽象类?
4.设计层面:
为了实现多态,当某些类只希望作为父类使用,不希望被实例化。也就是我们从上层设计角度,就不希望有些类被实例化。当我们进行设计的时候需要尽量依赖父类,越向上层的类越稳定,不容易被修改。
综上所述:现实逻辑,面向对象,设计,内存都不希望我们实例化抽象类,所以 编译器规定不能实例化。
关于抽象类可以看这篇文章
还需要注意的一点是实例化和有没有构造方法没有关系,构造方法只是初始化对象的,new关键字向JVM申请内存来创建对象的。
偶做前堂客
祝你天天开心
在未知的时间
在未知的地点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了