浅谈java中的声明常量为什么要用static修饰

今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰。结果sonar代码检查提示:

Rename this field "PERSON_TYPE_USER" to match the regular expression '^[a-z][a-zA-Z0-9]*$'。

我一想我这是正确的命名规范啊,于是百度一搜这提示,发现前面加个static关键字修饰就可以了。

那么问题来了,我就当前类要使用,不需要设置成全局常量也可以,用static修饰常量有什么好处?

好处就是:在创建类的多个对象时,用static修饰的常量在内存中只有一份拷贝。不用static修饰则可能有多份拷贝。

class A {

  public static final String CONSTANT_A = "Hello";
  public final String CONSTANT_B = "Hello";
}

创建A的多个对象时,CONSTANT_A在内存中只有1份拷贝,CONSTANT_B在内存中有多份拷贝。

补充知识:Java常量与静态常量能不能修改值

我就废话不多说了,大家还是直接看代码吧~

import java.util.*;

// 2019/9/4
public class ConstVarDemo {
 private final int v1 = 1;
 private static final int v2 = 2;

 private final List<Integer> list1 = new LinkedList<>();
 private static final List<Integer> list2 = new LinkedList<>();

 // 基本类型常量修改
 // 编译失败
 public void test1() {
 // System.out.println(v1);

 // 以下操作错误: 无法为最终变量v1分配值
 // v1 = 11; // 修改常量的值

 // System.out.println(v1);

 // System.out.println(v2);

 // 以下操作错误: 无法为最终变量v2分配值
 // v2 = 22; // 修改静态常量的值
 // System.out.println(v2);
 }

 // 对象引用常量状态进行修改
 // 编译通过
 public void test2() {
 System.out.println(list1.toString());
 list1.add(1); // 常量引用
 System.out.println(list1.toString());

 System.out.println(list2.toString());
 list2.add(2); // 静态常量引用
 System.out.println(list2.toString());
 }

 // 改变对象类型常量的引用
 // 编译失败
 public void test3() {
 // System.out.println(list1.toString());
 // list1 = new ArrayList<>(); // 错误: 无法为最终变量list1分配值
 // list1.add(1);
 // System.out.println(list1.toString());

 // System.out.println(list2.toString());
 // list2 = new ArrayList<>(); // 错误: 无法为最终变量list2分配值
 // list2.add(2);
 // System.out.println(list2.toString());
 }

 public static void main(String[] args) {
 new ConstVarDemo().test3();
 }
}

总结

不管静态常量还是普通常量只要是基本类型就不能在初始化后重新修改其值

对象类型普通常量、静态常量可以在初始化后修改其对象状态,但不可以改变其引用

