首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么compareTo在Java上的Enum final?

在Java中,compareTo方法用于比较两个对象的顺序。对于枚举(Enum)类型,compareTo方法是自动实现的,因为枚举值是有限的,并且预先定义好的。当一个枚举类型被声明为final时,表示该枚举类型不可变,即不能有新的枚举值被添加到该类型中。

compareTo方法设计为final的原因是为了确保枚举类型的整体不可变性。这样可以确保枚举值的顺序在整个程序运行过程中保持一致,避免因为重写compareTo方法而导致的不可预期的行为。

总结一下,将compareTo方法设计为final的原因是为了确保枚举类型的不可变性,从而保证枚举值的顺序在整个程序运行过程中保持一致。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java中String类为什么要设计成final

String为什么被定义为final面试中经常被问到。 首先,先得清楚 final 这个关键字。 final出现就是为了为了不想改变,而不想改变理由有两点:设计(安全)或者效率。...final 修饰类是不被能继承,所以 final 修饰类是不能被篡改。...所有 *java程序中字符串,如“ABC”,是 *实现为这个类实例。 * *字符串是常量,它们它们之后不能更改 *创建。支持可变字符串字符串缓冲区。...翻开JDK源码,java.lang.String类起手前三行,是这样写: public final class String implements java.io.Serializable, Comparable...final修饰字段创建以后就不可改变。 ? 数组变量只是stack一个引用,数组本体结构heap堆。

91330

java中String类为什么要设计成final

String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl",不是原内存地址修改数据,而是重新指向一个新对象,新地址。 ? 2. String为什么不可变?...翻开JDK源码,java.lang.String类起手前三行,是这样写: public final class String implements java.io.Serializable, Comparable...挡不住Array数组是可变事实。Array数据结构看下图 ? 也就是说Array变量只是stack一个引用,数组本体结构heap堆。...所以String不可变安全性就体现在这里。实际StringBuffer作用就是起到了String可变配套类角色。...但如果后面我把变量sb3也指向sb1地址,再改变sb3值,因为StringBuilder没有不可变性保护,sb3直接在原先"aaa"地址改。导致sb1值也变了。

1.1K31

java中String类为什么要设计成finalJava面试常见问题

其实在Java中,String类被final修饰,主要是为了保证字符串不可变性,进而保证了它安全性。那么final到底是怎么保证字符串安全性呢?接下来就让我们一起来看看吧。...综上所述,我们可以知道,finalJava中是一个非常有用关键字,主要可以提高我们代码稳定性和可读性。...在这里,String对象改变,实际是通过内存地址“断开-连接”变化来完成。 在这个过程中,原字符串中内容并没有发生任何改变。...Java中,因为数组也是对象, 所以value中存储也只是一个引用,它指向一个真正数组对象。执行了String s = “yiyige”; 这句代码之后,真正内存布局应该是下图这样: ?...总结 至此,我们就把今天面试题分析完了,现在你明白了吗?最后我再来给大家总结一下今天重点内容吧: 1. 为什么要用final修饰javaString类呢?

32600

重新认识java(十) —- Enum(枚举类)

