小白日更第五十六天->抽象类和接口实例化问题

先看代码然后引出今天的问题

package com.qcby.algorithm;
public class Test01 {
    public static void main(String[] args) {
     C c = new C(new String("大众"));
    }
}
interface Fruit{
    void f();
}
abstract class Car{
    public Car(String str){
        System.out.println("抽象的车");
    }
    abstract void ff();
}
class C extends Car implements Fruit{
    public C(String str){
        super(str);
        System.out.println("抽象的车"+str);
    }
    @Override
    public void f() {
        System.out.println("实现接口方法");
    }
    @Override
    void ff() {
        System.out.println("具体的车");
    }
}

代码的运行结果:
在这里插入图片描述
在C类的构造函数中如果我不调用super()也就是调用C类的父类也就是B抽象类的构造函数就会报错。
在这里插入图片描述
现在把这行代码注释掉运行:
在这里插入图片描述
我们知道抽象类是可以有构造函数的,但是抽象类不可以直接使用new来创建类的实例。同时我们在初始化一个类的时候会先初始化这个类的父类,这里我理解的必须在抽象类的实现类的构造函数中调用父类构造器的原因是,父类自己不能初始化,但是可以通过子类来完成父类的初始化工作。
网上有很多解释,说抽象类是不完整的类,无法分配内存空间

其中有一个解释比较有意思,大致意思是:
抽象类就相当于我和你说:走我带你去赚大钱(赚大钱这个行为就是抽象的,一点也不具体,就会吹牛,所以jvm不会给你分配内存空间)。你说的这么模糊,我肯定不会投资的呀。
但是现在另外一个人说:走我们一起去搞个线上教育的平台,从去年开始由于疫情的原因,线上教育快速发展。我一琢磨,这个可以啊,于是我就投资了(jvm就给这个类分配内存空间了)

其实我是觉得面向对象就是对现实生活中抽象的东西的具体化。我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,所以我们需要对象,所以我们需要实例化。

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

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

而接口我理解的是完完全全的抽象,因为在抽象类中我们还可以定义普通方法,而在接口中方法只能是抽象的。
在这里插入图片描述
我定义的是普通方法,但是java会自动给我们加上abstract关键字来修饰就口中的方法。所以接口是比抽象类更高级别的抽象。
总结:现实逻辑,面向对象,设计,内存都不希望我们实例化抽象类,所以编译器规定不能实例化抽象类
文章中有什么理解错误的地方希望小伙伴们在评论区指正~
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值