java中static和const和final的区别

static 关键字

static 关键字用于声明类的成员(方法或变量)为静态成员。静态成员属于类本身,而不是类的实例。换句话说,静态成员可以通过类名直接访问,而不需要实例化对象。

  • 静态变量:属于类的所有对象共享,类的所有实例共享相同的内存位置。
  • 静态方法:可以在没有创建对象的情况下直接调用。
  • 静态块:在类加载时执行一次,用于初始化类的静态成员。
  • 编译时机static 关键字主要在编译时确定。它告诉 JVM,该成员属于类而非实例,因此不需要通过对象来访问。static 修饰的变量和方法会被加载到 方法区 中的 类的结构部分
  • 内存存储位置static 成员存储在 方法区 中的 类的静态变量区。每个类只有一个静态变量区,所有实例共享这部分内存。静态方法也存储在方法区的 方法区(Method Area) 中。

count 是静态变量,在两个 Counter 对象中共享,displayCount 是静态方法,可以通过类名直接调用。

class Counter {static int count = 0;  // 静态变量Counter() {count++;  // 每次创建对象时,静态变量 count 会增加}static void displayCount() {System.out.println("Count: " + count);  // 静态方法可以直接访问静态变量}
}public class Main {public static void main(String[] args) {Counter c1 = new Counter();Counter c2 = new Counter();Counter.displayCount();  // 调用静态方法,输出 Count: 2}
}

final 关键字

final 是一个多用途的关键字,它可以用于变量、方法和类的定义,分别具有不同的含义。

  • 用于变量:声明为 final 的变量是常量,一旦赋值后不可更改(不可重新赋值)。
  • 用于方法:声明为 final 的方法不能被子类重写。
  • 用于类:声明为 final 的类不能被继承。
  • 编译时机final 关键字的使用在编译时就确定了变量、方法或类的行为。例如,如果一个方法被声明为 final,编译器会禁止任何子类重写该方法;如果一个类被声明为 final,编译器会禁止任何子类继承该类。对于变量,final 确保该变量一旦赋值后不可修改。
  • 内存存储位置
    • final 变量:常量(final 变量)通常在 方法区 中的 常量池(Constant Pool) 中存储。如果是局部变量,存储在栈中。
    • final 类和方法:存储在 方法区 中的 类的结构部分final 类和方法不会被继承或重写,因此它们在运行时不需要动态解析。

PI 被声明为 final,因此它的值不能更改。

// final 变量
class Circle {final double PI = 3.14159;  // 常量,值不可更改void calculateArea(double radius) {double area = PI * radius * radius;  // 使用常量System.out.println("Area: " + area);}
}public class Main {public static void main(String[] args) {Circle circle = new Circle();circle.calculateArea(5);// PI = 3.14;  // 编译错误,无法修改 final 变量的值}
}

const 关键字

在 Java 中,const 是一个保留关键字,但它并没有在语言中实现功能,实际上 Java 中并不使用 const 来定义常量。Java 提供了 final 来替代 const 的功能。

  • const 在 Java 中没有实现任何功能。
  • const 关键字保留用于未来可能的用途,但目前不被使用。
  • 常量在 Java 中应该使用 final 关键字来定义。
  • 编译时机:虽然 const 是 Java 中的保留关键字,但它并没有被实现。实际上,Java 没有使用 const 来定义常量。在 Java 中,我们通常使用 final 来定义常量。
  • 内存存储位置:由于 const 不被实际使用,它不会在内存中占用任何空间。任何常量都应该使用 final 来定义,并存储在 方法区的常量池 或堆栈中。

使用 const 会导致编译错误,因为 const 在 Java 中并没有实际作用。 

// const 在 Java 中并不使用
public class Main {public static void main(String[] args) {// const int x = 10;  // 编译错误,const 不被使用}
}
特性staticfinalconst
定义用于类的成员(方法、变量)指定该成员为静态的用于变量、方法、类,表示常量、不允许修改或重写目前在 Java 中没有实现
使用场景当需要共享数据或功能时使用用于常量、禁止继承/重写的方法、不可修改的变量Java 中不使用 const
作用域静态成员属于类,而不是实例对象变量不可修改,方法不可重写,类不可继承不被使用
示例static int count;final int x = 10;不支持
静态方法静态方法可以在没有实例化对象的情况下直接调用不适用不适用
继承/重写静态成员可以被继承,但不可以被重写final 方法不能被重写,final 类不能被继承不适用
关键字编译时机内存存储位置说明
static编译时方法区 中的 类的静态变量区,静态方法也存储在方法区中static 成员属于类而非实例,所有实例共享这部分内存
final编译时方法区的常量池堆栈(针对局部变量)final 变量会存储在常量池中,final 方法和类存储在方法区
const编译时不会被使用const 是保留关键字,Java 没有实际应用,通常用 final 代替

完整示例

class Person {static String species = "Homo sapiens";  // 静态变量final String name;  // 常量,必须在构造方法中初始化Person(String name) {this.name = name;}// final 方法,不能被子类重写final void showDetails() {System.out.println("Name: " + name + ", Species: " + species);}
}class Student extends Person {Student(String name) {super(name);}// 编译错误,无法重写 final 方法// void showDetails() { //     System.out.println("Student: " + name);// }
}public class Main {public static void main(String[] args) {Person person = new Person("Alice");person.showDetails();  // 调用父类的 final 方法// 通过类名访问静态变量System.out.println("Species: " + Person.species);// 修改静态变量Person.species = "Homo erectus";System.out.println("Updated Species: " + Person.species);// name = "Bob";  // 编译错误,final 变量不可修改}
}

Java 内存区的详细说明

1.方法区(Method Area)
  • 存放内容:类的结构(包括类的元数据)、静态变量、常量池、方法代码等。
  • 静态成员和常量static 成员变量和 final 常量通常存储在方法区中。静态方法也存储在方法区。常量则会存放在类的常量池(Constant Pool)中。
2.堆(Heap)
  • 存放内容:对象实例、数组、类的实例等。
  • final 变量(如果是对象引用):如果 final 变量是引用类型,则它的引用会存放在栈中,但对象本身会存放在堆中。
3.栈(Stack)
  • 存放内容:局部变量、方法调用信息、操作数栈等。
  • final 局部变量:局部变量(如方法参数)如果是 final,则存储在栈上。
4.程序计数器(Program Counter Register)
  • 存放内容:每个线程都有一个程序计数器,指向当前执行的字节码指令。
  • final 修饰的局部变量(参数):存储在栈上,而栈本身不直接与程序计数器相关联。
5.本地方法栈(Native Method Stack)
  • 存放内容:存放 native 方法的调用信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501861.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件类型都有哪些

在消息中间件的专业术语中,我们可以根据其特性和使用场景将其划分为几种主要的类型。这些类型不仅反映了它们各自的技术特点,还决定了它们在不同应用场景下的适用性。 1. 点对点(Point-to-Point)消息中间件: • 这类中…

服务器迁移中心——“工作组迁移”使用指南

简介 服务器迁移中心(Server Migration Center,简称SMC)是阿里云提供给您的迁移平台。专注于提供能力普惠、体验一致、效率至上的迁移服务,满足您在阿里云的迁移需求。 工作组迁移是SMC的一项功能,提供标准化迁移流程…

C#调用Lua

目录 xLua导入 打包工具导入 单例基类导入与AB包管理器导入 Lua解析器 文件加载与重定向 Lua解析器管理器 全局变量获取 全局函数获取 对于无参数无返回值 对于有参数有返回值 对于多返回值 对于变长参数 完整代码 List与Dictionary映射Table 类映射Table 接口映射…

Wend看源码-Java-fork/Join并行执行任务框架学习

摘要 本文主要介绍了Java的Fork/Join并行任务执行框架,详细阐述了其工作原理和核心构件,全面解读了Fork/Join框架的运作机制,旨在为学习这一框架的开发者提供一份详实且实用的参考资料。 Java的Fork/Join框架是Java 7引入的一个用于并行执行任…

C++ 中 Unicode 字符串的宽度

首先,什么是 Unicode? Unicode 实际上是一个统一的文字编码标准,它出现目的是为了解决不同计算机之间字符编码不同而导致的灾难性不兼容问题。 Unicode 字符集与 Unicode 编码是两种不同的概念。Unicode 字符集实际是对进入标准的所有文字用…

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …

MIPI_DPU 综合(DPU+MIPI+Demosaic+VDMA 通路)

目录 1. 简介 2. 创建 Platform 2.1 Block Design 2.1.1 DPU PFM Lite 2.1.2 DPU prj 2.1.3 DPU MIPI Platform 2.2 pin 约束 2.2.1 GPIO 约束 2.2.2 IIC 约束 2.1.3 DPHY 约束 3. 报错总结 3.1 AXI_M 必须顺序引用 3.2 DPU 地址分配错误 4. Design Example 4.…

Spring系列一:spring的安装与使用

文章目录 ?? 官方资料 ??Spring5下载??文档介绍 ??Spring5 ??内容介绍??重要概念 ??快速入门 ??Spring操作演示??类加载路径??Spring容器结构剖析??Debug配置 ??实现简单基于XML配置程序 ??Spring原生容器结构梳理??作业布置??Spring课堂练习 …

AutoSar架构学习笔记

1.AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一个针对汽车行业的软件架构标准,旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元(ECU&#xf…

Kernel Stack栈溢出攻击及保护绕过

前言 本文介绍Linux内核的栈溢出攻击,和内核一些保护的绕过手法,通过一道内核题及其变体从浅入深一步步走进kernel世界。 QWB_2018_core 题目分析 start.sh qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./core.cpio \-append "…

【顶刊TPAMI 2025】多头编码(MHE)之Part 6:极限分类无需预处理

目录 1 标签分解方法的消融研究2 标签分解对泛化的影响3 讨论4 结论 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:https:…

友元和运算符重载

1. 友元 可以把某些选定的函数看作类的“荣誉函数”,允许它们访问类对象中非公共的成员,就好像它们是类的成员一样,这种函数称为类的友元。友元可以访问类对象的任意成员。 1.1 友元函数 友元函数是一种定义在类外部的普通函数&#xff0…

Git 树形图表不显示问题

注册表修改 ## 注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 生效 右键重启 windows资源管理器

【MySQL基础篇】三、表结构的操作

文章目录 Ⅰ. 创建表1、语法2、创建表样例3、创建和其它表一样结构的表 Ⅱ. 查看表结构1、查看数据库中的表2、查看指定表的属性3、获取表的创建语句 Ⅲ. 删除表Ⅳ. 修改表结构1、向表中插入新的字段2、删除表中的字段3、修改表名4、修改字段属性 Ⅰ. 创建表 1、语法 create …

aws(学习笔记第二十二课) 复杂的lambda应用程序(python zip打包)

aws(学习笔记第二十二课) 开发复杂的lambda应用程序(python的zip包) 学习内容: 练习使用CloudShell开发复杂lambda应用程序(python) 1. 练习使用CloudShell CloudShell使用背景 复杂的python的lambda程序会有许多依赖的包,如果不提前准备好这些python的…

SAP SD销售模块常见BAPI函数

【SAP系统研究】 #SAP #SD #销售管理 1、销售订单 BAPI_SALESORDER_CREATEFROMDAT2 创建销售订单 BAPI_CUSTOMERRETURN_CREATE 创建退货订单 SD_SALESDOCUMENT_CREATE 创建贷项订单 BAPI_SALESORDER_CHANGE 修改销售订单 STATUS_READ 查看销售订单状态VB销售订单000000 I_CHA…

CSS学习记录21

CSS 工具提示 通过CSS 创建工具提示&#xff08;Tooltip)。 当用户将鼠标指针移动到元素上时&#xff0c;工具提示通常用于提供关于某内容的额外信息&#xff1a; <style> /* Tooltip 容器 */ .tooltip {position: relative;display: inline-block;border-bottom: 1px …

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…

[cg] android studio 无法调试cpp问题

折腾了好久&#xff0c;native cpp库无法调试问题&#xff0c;原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual&#xff0c;并在Symbol Directories 指定native cpp的so路径 UE项目调试&#xff1a; 使用Android Studio调试虚幻引擎Android项目…

uni-app深度解码:跨平台APP开发的核心引擎与创新实践

在当今数字化浪潮中&#xff0c;移动应用市场呈现出爆炸式增长。为了满足不同用户群体在不同操作系统上的需求&#xff0c;跨平台 APP 开发成为众多开发者的首选策略。uni-app 作为一款领先的跨平台开发框架&#xff0c;以其独特的优势和创新的实践在众多同类产品中脱颖而出。它…