前言
1、类是一个模板,类被继承后成为父类,继承父类的类称为子类。
2、子类可以对父类的方法进行重写,也可以直接使用父类的方法。
3、类称为继承,关键字为extend;接口为实现,关键字为implement;
抽象类
浅浅的理解下抽象类
-
如果我们想让父类就仅仅是个模板,但是不写他们的方法,让继承的子类来实现,这时候就引入了抽象类
(有点枯燥哈,举个例子,植物大战僵尸)
-
如上三个植物(Plants), 其属性效果是不相同的(此处为了举例理解,谢绝较真~):
- 【样式及动作:move】启动后的样式,不多说,均不同
- 【花费:cost】 豌豆射手:100;向日葵:50;坚果:150;均不同
- 【恢复:recovery】豌豆射手:10s;向日葵:20s;坚果:30s;
- 【攻击:attack】豌豆射手:20点;向日葵:10;坚果:12;
由上可以看出,我们需要一个父类Plants,用来说明需要的属性,但是每个子类需要实现的方法体是不一样的,例如move()方法中了,豌豆射手需要自己实现左右摇晃以及嘴巴吐豌豆的动作,而向日葵则需要实现规定时间生产阳光的动作~
每个道具实现方法都不同,于是对于Plants,就定义move()、cost()、recovery()、attack()这几个方法:
然后Plants这个领导就说了,你们每个部门要根据自己实际情况来做这几件事,具体怎么做,就要需要你们各部门结合自己的特点来了,去做吧~
于是,Plants领导就放权了,可是豌豆射手(Pea)、向日葵(SunFlower)和坚果(Nut)又怕把任务给漏了,咋整?没事每个任务都有abstract修饰,这样继承父类Plants后没有实现的任务会有提醒~
开干吧~
关键字:abstract
- 被abstract修饰的类叫抽象类
- 被abstract修饰的方法叫抽象方法
- 变量不能被abstract修饰
抽象类 VS 普通类
- 1、抽象类必须有abstract关键字修饰,无abstract修饰的是普通类;
- 2、抽象类中的抽象方法可以没有实现体;普通类的方法必须有实现体;
- 3、抽象类被继承后,抽象方法必须重写;普通类继承后方法可以不用重写;
- 4、抽象类不可以直接实例化(实例化需要借助多态);普通类可以实例化对象
特点
-
1、抽象类为了把相同但是不确定的方法提出来,为了以后统一使用,并可以具有多种具体实现,目的是强制子类实现
如豌豆射手、向日葵、坚果都需要去实现四个功能。整合在一起,不用特意去记忆都有哪些方法了
-
2、抽象方法没有方法体,使用abstract关键字修饰
-
3、抽象类可以没有抽象方法,但是抽象方法必须在抽象类中,即普通方法不能有抽象类
-
4、抽象类如果被继承,则其中的抽象方法必须要重写。抽象类也可以有普通方法,普通方法不用必须重写
-
5、抽象类不能实例化,但是可以有构造器。(有构造器的目的是子类实例化会调用父类的构造器)
-
6、抽象类可以使用多态,指向其子类对象(因为子类已经实现了抽象方法)
-
7、抽象类中final和abstract不能同时在一个方法中使用。(final是禁止重写,abstract是必须重写,冲突)
-
8、抽象类中,private和abstract不能同时在一个方法中使用。(private修饰的方法子类不可见,无法重写;abstract需要重写,冲突)
-
9、抽象类中,static和abstract不能同时在一个方法中使用。(static修饰的方法是类级别的,abstract修饰的方法是对象层面的)
-
10、子类继承抽象类后,必须要重写抽象类中所有抽象的方法。如果不想实现抽象类中的所有抽象方法,那么该子类可以是抽象类
思考个问题
为什么抽象类的子类需要重写父类的方法?
因为子类想new个对象出来。
(1)java的特性是面向对象,一切的目的是为了创建一个对象
(2)抽象类虽然有构造函数,但是不能实例化。
(2)抽象类中没有具体的实现方法,可以理解为一个标准。子类重写父类的方法,就可以能够满足多态性,保证了代码的灵活