一、抽象类
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 抽象类的作用
抽象类本身不能被实例化,要想使用,只能通过创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。
使用抽象类相当于多了一重编译器的效验。
使用抽象类的场景,实际工作不是由父类完成的,而是由子类完成的。那么不小心误用成了父类的,使用普通的编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。
1181

被折叠的 条评论
为什么被折叠?



