1,什么是抽象类:
- 没有方法体的方法被称为 抽象方法,在类中有 抽象方法 的类 ,必须被定义为:抽象类。
- 但抽象类不一定有抽象方法;
- 注意:!!!抽象类不能创建对象;
- 抽象方法的 格式:
public abstract 方法名 (参数列表) { }
//何为 没有方法体 的方法:
public abstract void setAge();
//就是抽象方法
//因为有抽象方法的类必须定义为抽象类:(否则报错)
public abstract class Fu
2,抽象类 的使用场景:
父类知道子类一定要完成某个功能,但是每个子类实现的情况都不一样,父类的该功能就可以定义为抽象方法,这样就能约束子类去重写抽象方法,就不会忘记写这个功能啦。
3,抽象类的 继承与调用(有调用就有子类继承):
- 如果要调用抽象方法的话,必须由子类继承抽象类,并且必须对所有的抽象方法进行重写才可以被调用;(因为调用抽象方法无意义)
如果不重写,那子类也要定义为抽象类;
//Fu类为抽象类;
public abstract class Fu {
}
//子类继承 抽象类 Fu类
public class Zi extends Fu{
@Override
public void setAge() {
System.out.println("子类重写的抽象方法");
}
}
抽象类不能被创建为对象;
那既然在子类中重写了,那就直接用子类创建对象去调用子类重写后的方法就行了。
Zi zi = new Zi();
zi.setAge();
4,父类中的抽象方法有必要存在吗?
如果父类没有抽象方法,子类也没有这个方法,那这个功能就缺失了; 抽象类对团队需求的实现实际上是有一种约束作用,让子类一定要去实现这个方法。 比如,在我的需求中需要一个功能,但是,这个功能是由别人写的,不属于我的需求范围,这个时候就可以把这个功能写成一个抽象方法,项目转手后,能够让那个人记得一定要去进具体的子类方法重写并实现这个功能。(否则会报错)这样就不会因为人为原因导致需求功能的丢失。
5,多个抽象方法存在的情况:
//Fu类是个抽象类,且有多个抽象方法。
public abstract class Fu {
public abstract void setAge();
public abstract void setParsee();
}
//子类继承父类,并改为抽象类,因为子类没有把父类的抽象方法重写完。
public abstract class Zi extends Fu{
@Override
public void setAge() {
System.out.println("子类重写的抽象方法");
}
}
//如果要调用所有抽象方法就必须要把 所有抽象方法重写。上述代码无意义。(仅举例使用) !!!
6,抽象类和普通类的区别(抽象类的特点):
抽象类得到了,定义抽象方法的能力;
- 但是失去了创建对象的能力;(同样不能创建对象的还有被private修饰的类,被私有了)
- 除此之外,其他的和普通类一样;