Java语言的final类和常数的区别是什么

Java语言的final类和常数的区别是什么?final不是也是不能修改的么?还有final到底是一种对象还是一种变量啊

final类是无法被继承的类,常量是一种不可改变的值,而final关键字则是用于修饰类、方法和变量的特性.
这个可以看下相关博客 还是有很多的

你可以认为没区别,用final修饰过的变量就是一个常量,所有常量的值将在编译阶段就验证
在c语言里常量用const,在java里用final,关键字不一样但是作用一样

final是一个修饰符,修饰参数表示可读不可写,修饰类的话表示该类不能被继承

Java语言中的final修饰符可以应用于类、方法和变量,其含义和作用略有差异,下面就它们的区别进行解释。

  1. final类:final关键字修饰的类称为final类。final类不可被继承,也就是说无法派生出子类。这意味着final类的设计者认为该类的实现是完整、稳定和不可变的,不希望其他类对其进行修改或扩展。final类常常用于类库的设计,确保类的行为不被修改。
final class MyClass {
    // 类定义
}
  1. final方法:final关键字修饰的方法称为final方法。final方法不能被子类重写或覆盖,也就是说子类无法对该方法进行修改。final方法通常用于确保父类中的方法不会被子类修改,保证方法的行为不变。
class MyBaseClass {
    final void myMethod() {
        // 方法定义
    }
}
  1. final变量:final关键字修饰的变量称为final变量(常量)。final变量在声明时必须进行初始化赋值,并且一旦赋值后就无法再改变其值。final变量的值在运行时保持不变。常量一般与static关键字共同使用,称为静态常量,用于表示一些固定不变的值(如数学常数、配置参数等)。
final int myNumber = 10;

需要注意的是,final修饰的是变量本身,而不是变量所引用的对象或值。如果是引用类型的final变量,它指向的对象仍然可以改变,但是该变量将始终引用相同的对象。

综上所述,final类和常量在Java的含义和作用有所区别。final类是一个完整且不可继承的类,final方法是一个不可覆盖的方法,而final变量是一个不可改变的常量。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1069482
  • 你也可以参考下这篇文章:Java为什么匿名内部类参数引用需要用final进行修饰?
  • 同时,你还可以查看手册:java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-类和对象》描述了如何编写创建对象的类,以及如何创建和使用对象。-课堂 中的内容
  • 除此之外, 这篇博客: 2019-3-15记人生中第一次电话面试,支付宝java端中的 7.一个类被final修饰了,那么他里面的变量能不能修改? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    我说可以,就像深复制和浅复制一样,他说这两个没关系
    然后我说final修饰的是类的引用,里面的属性是不收约束的,所以可以改

  • 您还可以看一下 庄博老师的java面向对象下篇课程中的 final修饰类小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    Java语言中final类和常量的区别如下:

    1. final类是指不能被继承的类,它的主要作用是保护类的实现和设计。final修饰的类在声明时使用final关键字来限制其不能被其他类继承。

    示例代码:

    final class FinalClass {
        // class implementation
    }
    
    1. 常量是在程序中具有不变值的变量。在Java中,常量可以使用关键字final来声明。final常量的值在程序中不能改变,它的值是固定的。常量通常被用来表示某些固定的值,比如数学常数、常用的配置参数等。

    示例代码:

    final int NUM = 10;
    
    1. final修饰的非静态字段在虚拟机为其开辟空间时必须保证它会被显式赋值一次且只被赋值一次。这意味着final修饰的字段在初始化块、显式初始化和构造方法初始化时只能选择一种方式进行初始化。

    示例代码:

    public class MyClass {
        // 使用初始化块初始化final字段
        final int num;
        {
            num = 10;
        }
    
        // 显式初始化final字段
        final int num = 10;
    
        // 使用构造方法初始化final字段
        final int num;
    
        public MyClass() {
            this.num = 10;
        }
    }
    
    1. final修饰的静态字段只能被静态初始化块或者显示初始化初始化,只能被初始化一次。

    示例代码:

    public class MyClass {
        // 使用静态初始化块初始化final静态字段
        static final int NUM;
        static {
            NUM = 10;
        }
    
        // 显示初始化final静态字段
        static final int NUM = 10;
    }
    

    希望以上解答对你有所帮助。如果还有其他问题,请随时提问!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^