该方法用来比较两个枚举变量”大小”,实际比较是两个枚举变量次序,返回两个次序相减后结果,如果为负数,就证明变量1”小于”变量2 (变量1.compareTo(变量2),返回【变量1.ordinal...枚举类中抽象类 如果我枚举类中定义一个抽象方法会怎么样? 你要知道,枚举类不能继承其他类,也不能被其他类继承。至于为什么,我们后面会说到。...实际初始化这个枚举类时候,你可以理解为执行是TrafficLamp RED = new TrafficLamp(30) ,但是因为TrafficLamp里面有抽象方法,还记得匿名内部类么?...,记住双检索java5之前是有问题,但是java5在内存模型中有了volatile变量之后就没问题了。...enum元素,一个接口内部,创建实现该接口枚举,以此将元素进行分组。

55020

深入理解Enum(枚举类)

该方法用来比较两个枚举变量”大小”,实际比较是两个枚举变量次序,返回两个次序相减后结果,如果为负数,就证明变量1”小于”变量2 (变量1.compareTo(变量2),返回【变量1.ordinal...枚举类中抽象类 如果我枚举类中定义一个抽象方法会怎么样? 你要知道,枚举类不能继承其他类,也不能被其他类继承。至于为什么,我们后面会说到。...实际初始化这个枚举类时候,你可以理解为执行是TrafficLamp RED = new TrafficLamp(30) ,但是因为TrafficLamp里面有抽象方法,还记得匿名内部类么?...,记住双检索java5之前是有问题,但是java5在内存模型中有了volatile变量之后就没问题了。...,如果需要扩展enum元素,一个接口内部,创建实现该接口枚举,以此将元素进行分组。

54030

【小家java】匿名内部类为什么只能使用外部final变量

1、概述 各位都知道,匿名内部类使用时候需要使用外部变量,该变量必须被final修饰,否则编译报错。实际使用中,有时候确实还给我们造成了不少麻烦,可大家可曾想过这是为什么吗?...2、栗子 了解原因之前,我们最好先了解一下javascript一个概念:js闭包。然而Java内部类其实就是闭包:包含指向外部类指针。...至于为什么一定得是final呢?这个就得从两个方面阐述原因: final修饰变量有什么特别? 为什么需要final修饰这个特点?...用final修饰成员变量表示常量,存在内存中常量区(常量区位于堆区)(jvm内存结构),放在常量区里面,所以效率上相对来说会高那么一点。 为什么匿名内部类用变量必须final呢?...对final使用补充解释,可参考博文javafinal关键字使用详解 备注:匿名内部类在编译时也是会生成一个.class文件哦。具体可参考我做一个例子:匿名内部类生成.class文件吗?

83340

深入分析 Java 枚举 enum

从字节码知 Gender 是 final Gender 继承自 java.lang.Enum 类 声明了字段对应两个 static final Gender 实例 实现了 values() 和...extends java.lang.Enum { public static final Gender Male; public static final Gender Female;...(Gender.class, name); } } 创建枚举类型默认是java.lang.enum(抽象类)子类 每个枚举项类型都为public static final 。...该方法用来比较两个枚举变量”大小”,实际比较是两个枚举变量次序,返回两个次序相减后结果,如果为负数,就证明变量1”小于”变量2 (变量1.compareTo(变量2),返回【变量1.ordinal...并且,这个类是final!所以它不能被继承! 回到我们刚才那个疑问: ? 为什么会有这么神奇代码?现在你差不多懂了。因为RED本身就是一个TrafficLamp对象引用。

1.9K30

java | 深入理解Java枚举类型(一)

实际使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关类,这个类继承了Java API中java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实也是一个类类型而且该类继承自...枚举常见方法 Enum抽象类常见方法 Enum是所有 Java 语言枚举类型公共基本类(注意Enum是抽象类),以下是它常见方法: 返回类型 方法名称 方法说明 int compareTo(E o...方法比较,实际其内部是通过ordinal()值比较 System.out.println("days[0].compareTo(days[1]):"+days[0].compareTo...在前面的分析中,我们都是基于简单枚举类型定义,也就是定义枚举时只定义了枚举实例类型,并没定义方法或者成员变量,实际使用关键字enum定义枚举类,除了不能使用继承(因为编译器会自动为我们继承Enum...关于覆盖enum类方法 既然enum类跟常规类定义没什么区别(实际enum还是有些约束),那么覆盖父类方法也不会是什么难说,可惜是父类Enum定义方法只有toString方法没有使用final

66420

三歪问我为啥用枚举,枚举有哪些用法?

Java基础:枚举用法与原理 在学习过程中,我们也只是定义常量时候,会意识到枚举存在,而定义常量其实可以类中实现,这时就会感觉枚举有点鸡肋。...枚举实现 枚举是JDK1.5之后特性,在此之前一般是类中对常量进行定义。那么为什么需要枚举呢?...Season.compareTo()方法 这个方法用于比较两个枚举变量“大小”,实际比较是两个枚举变量之间次序,并返回次序相减之后结果。...)); 运行结果为: SEASON.SPRING.compareTo(SEASON.WINTER) --> -3 我们来看看它源码: public final int compareTo(E o) {...枚举类时候,原本列出来了很多问题如Java枚举线程安全和序列化问题,但是了解完Java枚举原理之后,这些问题,都迎刃而解了,也许未来可能会碰上枚举特例吧。

1.1K60

深入分析Javaenum

创建枚举类型默认是java.lang.enum(抽象类)子类。 每个枚举项类型都为public static final 。...该方法用来比较两个枚举变量”大小”,实际比较是两个枚举变量次序,返回两个次序相减后结果,如果为负数,就证明变量1”小于”变量2 (变量1.compareTo(变量2),返回【变量1.ordinal...并且,这个类是final!所以它不能被继承! 回到我们刚才那个疑问: ? 为什么会有这么神奇代码?现在你差不多懂了。因为RED本身就是一个TrafficLamp对象引用。...实际初始化这个枚举类时候,你可以理解为执行是TrafficLamp RED = new TrafficLamp(30) ,但是因为TrafficLamp里面有抽象方法,还记得匿名内部类么?...,记住双检索java5之前是有问题,但是java5在内存模型中有了volatile变量之后就没问题了。

1.2K110

Java学习笔记之二十】final关键字Java继承中用法小结

谈到final关键字,想必很多人都不陌生,使用匿名内部类时候可能会经常用到final关键字。另外,JavaString类就是一个final类,那么今天我们就来了解final这个关键字用法。...一、final关键字基本用法 Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字基本用法。...早期Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来任何性能提升。最近Java版本中,不需要使用final方法进行这些优化了。...本质是一回事,因为引用值是一个地址,final要求值,即地址值不发生变化。 final修饰一个成员变量(属性),必须要显示初始化。...为什么第一个比较结果为true,而第二个比较结果为fasle。

67180

(23) 枚举本质 计算机程序思维逻辑

()); 另外,枚举类型都实现了Java API中Comparable接口,都可以通过方法compareTo与其他枚举值进行比较,比较其实就是比较ordinal大小,例如,如下代码输出为-1,表示...枚举好处 Java是从JDK 5才开始支持枚举,在此之前,一般是类中定义静态整形变量来实现类似功能,代码如下所示: class Size { public static final int...基本实现原理 枚举类型实际上会被Java编译器转换为一个对应类,这个类继承了Java API中java.lang.Enum类。...Enum类有两个实例变量name和ordinal,构造方法中需要传递,name(), toString(), ordinal(), compareTo(), equals()方法都是由Enum类根据其实例变量...Size有一个私有的构造方法,接受name和ordinal,传递给父类,私有表示不能在外部创建新实例。 三个枚举值实际是三个静态变量,也是final,不能被修改。

74050

深入理解 Java 枚举

Java 中,被 enum 关键字修饰类型就是枚举类型。形式如下: enum ColorEn { RED, GREEN, BLUE } 枚举好处:可以将常量组织起来,统一进行管理。...说明: 从上面的例子可以看出: 枚举本质是 java.lang.Enum 子类。 尽管 enum 看起来像是一种新数据类型,事实enum 是一种受限制类,并且具有自己方法。...枚举这种特殊类因为被修饰为 final,所以不能继承其他类。 定义枚举值,会被默认修饰为 public static final ,从修饰关键字,即可看出枚举值本质是静态常量。 3....因为 enum 实际都继承自 java.lang.Enum 类,而 Java 不支持多重继承,所以 enum 不能再继承其他类,当然也不能继承另一个 enum。 5. 枚举应用 5.1....组织常量 JDK5 之前, Java 中定义常量都是public static final TYPE a; 这样形式。

91050

掌握Java枚举这几个知识点,日常开发就够啦

ordinal(); 返回一个int值,表示enum实例声明次序。...equals(); 返回布尔值,enum实例判断相等 compareTo() 比较enum实例与指定对象顺序 values(); 返回enum实例数组 valueOf(String name) 由名称获取枚举类中定义常量...Shrubbery是java.lang.Enum子类。 Shrubbery定义枚举值都是public static final修饰,即都是静态常量。...五、枚举常见用法 enum组织常量 JDK5之前,常量定义都是这样,先定义一个类或者接口,属性类型都是public static final......参考与感谢 关于Java中枚举Enum深入剖析 深度分析Java枚举类型—-枚举线程安全性及序列化问题 为什么我墙裂建议大家使用枚举来实现单例。

83020
领券