以上这篇浅谈java中的声明常量为什么要用static修饰就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java Testcontainers库实现测试功能

    1.Testcontainers介绍: Testcontainers是一个Java库,它支持JUnit测试,提供公共数据库.SeleniumWeb浏览器或任何可以在Docker容器中运行的轻量级.一次性实例. 测试容器使以下类型的测试更加容易: 数据访问层集成测试: 使用MySQL,PostgreSQL或Oracle数据库的容器化实例测试您的数据访问层代码,但无需在开发人员的计算机上进行复杂的设置,并且测试将始终从已知的数据库状态开始,避免"垃圾"数据的干扰.也可以使用任何其他可以容器

  • Java四舍五入时保留指定小数位数的五种方式

    方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); 输出结果f1为 3.15: 源码解读: public BigDecimal setScale(int newScale, int roundingMode) //int newScale 为小数点后保留的位数, int roundingMode 为变

  • 谈谈你可能并不了解的java枚举

    前言 枚举在java里也算个老生长谈的内容了,每当遇到一组需要类举的数据时我们都会自然而然地使用枚举类型: public enum Color { RED, GREEN, BLUE, YELLOW; public static void main(String[] args) { Color red = Color.RED; Color redAnother = Color.RED; Color blue = Color.BLUE; System.out.println(red.equals(r

  • Java 实现跨平台的操作方式

    什么是平台无关性 平台无关性就是一种语言在计算机上的运行不受平台的约束,一次编译,到处执行. 也就是说,用Java创建的可以执行二进制程序,能够不加改变的运行于多个平台,Java减少了开发和部署的多个平台的成本和时间. 平台无关性的实现 其中扮演者重要的角色有Java语言规范.Class文件.Java虚拟机(JVN)等. 在计算机世界中,计算机只认识0和1.所以,真正被执行的其实是由0和1组成的二进制文件. 日常开发使用的C.C++.Java.python 都属于是高级语言,而非二进制语言,所以

  • Java实现五子棋的基础方法

    本文实例为大家分享了Java实现五子棋的具体代码,供大家参考,具体内容如下 任务概述: 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏.通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜. 任务过程: 1.绘制棋盘 2.提示黑方(用 1 表示)和白方(用 2 表示)分别下棋(X,Y 轴位置)并重新绘制棋盘 3.每当一方下棋后判断是否获胜 重点讲解: 1.关于胜利的判断: 根据用户所下棋子的位置对其周围进行检测,分为以下情况: 横向:当前下棋位

  • java中spi使用详解

    一.简介 java中spi(service provider interface)是jdk内置的一种服务发现机制,可以基于配置,在运行时加载指定服务.java中提供了很多服务提供接口,如jdbc.jndi等. 1.什么是SPI SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件. SPI的作用就是为这些被扩展的API寻找服务实现. 2.SPI和API的使用场景 API (Application Pr

  • 浅谈java中的声明常量为什么要用static修饰

    今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰.结果sonar代码检查提示: Rename this field "PERSON_TYPE_USER" to match the regular expression '^[a-z][a-zA-Z0-9]*$'. 我一想我这是正确的命名规范啊,于是百度一搜这提示,发现前面加个static关键字修饰就可以了. 那么问题来了,我就当前类要使用,不需要设置成全局常量也可以,用static修饰常量有什么好处? 好处就是

  • 浅谈java中null是什么,以及使用中要注意的事项

    1.null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,例如: Integer i=null; Float f=null; String s=null; 但是不能把null赋值给基本类型,如int ,float,double等 int k=null ----------编译器会报错cannot convert from null to int 2.null是关键字,像public.static.final.它是大小写敏感的,你不能将

  • 浅谈Java中各种修饰符与访问修饰符的说明

    JAVA中的类只能是public 或者package的.这是符合逻辑的:人们定义类的初衷就是为了让别人用的.倘若是private,别人怎么调用?但是有一个内部类可以被定义为private.严格上说,内部类,算不得上是一种光明正大的类,内部类在某种意义上是类这个王国里的特务和地下工作者.特务和地下工作者为王国起了不少作用,但是几乎从来不敢在公众场合抛投露面.就算要露面,也要在主人(class)的同意下,向导(Interface)的引导下,才敢战战兢兢的走出来.下面是常规的一些类的修饰符和访问修饰符

  • 浅谈Java中的final关键字与C#中的const, readonly关键字

    在编程语言中都有某种方式,告知编译器一块数据是恒定不变的.有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用final修饰变量实现这两个需求 <pre name="code" class="java">//编译器常量 private final int valueOne = 9; private static final int VALUE_TWO = 99; public static f

  • 浅谈Java泛型让声明方法返回子类型的方法

    泛型典型的使用场景是集合.考虑到大多数情况下集合是同质的(同一类型),通过声明参数类型,可免去类型转换的麻烦.本文将讨论本人阅读Spring Security源码时遇到的一个关于泛型递归模式的问题. 声明方法返回子类型 在Spring Security的源码里有一个ProviderManagerBuilder接口,声明如下 public interface ProviderManagerBuilder<B extends ProviderManagerBuilder<B>> ext

  • 浅谈Java中方法参数传递的问题

    可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递.在这里,定义方法时,参数列表中的变量,我们称为形式参数. 调用方法时,传入给方法的数值,我们称为实际参数 在Java中调用方法时,如果参数是基本类型(byte/short/int/long/float/double/char/boolean)以及String类型时,形式参数的改变不影响实际参数. 以下代码在内存中发生的动作:

  • 浅谈java中==以及equals方法的用法

    equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. "=="比较两个变量本身的值,即两个对象在内存中的首地址. "equals()"比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = "abc", s4 ="abc" ; s1 =

  • 浅谈java中String的两种赋值方式的区别

    类似普通对象,通过new创建字符串对象.String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收. 直接赋值.如String str = "Hello&

  • 浅谈Java中的class类

    Class 类是在Java语言中定义一个特定类的实现.一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类.Class类的对象用于表示当前运行的 Java 应用程序中的类和接口. 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象.基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象. 以下示例使用

  • 浅谈Java中对类的主动引用和被动引用

    本文研究的主要是Java中类的主动引用和被动引用,具体介绍如下. 主动引用,这里介绍的是主动引用的五种场景 1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法. 2.反射 3.子类初始化前会先初始化父类 4.包含main方法的类,虚拟机启动时会先初始化该类 5.使用jdk的动态语言支持时(不明) 被动引用: class SuperClass{ static{ syso("sup

随机推荐