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

如何在jdk11中重写一个静态的final字段?

在JDK 11中,无法直接重写一个静态的final字段。final字段表示该字段的值不能被修改,而静态字段是属于类的,不属于实例对象。因此,无法在子类中重写一个静态的final字段。

然而,可以通过其他方式实现类似的效果。一种常见的做法是使用静态方法来返回一个值,而不是直接访问静态final字段。这样可以在子类中重写该静态方法,从而达到修改值的目的。

以下是一个示例代码:

代码语言:txt
复制
public class ParentClass {
    public static final int MY_CONSTANT = 10;

    public static int getConstantValue() {
        return MY_CONSTANT;
    }
}

public class ChildClass extends ParentClass {
    public static int getConstantValue() {
        return 20;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(ParentClass.getConstantValue());  // 输出:10
        System.out.println(ChildClass.getConstantValue());   // 输出:20
    }
}

在上述示例中,通过在子类中重写getConstantValue()方法,可以修改静态常量的返回值。在Main类中,分别调用父类和子类的getConstantValue()方法,可以看到返回的值分别为10和20。

需要注意的是,这种方式并不是真正意义上的重写静态final字段,而是通过重写静态方法来实现类似的效果。

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

相关·内容

Java9-17新特性总结

年底即将发布SpringBoot3.0最低支持Java17版本 这里记录下新语法和值得注意库 语法特性 module JDK9模块系统 Java 9 模块重要特征是在其工件根目录包含了一个描述模块...Data吧 但是record类型内字段final类型, 只能在构造方法内初始化, 且只提供对应字段get方法, 场景有限 JDK16 JDK14/15预览 record Point(int x,...Stream 增加了新方法 ofNullable、dropWhile、takeWhile 和 iterate ....流新特性 readAllBytes/readNBytes/transferTo Arrays.mismatch 找到两个数组之间一个不匹配元素 JDK11 飞行记录器 使用默认类数据共享(CDS)存档...减少多个虚拟机在同一个物理或虚拟机器上运行时资源占用 字符串增强,isBlank/lines/repeatstrip HttpClient JDK12 字符串增强,indent和transform

64001

盘点历届 Java 语言关键字,一定有你不认识

只能在声明 private(内部)类、方法或字段引用这些类、方法或字段。在类外部或者对于子类而言,它们是不可见。...可以在声明 protected 类、方法或字段类、同一个其他任何类以及任何子类(无论子类是在哪个包声明引用这些类、方法或字段。...子类继承父类所有 public 和 protected 变量和方法(但是不包括构造函数)。子类可以重写父类任何非 final 方法。一个类只能扩展一个其他类,但一个接口可以继承多个接口。...也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final成员变量可以根据需要设为final,但是要注意final所有成员方法都会被隐式地指定为final方法。...静态方法只能继承,不能重写(Override),因为重写是用于表现多态重写只能适用于实例方法,而静态方法是可以不生成实例直接用类名来调用,这就会与重写定义所冲突,与多态所冲突,所以静态方法不能重写

18610
  • 来了来了它来了,100条必背JAVA知识点(下)

    实例变量:创建了类多个对象,每个对象都独立拥有一套类静态属性。当修改其中一个对象静态属性时,不会导致其他对象同样属性值修改。..."就称为是一个常量 ⑤final修饰属性:可以考虑赋值位置有:显式初始化、代码块初始化、构造器初始化 ⑥final修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。...④若子类没重写父类抽象方法,则此子类也是一个抽象类,需要使用abstract修饰 注意点: abstract不能用来修饰:属性、构造器等结构 abstract不能用来修饰私有方法、静态方法、final...⑤如何在子类(或实现类)方法调用父类、接口中被重写方法。 86、内部类分类:成员内部类(静态、非静态 )、局部内部类(方法内、代码块内、构造器内)。...言外之意,不使用final,就可以被继承 可以被abstract修饰 88、如何在外部类创建成员内部类对象?(静态,非静态) 89、如何在成员内部类调用外部类结构?

    68210

    「JAVA」Java面向对象之final、abstract抽象、和变量生命周期

    在构造器调用方法(初始化方法),此时一般使用final修饰。这也是构造器不能被继承原因。 注意: final修饰方法了,子类可以调用,但是不能覆盖(重写)。...通常开发,我们建议final修饰常量名用大写字母表示,多个单词之间使用下划线(_)连接:: public static final String USER_NAME = "用户名"; 且在Java...普通类有的成员(方法、字段、构造器),抽象类本质上也是一个类,故其都有。抽象类不能创建对象,但抽象类是可以包含普通方法。...,不难发现,其实所谓静态导入也是一个语法糖/编译器级别的新特性,其实在底层也是类名.静态成员去访问。...所以在企业项目开始不建议使用静态导入,容易引起字段名,方法名混淆,不利于项目维护。 字段不存在多态 通过对象调用字段,在编译时期就已经决定了调用哪一块内存空间数据。

    61630

    ​JDK8线程池BUG引发思考

    ,线程池BUG在JDK8就已经存在但是直到JDK11才被修复,这里在原文基础上补充相关知识点,算是给自己做一个笔记。...final,特别是静态方法可以直接内联到一个代码块。...❝小贴士: 非虚方法:如果方法在编译期就确定了具体调用版本,这个版本在运行时是不变,这样方法称为非虚方法。 虚方法:静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法。...,但是对于终结方法并不是如此,终结方法可以在静态字段记录对象引用,防止被垃圾回收,同时一旦被记录异常,那么就可以调用任何原本不应该允许出现方法,所以「从构造器抛出异常虽然足以阻止对象存活,但是对于终结方法来说...为了解决这个问题,最终建议方法是重写一个并且为final终结方法。

    85960

    Java避坑指南:使用ThreadLocalRandom不可设置为静态变量,否则导致随机数可预测

    ---- 简介 ---- 在博文中,我们建议尽量使用private static final ThreadLocal,使用工具类封装ThreadLocalset、get、remove方法。...但是Java并发工具ThreadLocalRandom则不能设置为静态变量,否则导致随机数可预测,正确使用ThreadLocalRandom方式为: ThreadLocalRandom.current...ThreadLocalRandom随机数可预测坑 ---- 示例: 输出结果: 在jdk11环境下,两个线程随机数竟是一样。...其原因在于主线程调用了ThreadLocalRandom.current(),使得主线程拥有的随机种子值初始化了,而调用产生随机数值方法的当前线程随机种子初始值为0: 而每次更新后值为:当前值加上一个常量...在上述示例,输出结果在jdk11环境下,两个线程随机数竟是一样,但是在jdk19环境下两个线程随机数不是一样,主要是因为随机数每次更新值时候,把线程ID也放进去了: 小结 ---- 正确使用

    39810

    深入分析Java反射(二)-数组和枚举

    前提 Java反射API在JavaSE1.7时候已经基本完善,但是本文编写时候使用是Oracle JDK11,因为JDK11对于sun包下源码也上传了,可以直接通过IDE查看对应源码和进行Debug...枚举可以包含一个或者多个枚举常量,这些枚举常量都是该枚举实例。枚举声明其实和一个普通Class声明相似,因为它可以包含字段、方法和构造函数之类成员。...因为枚举就是普通Java类,因此反射相关类库并没有添加一个java.lang.reflect.Enum类型,反射中API和枚举相关有: boolean java.lang.Class#isEnum...2、所有的枚举成员属性都变成static final修饰在第1步中提到Java类实例,属性名称和原来枚举名字一致,实例在静态代码块创建。...3、新增了一个static final修饰第1步中提到Java类数组实例,名称为$VALUES,此数组在静态代码块创建,基于此数组还新增了一个静态方法values(),此方法就是直接返回数组克隆

    61130

    Java关键字和保留字

    只能在声明 private(内部)类、方法或字段引用这些类、方法或字段。在类外部或者对于子类而言,它们是不可见。...可以在声明 protected 类、方法或字段类、同一个其他任何类以及任何子类(无论子类是在哪个包声明引用这些类、方法或字段。...子类继承父类所有 public 和 protected 变量和方法(但是不包括构造函数)。 子类可以重写父类任何非 final 方法。一个类只能扩展一个其他类。...abstract 意味着必须扩展类,final 意味着不能扩展类。一个方法不能同时是 abstract 又是 final。abstract 意味着必须重写方法,final 意味着不能重写方法。...静态方法只能继承,不能重写(Override),因为重写是用于表现多态重写只能适用于实例方法,而静态方法是可以不生成实例直接用类名来调用,这就会与重写定义所冲突,与多态所冲突,所以静态方法不能重写

    96030

    JDK11升级JDK17最全实践干货来了

    它适用于存储纯粹值类型数据,接口传输数据、坐标点和只读日志记录。与 lombok 相比,record 简化了定义纯粹数据类型过程。...比较实用一个特性,可以用来限制类层次结构 5.2.6 其他优化和升级 感兴趣读者,推荐阅读OpenJDK官方文档说明,从JDK11到JDK17改动: https://openjdk.org/projects...在JVM启动参数设置--add-opens jdk.proxy2来开启私有字段访问,但因为动态代理生成包名是随机不明确,所以这种方案不可行。...原因是方法 Modifier.isStatic(f.getModifiers()) 本来就要跳过静态字段,这样修改直接避免了访问。推动concrete团队修复问题。...如果还停留在JDK8,推荐先升级JDK11,再到JDK17,具体升级步骤先参考上篇文章“JDK8升级JDK11最全实践干货来了”,再参考本章升级步骤。

    1.5K10

    【JDK14 新特性】Record

    还有一些开发会选择使用一些第三方类库,Lombok等来生成这些方法。 JDK14预览特性:神说要用record,于是就有了。...2. record作用 record 是一种全新类型,它本质上是一个 final 类,同时所有的属性都是 final 修饰,它会自动编译出 public get 、hashcode 、equals、toString...一个 equals 方法实现,执行比较时会比较该类所有成员属性。 重写 hashCode() 方法。 一个可以打印该类所有成员属性 toString() 方法。 只有一个构造方法。...注意: 不会生成setter,因为它是final 此外: 还可以在record声明定义静态字段静态方法、构造器或实例方法。...不能在record声明定义实例字段;类不能声明为abstract;不能声明显式父类等。 3.

    53040

    【Java SE学习】Day6 JavaSE面向对象(下)看着三篇就够了

    当修改其中一个对象静态属性时,不会导致其他对象同样属性值修改。 静态变量:我们创建了类多个对象,多个对象共享同一个静态变量。...比如:String类、System类、StringBuffer类 final 用来修饰方法:表明此方法不可以被重写   比如:Object类getClass(); final 用来修饰变量:此时"变量..."就称为是一个常量 final修饰属性:可以考虑赋值位置:显式初始化、代码块初始化、构造器初始化 final修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。...这就需要我们必须在实现类重写此方法 知识点5:如何在子类(或实现类)方法调用父类、接口中被重写方法 public void myMethod(){         method3();//调用自己定义重写方法...(); Person.Bird bird = p.new Bird(); //如何在成员内部类调用外部类结构?

    38630

    Java基础知识点面试手册(基础知识+集合)

    接口成员(字段 + 方法)默认都是 public ,并且不允许定义为 private 或者 protected。 接口字段默认都是 static 和 final 。...接口字段只能是 static 和 final 类型,而抽象类字段没有这种限制。 接口成员只能是 public ,而抽象类成员可以有多种访问权限。 4....使用抽象类: 需要在几个相关类中共享代码。 需要能控制继承来成员访问权限,而不是都为 public。 需要继承非静态static和非常量final字段。...可视化开发环境( IDE)可以从利用反射中可用类型信息受益,以帮助程序员编写正确代码。 调试器和测试工具 : 调试器需要能够检查一个类里私有成员。...安全限制 :使用反射技术要求程序必须在一个没有安全限制环境运行。如果一个程序必须在有安全限制环境运行, Applet,那么这就是个问题了。

    71420

    java 语言【继承和多态】

    通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法参数列表不同(重载),根据调用 方法适传递参数选择合适方法访问,如果没有则报错; 问题:如果子类存在与父类相同成员时,那如何在子类访问父类相同名称成员呢...【相同点】 都是Java关键字 只能在类静态方法中使用,用来访问非静态成员方法和字段 在构造方法调用时,必须是构造方法第一条语句,并且不能同时存在 【不同点】 this是当前对象引用,...修饰变量或字段,表示常量(即不能修改) final int a = 10; a = 20; // 编译出错 修饰类:表示此类不能被继承 final public class Animal { ... }...组合并没有涉及到特殊语法 (诸如 extends 这样关键字), 仅仅是将一个实例作为另外一个字段。...重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写

    8110

    深入浅出JVM(五)之Java中方法调用

    ,接下来会详细介绍 图片非虚方法与虚方法非虚方法: 静态方法,私有方法,父类方法,被final修饰方法,实例构造器其他不是非虚方法方法就是虚方法非虚方法特点就是没有重写方法,适合在类加载阶段就进行解析...(符号引用->直接引用) 【编译时就能够确定】调用指令普通调用指令invokestatic:调用静态方法invokespecial:调用私有方法,父类方法,实例构造器方法,final方法...异常)因此,子类重写父类方法时,根据invokevirtual指令规则,先在实际类型(子类)寻找,找不到才去父类,所以存在重写多态频繁动态分派会重新查找栈顶元素实际类型,会影响执行效率为提高性能,...(根据一个宗量对方法进行选择)总结本篇文章围绕Java方法调用,深入浅出解析非虚方法与虚方法、调用字节码指令、解析调用和分派调用、单分派以及多分派不能重写方法(静态、私有、父类、final修饰、...实例构造)被称为非虚方法,其他方法为虚方法非虚方法是编译时就能够确定,解析调用就是调用非虚方法分派调用静态分派也是编译时确定,是特殊解析调用,根据静态类型选择方法,典型例子就是方法重载分派调用动态分派是根据实际类型选择方法

    13721

    Java入门必背100条

    实例变量:创建了类多个对象,每个对象都独立拥有一套类静态属性。当修改其中一个对象静态属性时,不会导致其他对象同样属性值修改。...比如:String类、System类、StringBuffer类 final 用来修饰方法:表明此方法不可以被重写比如:Object类getClass(); final 用来修饰变量:此时...”变量”就称为是一个常量 final修饰属性:可以考虑赋值位置有:显式初始化、代码块初始化、构造器初始化 final修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。...⑤如何在子类(或实现类)方法调用父类、接口中被重写方法。...言外之意,不使用final,就可以被继承 可以被abstract修饰 92、如何在外部类创建成员内部类对象?

    1K20

    Java基础-Object类方法

    但是在子类重写该方法时,必须要加上一个 “克隆标记” 接口 Cloneable,这个接口里面什么方法都没有,纯粹就是一个 “标记”。...,该类没有实际重写父类 clone() 方法,只是简单调用了父类 clone() 方法。...可以看到 c1 所引用对象 name 字段和 c2 所引用对象 name 字段地址相同,说明 c1.name 和 c2.name 都是对 “小明” 这一个字符串对象引用,而并没有因克隆而产生一个...因为如果对象要存储在散列结构( HashTable、HashSet、HashMap)时,判断两个对象是否相等依据是 hashCode() 方法,如果只重写了 equals() 方法,而没有重写 HashCode...4、hashCode() 方法 hashCode() 方法当然就是用来返回一个对象哈希码(hashCode)啦,hashCode 是一个 int 类型数字,如果我们没有重写一个 toString

    76130

    Java基础面试题&知识点总结(下篇)

    方法重载允许我们使用同一个方法名执行不同操作。 方法重写(Overriding):在子类,如果有一个方法与父类某个方法名称、参数列表和返回类型都相同,那么这个方法就被称为重写方法。...方法重写允许我们在子类改变父类行为。 方法重载和方法重写主要区别如下: 应用场景:方法重载发生在同一个,方法重写发生在父类和子类之间。...解答:在 Java final一个关键字,它可以用来修饰类、方法和变量。 final 类:如果一个类被声明为 final,那么它不能被继承。这意味着没有其他类可以是这个类子类。...final 类通常表示最终、不可改变实体,例如 String 类和 Integer 类都是 final 类。 final 方法:如果一个方法被声明为 final,那么它不能被子类重写。...在 Java ,当一个类被加载到 JVM 时,JVM 会为这个类生成一个 Class 对象。这个 Class 对象包含了类所有信息,包括类名称、包、父类、接口、构造器、方法、字段等。

    27040

    Java基础八股文第二弹

    static变量也称作静态变量,静态变量和非静态变量区别是:静态变量被所有的对象所共享,在内存只有一个副本,它当且仅当在类初次加载时会被初始化。...final修饰方法不能被子类重写 final修饰类不能被继承。 this this.属性名称指访问类成员变量,可以用来区分成员变量和局部变量。...我们重写了父类getName()方法,如果在重写getName()方法我们要调用父类相同方法,必须要通过super关键字显式指出。...final关键字作用? final 修饰类不能被继承。 final 修饰方法不能被重写final 修饰变量叫常量,常量必须初始化,初始化之后值就不能被修改。 方法重载和重写区别?...1、语法层面上区别 抽象类可以有方法实现,而接口方法只能是抽象方法; 抽象类成员变量可以是各种类型,接口中成员变量只能是public static final类型; 接口中不能含有静态代码块以及静态方法

    68710

    Java 基础知识:面试官必问问题

    private 方法隐式地被指定为 final,如果在子类定义方法和基类一个 private 方法签名相同,此时子类方法不是重写基类方法,而是在子类定义了一个方法。...接口字段只能是 static 和 final 类型,而抽象类字段没有这种限制。 接口成员只能是 public ,而抽象类成员可以有多种访问权限。...重写(Override) 存在于继承体系,指子类实现了一个与父类在方法声明上完全相同一个方法。...可视化开发环境( IDE)可以从利用反射中可用类型信息受益,以帮助程序员编写正确代码。 调试器和测试工具 : 调试器需要能够检查一个类里私有成员。...安全限制 :使用反射技术要求程序必须在一个没有安全限制环境运行。如果一个程序必须在有安全限制环境运行, Applet,那么这就是个问题了。

    48870

    jvm之方法区演变及方法区GC解读

    有永久代,但已经逐步 “去永久代”,字符串常量池,静态变量移除,保存在堆 JDK1.8 无永久代,类型信息,字段,方法,常量保存在本地内存元空间,但字符串常量池、静态变量仍然在堆。...类型对象实例,里面有一个名为staticobj实例字段: 从《Java虚拟机规范》所定义概念模型来看,所有Class相关信息都应该存放在方法区之中,但方法区该如何实现,《Java虚拟机规范》并未做出规定...(Hotspot虚拟机元空间或者永久代)是没有垃圾收集行为,其实不然。...事实上也确实有未实现或未能完整实现方法区类型卸载收集器存在(JDK11时期zGC收集器就不支持类卸载)。 一般来说这个区域回收效果比较难令人满意,尤其是类型卸载,条件相当苛刻。...字面量比较接近Java语言层次常量概念,文本字符串、被声明为final常量值等。

    22340
    领券