Java学习

final关键字

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

以下情况,可以使用final:

  1. 当不希望类被继承时,可以用final修饰
  2. 当不希望父类的某个方法被子类覆盖/重写(override)时,可以使用final关键字修饰【访问修饰符 final 返回类型 方法名】
  3. 当不希望类的某个属性的值被修饰,可以使用final【public final double TAX_RATE = 8】
  4. 当不希望某个局部变量被修改,可以使用【final double TAX_RATE = 8】

final使用注意事项和细节讨论

  1. final修饰的属性又叫常量,一般用 xx_xx_xx来命名

  2. final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以再如下位置之一:

    1. 定义时:如 public final double TAX_RATE = 8
    2. 在构造器中
    3. 在代码块中
  3. 如果final修饰的属性是静态的,则初始化的位置只能是:1)定义时 2)在静态代码块中,不能在构造器中赋值

  4. final类不能继承,但是可以实例化对象

  5. 如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。

  6. 一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法。

  7. final不能修饰构造方法

  8. final和static搭配使用,效率更高,不会导致类的加载。底层的编译器做了优化处理

    java 复制代码
    public class Final01 {
        public static void main(String[] args) {
            System.out.println(A.num); // 运行结果:1)A 的静态代码块被执行 2) 1000
        }
    }
    
    class A{
        public static int num = 1000;
        static {
            System.out.println("A 的静态代码块被执行");
        }
    }

    final+static

    java 复制代码
    public class Final01 {
        public static void main(String[] args) {
            System.out.println(A.num); // 运行结果: 1000
        }
    }
    
    class A{
        public  static final int num = 1000;
        static {
            System.out.println("A 的静态代码块被执行");
        }
    }
  9. 包装类(Integer Double Float Boolean等都是final),String也是final类。

抽象类

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract来修饰该类就是抽象类

介绍

  • 用abstract关键字来修饰一个类时,这个类就叫抽象类 :访问修饰符 abstract 类名{ }
  • 用abstract关键字来修饰一个方法时,这个方法就是抽象方法

访问修饰符 abstract 返回类型 方法名(参数列表); // 没有方法体

  • 抽象类的价值更多作用在于设计,是设计者设计好后,让子类继承并实现抽象类

注意事项和细节讨论

  1. 抽象类不能被实例化
  2. 抽象类不一定要包含abstract方法。即,抽象类可以没有abstract方法
  3. 一旦类包含了abstract方法,则这个类必须声明为abstract
  4. abstract只能修饰类和方法,不能修饰属性和其他的
  5. 抽象类可以有任意成员【抽象类本质还是类】,比如:非抽象方法,构造器,静态属性等等
  6. 抽象方法不能有主体
  7. 如果一个类继承了抽象类,则它必须实现抽象类的所以抽象方法,除非它自己也声明为abstract类
  8. 抽象方法不能使用private、final和static来修饰,因为这些关键字都是和重写相违背的。

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

需求:

  1. 有多个类,完成不同的任务
  2. 要求统计得到各自完成任务的时间

最佳实践:

设计一个抽象类(Template),能完成如下功能:

  1. 编写方法calculateTime(),可以计算某段代码的耗时时间
  2. 编写抽象方法job()
  3. 编写一个子类Sub,继承抽象类Temolate,并实现job方法
  4. 编写一个测试类TestTemplate。

Template.java(父类)

java 复制代码
abstract public class Template {
    public abstract void job();
    public void calculateTime(){
        long start = System.currentTimeMillis();
        job(); // 动态绑定机制
        long end = System.currentTimeMillis();
        System.out.println("执行时间:" + (end-start));
    }
}

AA.java(子类)

java 复制代码
public class AA extends Template{

    // 计算任务
    // 1 + ... + 1000000
    public void job(){
        // 得到开始的时间
        long start = System.currentTimeMillis();
        long num = 0;
    for(long i = 1;i<=1000000 ; i++){
        num += i;
        }
    }
}

BB.java(子类)

java 复制代码
public class BB extends Template{
    // 计算任务
    // 1 + ... + 1000000
    public void job(){
        long num = 0;
        for(long i = 1;i<=80000 ; i++){
            num *= i;
        }
    }
}

TestTemplate.java

java 复制代码
public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.calculateTime();
        BB bb = new BB();
        bb.calculateTime();
    }
}
相关推荐
SeaTunnel15 分钟前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影30 分钟前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code1 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121311 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城3 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience4 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao4 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
weixin_408099674 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
爱喝水的鱼丶4 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
钱六两5 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程