抽象类:是”不能“实例化,还是”不配“实例化?

一、抽象类

part1 抽象类概念

1、概念

如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。

2、例子

在上诉图中,我们发现,父类Shape中的dark()方法好像并没有什么实际工作,主要的绘制图形都是由其子类通过dark()实现的。

像这样没有实际工作的方法,我们可以把他设计成一个抽象方法;包含抽象方法的类我们称为抽象类

part2 抽象类语法

1、抽象类

在Java中,被abstract修饰的类,称为抽象类。

2、抽象方法

在Java中,被abstract修饰的方法,称为抽象方法。且抽象方法没有方法体。

3、抽象类也是类,也可以增加普通方法和属性。

【注意】:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。

part3 抽象类特性

1、抽象类是不能直接实例化出对象

所谓抽象,就是不能通过实例化出具体的对象。

2、抽象方法不能是private

抽象类的出现,就是为了被继承。

因为抽象方法的设计初衷就是要求子类通过继承去实现它的,而private方法对于子类来说是不可见的。两者产生了矛盾。

3、抽象方法不能被final和static修饰,因为抽象方法要求被子类重写。

(1)为什么抽象方法不能是final?

矛盾点:abstract要求被重写,final禁止被重写。

abstract(抽象)的含义:一个方法被声明为抽象方法,意味着它只有方法签名,没有方法体(即没有实现)。这个方法的具体行为必须由它的子类来提供实现,也就是通过重写这个方法来完成。抽象方法的存在,就是为了让子类去实现它,从而实现多态。


final(最终)的含义:一个方法被声明为 final,意味着它不能再被其子类重写。它的实现是最终的、不可改变的。

(2)为什么抽象方法不能是static?

矛盾点:abstract依赖于对象实例和多态,static独立于对象实例,属于类,而不属于对象,不参与多态。

static(静态)方法:属于类本身,而不是类的任何一个对象实例。我们通过类名.方法名()的方式来调用它。它在程序编译期就进行了静态绑定,也就是说,调用哪个方法是根据引用的类型(编译时类型)在编译时就决定了的。


abstract(抽象)方法:它的目的是为了多态。多态意味着我们通过一个父类引用指向一个子类对象(如 Animal myDog = new Dog();)向上转型,然后调用 myDog.speak()。具体执行哪个子类的 speak()方法,是在程序运行时根据对象的实际类型(运行时类型)来决定的,这叫做动态绑定

【编译错误】

4、抽象类必须被继承

抽象类的出现,就是为了被继承。

抽象类必须被继承,并且继承后的子类要重写父类中的抽象方法,否则也把子类设置成抽象类。

重写之后:编译成功

5、抽象类中不一定有抽象方法,但是抽象方法一定在抽象类中。

6、抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量或者调用父类的成员方法。

(1)抽象类中的无参构造方法

(2)抽象类中的带参构造方法

【代码】

【运行结果】

part4 抽象类的作用

抽象类本身不能被实例化,要想使用,只能通过创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。

使用抽象类相当于多了一重编译器的效验。

使用抽象类的场景,实际工作不是由父类完成的,而是由子类完成的。那么不小心误用成了父类的,使用普通的编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值