final关键字与抽象类总结

final关键字

可修饰类、属性、方法和局部变量

用途:

  • 不希望类被继承时

  • 不希望父类中的某个方法被子类重写/覆盖

  • 不希望类的某个属性的值被修改

  • 不希望某个 局部变量 被修改

使用细节:

  • final修饰的属性又称为常量, 名字要按照XX_XX_XX来命名

  • final修饰的属性在定义时必须赋初值,赋值可选以下位置:

    • 定义时 public final double TAX_RATE = 0.08;
    • 在构造器中
    • 在代码块中
  • 如果final修饰的属性是静态(public final static int MAX_NUM = 23435465;)的,则初始化的位置只能是

    • 定义时
    • 静态代码块中
    • 注意不能在构造器中赋值
  • final类不能继承,但是可以实例化对象(“能使用”)

  • 类不是final类但是有final方法,则该方法虽不能重写,但是可以被继承(“能使用”)

  • 如果一个类已经是final类了,就不用再把方法也定义成final方法了

  • final不能修饰构造器

  • final往往和static搭配使用,底层编译器对此做了优化处理(用类中的属性不会导致类加载),效率更高

public class StaticFinal {
    public static void main(String[] args) {
        System.out.println(AA.num);
    }
}

class AA{
    public final static int num = 1000;
    static {
        System.out.println("类AA被加载了");
    }
}

//输出
1000
//若不加final,会使得类被加载,浪费内存空间
  • 包装类(Integer,Double,Float,Boolean等类都是final类),String类也是final类

抽象类

父类的某些方法不能确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类

抽象方法:没有实现的方法,即没有方法体

//方法声明为抽象方法的时候也要将其类声明为抽象类
abstract class Animal {
    private String name;
    public abstract void eat();
}

注意:

  • 抽象方法不能有方法体

  • 一旦一个方法被声明为抽象方法,其所在的类必须被声明为抽象类

  • 子类一定要实现抽象方法,否则会报错

  • 抽象类不能被实例化(不能new)

  • 抽象类可以没有抽象方法

  • abstract只能修饰类或者方法,不能修饰属性

  • 抽象类可以拥有任意成员(因为其本质还是类,可以有类的各种成员)构造器、属性、非抽象方法、代码块

  • 若一个类继承了抽象类,则这个类必须要实现这个抽象类所有的抽象方法,除非这个子类也是抽象的

  • 抽象类、方法不能使用private、final和static来修饰,这些关键字都是和重写相悖的

抽象类最佳实践:模板设计模式

好处:提高代码复用性

示例:若不使用抽象类,则需要在每个类中都写calculateTime

public abstract class TestTemplate {
    public abstract void job();
    public void calculateTime(){
        long start = System.currentTimeMillis();
        job();//动态绑定机制,优先寻找子类的job()方法
        long end = System.currentTimeMillis();
        System.out.println("job()方法执行时间:"+(end - start));
    }
}






public class TestFile {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.calculateTime();
        b.calculateTime();
    }
}

class A extends TestTemplate{
    public void job(){
        long sum = 0;
        for (int i = 0; i < 1000000; i++) {
            sum += i;
        }
    }
}

class B extends TestTemplate{
    public void job(){
        int sum = 1;
        for (int i = 0; i < 100000; i++) {
            sum *= i;
        }
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值