抽象类是Java中非常简单但很重要的一个知识点,本来觉得简单不想写的,但觉得学习不分简易,还是那句话,万丈高楼平地起,还是老老实实打好基础,学习本文之前,建议先观看我的上一篇文章Java-----继承
什么是抽象类
含有抽象方法的类都叫抽象类。
那什么是抽象方法呢?
抽象方法:将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体明确,该访法就可以定义为抽象方法。(声明时需要在方法的返回值类型前面加上abstract关键字)
抽象类中需要注意的点
这里注意点就不死记硬背了,我也写一个小的案例来说明需要注意的地方
小案例
需求:定义猫类(Cat)和狗类( Dog )
猫类成员方法: eat (猫吃鱼) drink (喝水... )
狗类成员方法: eat (狗吃肉少drink (喝水... )
分析:
1.猫类和狗类中存在共性内容,应向上抽取出一个动物类( Animal )
2.父类Animal中 ,无法将eat方法具体实现描述清楚,所以定义为抽象方法
3.抽象方法需要存活在抽象类中,将Animal定义为抽象类
4.让Cat和Dog分别继承Animal ,写eat方法
5.测试类中创建Cat和Dog对象,调用方法测试
接下来我们根据分析一步步走,先定义父类Animal ,并在里面实现两个方法。
public abstract class Animal {
public void drink() {
System.out.println("喝水");
}
public abstract void eat();
}
定义两个方法时发现drink()方法里面清楚都是要做喝水的行为,但是eat()方法一个要吃鱼,一个要吃肉,所以无法确定具体需求,只能定义为抽象方法,因为抽象方法只能在抽象类中,所以需要在class前面加上abstract将Animal类变成抽象类。
接下来定义猫类和狗类去继承父类Animal。
Cat.java
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
Dog.java
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
我们在写的时候发现继承了Animal后,子类中必须重写它的抽象方法eat().
接下来写个简单的测试类进行测试
Test.java
public class Test {
public static void main(String[] args) {
Cat c = new Cat();
c.eat();
c.drink();
Dog d = new Dog();
d.eat();
d.drink();
}
}
测试结果:
image.png
总结:
- 抽象方法必须存在于抽象类中,具有抽象方法的类称为抽象类。
- 继承抽象类的子类必须实现父类中所有的抽象方法,实现后可以重写父类抽象方法,如果不重写,自身也必须为抽象类。
- 抽象类不能被实例化(不能创建抽象类的对象)
- 抽象类中可以没有抽象方法,但是有抽象方法的类必须生命为抽象类。
抽象类和抽象方法都非常简单,很好理解,需要记住它的这几个注意事项,以免在开发过程中踩坑,顺便扩充一个知识点,抽象类在设计模式中有非常经典的应用,叫做模板设计模式。
模板设计模式:把抽象类整体就可以看做成一个模板 ,模板中不能决定的东西定义成抽象方法让使用模板的类(继承抽象类的类)重写抽象方法实现需求。模板设计模式内部有模板方法,不允许被更改,需要用final关键字修饰。
这里就自己理解一下,只可意会,不可言传了。
ps:
final关键字
final关键字是最终的意思,可以修饰(方法,量,类)
final修饰的特点:
- 修饰方法: 表明该方法是最终方法,不能被重写
- 修饰变量:表明该变是常量,不能再次被赋值
- 修饰类:表明该类是最终类,不能被继承
- 修饰基本类型: final 修饰的是基本类型 ,该变量数据值不能发生改变
- 修饰引用类型: final修饰的是引用类型,该变量的地址值不能发生改变,但是地址里面的内容是可以发生改变的。
网友评论