final 类,常量,方法的解释

简介: final 类,常量,方法的解释

前言

       final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,只可以用于运算;final关键字修饰的方法不能被重写;final关键字修饰的类不能被继承。通过 final 关键字,让我们在编写代码时更加具有逻辑性,及时报错,反馈出与原本逻辑不合理的地方。

一、final关键字是什么?

       final 是 Java 中的一个关键字,用于修饰类、方法和变量。

      作用:

               1.对于类当一个类被声明为 final 类型的“类”时,表示该类是不能被其他类继承的。              

               2.对于常量:当一个变量被声明为 final 类型的“变量”时,表示该变量是一个常量,这个常量一旦被赋值后,就不能再改变。不能对其进行修改,但可以将其进行运算。

               

               3.对于方法:当一个方法被声明为 final 类型的“方法”时,表示该方法是不能被子类重写或覆写的。                

   注:使用 final 关键字可以提供一定的安全性和约束,以确保类、方法或变量的不可改变性和稳定性。

二、如何使用?

1.final类

       语法:final class 类名{}

public final class OuterClass {
    // some codes...
}

 特点:

          1. 不能被继承。

          2.提示不希望其他人对这个类进行任何改动。

          3.该类中的所有方法都被隐式设置为 final 形式,不可被改变。但final类中的成员变量可以被定义为 fInal或 非final形式。

2.final常量

       语法:final 数据类型 数据名

final int a = 2;
// a = 2  不能改变,final常量可以用于计算,但 a 这个常量数值就是2

特点:

          final常量可以用于计算,但不得对其重新赋值。

问题:一个变量,只用 final 关键字修饰,初次赋值时,若定义为一个范围的随机数,每次运行,都是不同的值。

import java.util.Random;
public class Demo {
  public static void main(String[] args) {
    Random ran = new Random();
    for(int i = 0;i<3;i++) {
      final int a = ran.nextInt(100);
      System.out.println(a);
    }
  }
}

输出结果:

   那怎么让这个final 关键字修饰的常量,每次输出都是一个固定值呢?

  解决方法:在 Java 中定义全局常量,通常使用 public static final 修饰,常量只能在最开始的定义时被赋值,不会改变。(常量为随机数定义的第一个值,下一次运行不会改变)

import java.util.Random;
public class Demo {
  static Random ran = new Random();
  public static final int a = ran.nextInt(100);
  public static void main(String[] args) {
    for(int i = 0;i<3;i++) {
      System.out.println(a);
    }
  }
}

输出结果:

   原因: 修改前的代码,for循环内创建 final类型的常量,每次循环,都会生成一个新的同名的final常量,对应赋值的随机数不同;修改后的代码,在静态区进行赋值,不会重复生成新的final常量,每次输出都是固定的值。

3.final方法

        语法:final void 方法名(){}

public final void action(){
    //final声明的方法不能被重写
    System.out.println("亲爱的观众朋友们,我想死你们了!");
}

特点:

           final 方法不能子类覆写或重写。

        下面是一个错误示范!!!(子类覆写了父类的final方法)

public class Parent{
  final public void action(){
        System.out.println(“亲爱的观众朋友们,我想死你们了!”);
    }
}
class Child extends Parent{
  public void action(){
        System.out.println(“大家好”);
    }
} 
    //报错!!!子类不能覆写父类的 final 方法

注:

      在继承中,父类有 private 权限修饰的方法,这些方法都属于父类独有,子类没有覆写或调用这些方法的权限,子类即使有和其名字相同的方法,也是一个新的,属于子类的方法,只是同名而已。

     因此,父类中有 private final 修饰过的方法,子类中也有对应同名的方法,看似覆写了final方法,实际上不是被覆写了,只不过是同名的不同方法。

总结

       本文对JAVA中的final关键字进行了解读。如果读者有补充的,或纠错该文的内容,随时欢迎在评论区中评论,欢迎补充,并会对错误做出及时的回应。

相关文章
|
Java 测试技术 Windows
Jmeter 压测 ws(s)
  上一篇Jmeter压测http(s)介绍了如何使用Jmeter压测常规的web服务接口。本文将继续演示如何使用Jmeter对ws(s)进行压力测试。   有过Socket相关开发经验的人应该都不会陌生,ws协议就是WebSocket协议,而wss对应就是在SSL上运行的WebSocket协议。
2548 0
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
215 3
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
521 19
|
12月前
|
SQL 监控 数据库
SQL语句性能分析技巧与方法
在数据库管理中,分析SQL语句的性能是优化数据库查询、提升系统响应速度的重要步骤
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
SQL 存储 Java
9个SQL优化技巧
本文总结了SQL查询优化的几个关键策略:1) 避免使用`select *`,只查询需要的字段;2) 检查执行计划,确保查询条件和排序字段使用了索引;3) 避免使用`or`连接,可考虑用`union`替代;4) 减少`in`和`not in`的使用,尤其是大数据量时;5) 避免左模糊查询,以利用索引;6) 使用JOIN代替子查询,提高效率;7) 根据需求选择合适的JOIN类型(如INNER JOIN、LEFT JOIN);8) 优化`group by`字段,使用索引和覆盖索引;9) 对深分页查询进行优化,如使用子查询、标签记录法。这些策略有助于提升接口性能和数据库效率。
359 1
|
运维 测试技术 双11
什么是性能测试,一篇文章告诉你!
性能测试评估系统在现实负载下的性能和可靠性,包括响应时间、吞吐量和稳定性。目的是发现瓶颈、评估系统能力、优化性能和确保可靠性。在**双十一大促**等高并发场景下,性能测试至关重要。它有助于合理规划资源,降低成本,提升效率。测试工程师需掌握性能调优,理解压力曲线图,识别最佳并发用户数和最大承载点。通过测试,确保系统在最佳效率下运行,避免资源浪费和用户满意度下降。
|
JSON Rust IDE
全网最全的Rust学习资源
学习Rust过程中整理了一些学习资料分享一下。
616 1
|
SQL 监控 Java
Java Web应用中数据库连接池的配置与优化
Java Web应用中数据库连接池的配置与优化
735 1
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
359 0
【Spring系列】Sping VS Sping Boot区别与联系