抽象类为什么不能实例化(new)

本文探讨了抽象类不能被实例化的原因,包括面向对象设计原则、内存分配问题及设计层面考量。解释了抽象类的存在意义及其在多态实现中的作用。

抽象类为什么不能实例化(new)

答案是 规定。

第一点:回归问题最初, 我们为什么要实例化?
我们先逆向思维来考虑,从面向对象的思想来看:

我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此我们需要对象,因此我们需要实例化。

那么回归本问题,什么是抽象类?

抽象:就是不具体的意思。类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以实例化一个苹果,但你不能实例化一个水果(这个现实中存在的实物)。

2.内存考虑:

对象实例化的时候,关键字new向JVM申请内存,这个类的成员(成员变量,成员方法)会被保存到内存中。而抽象类,没有具体的成员(成员变量,成员方法),没办法准确分配内存。

3.现实逻辑:

按照现实逻辑,抽象是从现实实物的抽离,总结,比如定义一个动物类接口。这个接口是所有动物所共有的特点组成在一起,但是并不能组成现实中真真正正存在的物种。那么为什么要有抽象类?

4.设计层面:

为了实现多态,当某些类只希望作为父类使用,不希望被实例化。也就是我们从上层设计角度,就不希望有些类被实例化。当我们进行设计的时候需要尽量依赖父类,越向上层的类越稳定,不容易被修改。

综上所述:现实逻辑,面向对象,设计,内存都不希望我们实例化抽象类,所以 编译器规定不能实例化。

还需要注意的一点是实例化和有没有构造方法没有关系,构造方法只是初始化对象的,new关键字向JVM申请内存来创建对象的。

Java中,抽象类(Abstract Class)是一种不能直接实例化,其设计初衷是为了被继承并作为其他的基抽象类不能用来创建对象的原因主要与其特性和面向对象设计原则相关。 抽象类通常包含一个或多个没有实现的抽象方法,这些方法只有声明而没有方法体。由于这些方法没有具体的实现,如果允许直接创建抽象类的对象,那么在调用这些抽象方法时就会出现执行上的问题,因为它们并没有定义具体的行为。例如,一个抽象类可能定义了一个抽象方法 `public abstract void eat();`,而该方法的具体实现需要由子来完成[^1]。 此外,抽象类的设计意图是为了支持多态性,这是面向对象编程的一个核心概念。当一个抽象类被具体子继承后,可以通过子的实例来实现多态,即父引用可以指向子对象,并且调用的是子重写的方法。如果直接创建了抽象类的对象,则无法利用多态特性来调用子特有的实现[^3]。 虽然抽象类本身不能直接创建对象,但这并不意味着它完全没有构造器或者初始化逻辑的意义。实际上,抽象类可以拥有构造方法,这些构造方法会在子实例化时被调用,以确保父部分能够得到正确的初始化。这种机制保证了即使抽象类不能实例化,它仍然可以在子对象创建过程中发挥重要作用[^4]。 综上所述,抽象类之所以不能用来创建对象,是因为它们可能包含未实现的抽象方法,以及它们的设计目的是为了作为其他的基础,通过子实例化来体现其功能和价值。抽象类的存在促进了代码的复用性和程序结构的清晰性,同时也强化了面向对象编程中的继承和多态机制。 ```java // 示例:抽象类定义及使用 public abstract class Animal { // 抽象方法 public abstract void eat(); // 非抽象方法 public void sleep() { System.out.println("睡觉"); } } // 具体子实现抽象方法 public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } } // 测试 public class Test { public static void main(String[] args) { // 通过子实例化抽象类 Animal a = new Cat(); a.eat(); // 输出:猫吃鱼 a.sleep(); // 输出:睡觉 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值