前言🙉
final和abstract都用于修饰类的成员,存在的意义都是用于优化限定,让类与类之间,类和成员之间变得更加灵活,结合方式更加多元,从而更加高效,简便地实现各种需求和功能。abstract体现的抽象思想是提高代码复用性的重要映射
一.final
1.定义与作用
🟠final-代表最终的,最后的。可以修饰类,属性,方法和局部变量
使用场景:
🟤当不希望类被继承时,可以用final修饰(太监类)
🟤当不希望父类的某个方法被子类覆盖重写
🟤当不希望类的某个属性值被修改
🟤当不希望某个局部变量被修改
2注意事项
🟤 1.final修饰的属性叫常量,即不可改变的
🟤2.final修饰的属性在定义时,必须赋初值,而且以后无法修改
可以在定义时赋值,也可以在构造器和代码块中赋值
🟤3.若final修饰的属性是静态的,则初始化的位置只能在定义时,静态代码块中
🟤4.final类不能被继承,但可以实例化对象(这也是网上称作为太监类的原因)
🟤5.如果类没有被final修饰,但是有final修饰的方法,则该方法不能被重写,但类可以被继承
🟤6.如果一个类已经是final类就没有必要把方法用final来修饰,因为他无法被继承
🟤7.final不能修饰构造方法
🟤8.final和static可以搭配使用在类不被加载的情况下调用方法
🟤9.包装类和String类都是final类
二.abstract
1.定义与作用
abstract-意为抽象的,当父类的某些方法要声明,但没有具体的实现形式,可以将其声明为抽象方法,这时用abstract修饰
2.注意事项
🟤1.抽象类不能被实例化
🟤2.抽象类不一定要包含抽象方法
🟤3.一个类包含了抽象方法,则这个类必须声明为抽象类
🟤4.abstract只能修饰类和方法不能修饰属性和其他的
🟤5.抽象类可以有任何成员(具有类的性质)
🟤6.抽象方法不能有主体,写法如下
🟤7.如果一个类继承了一个抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类
🟤8.抽象方法不能用private,final,static修饰因为这些类都和重写相违背
✔️抽象方法写法:
public abstract long calSum(); //这就是一个抽象方法
3.应用体现
✔️抽象类的一个具体应用:
▶️通过利用继承关系与抽象方法实现一个计算不同运算方法耗时的问题
▶️把父类的一个方法抽象出来,让子类重写该方法,达到提高代码复用性简化程序的目的。
public abstract class Template01 {
public abstract long calSum(); //把方法抽象出来
public void cal(){
long date1=System.currentTimeMillis(); //起始时间
calSum(); //调用抽象方法 方便子类重写
long date2=System.currentTimeMillis(); //结束时间
System.out.println("执行所用时间"+(date2-date1)+"计算结果是:"+calSum()); //耗时
}
}
class AA extends Template01{
public long num=0;
@Override
public long calSum() { //重写父类的抽象方法
for (int i = 0; i < 10000000; i++) {
num*=i;
}return num;
}
}
class BB extends Template01{
public long num=0;
@Override
public long calSum() { //重写父类的抽象方法
for (int i = 0; i < 10000000; i++) {
num+=i;
}return num;
}
}
🌦️如果不通过抽象方法,我们可能要在子类中把计算耗时的功能写出来,然后在类中修改不同的形式的calSum()方法来达到目的,利用抽象方法,只需要在各自的的类中重写一下calSum()然后更改形式就行。这就是提高代码复用性的一种体现~