精华内容
下载资源
问答
  • 常量的值可以在代码中被修改
    2021-05-22 14:13:09

    严格意义上来讲,C语言并没有绝对的常量这个概念。const是一个C语言的关键字,它限定了一个变量不允许被改变。

    例如:下面代码

    #define N 10

    int main()

    {

    int arr[N];  //编译通过,因为这里N被宏替换为10

    return 0;

    }

    但是,

    int main()

    {

    int const N =10;

    int arr[N]; //编译不通过,因为编译器认为N是个变量,不是常量。只不过这个变量不允许被修改

    }

    而且在C语言中被const修饰的就一定是常量吗?真的能不动如山吗?

    例如下面代码:

    const int a = 10;

    int *pa = &a;

    *pa = 20;

    printf("%d/n",*pa);

    printf("%d/n",a);

    编译时候,只是有个警告并没有错误,而且运行时,a的值也修改为20了。

    要真正保证不能修改a,代码修改如下:

    const int a = 10;

    const int *pa = &a; //或者int const *pa=&a;

    *pa = 20;

    printf("%d/n",*pa);

    printf("%d/n",a);

    -------------------------------------------------------------------------

    说这番话的目的想告诉大家,C由于是个比较原始古老的语言,在设计初考虑的不像C++,Java等这些语言严谨。对于常量在C中,其实没有严格意义上的常量类型。const的目的只是限定一个变量不允许修改,换句话说,它的值对这个符号来说是只读的,但是并不能防止通过程序的内部(或者说外部)的方法来修改这个值。所以,我可以简单理解为const是修饰的变量只是一个只读的变量而已。

    更多相关内容
  • 常量就像是常规的变量,只不过常量值在定义后不能进行修改。 整数常量 整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。 整数...
  • 前言有的时候,我们需要修改一个变量的,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的。定义一个实体类class Bean{private ...

    前言

    有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值。

    定义一个实体类

    class Bean{

    private static final Integer INT_VALUE = 100;

    }

    利用反射修改私有静态常量方法

    System.out.println(Bean.INT_VALUE);

    Field field = Bean.class.getField("INT_VALUE");

    //将字段的访问权限设为true:即去除private修饰符的影响

    field.setAccessible(true);

    //去除final修饰符的影响,将字段设为可修改的

    Field modifiersField = Field.class.getDeclaredField("modifiers");

    modifiersField.setAccessible(true);

    modifiersField.setInt(field,field.getModifiers() & ~Modifier.FINAL);

    //把字段值设为200

    field.set(null,200);

    System.out.println(Bean.INT_VALUE);

    修改私有静态常量测试结果

    100

    200

    看到测试结果说明我们的反射修改成功了。

    利用反射修改共有静态变量方法

    class Bean{

    public static int nums = 100;

    }

    System.out.println(Bean.nums);

    Field field = Bean.class.getField("nums");

    field.set(null,200);

    System.out.println(Bean.INT_VALUE);

    测试结果修改成功。

    100

    200

    奇怪的地方

    注意到上述代码的中的静态常量类型是Integer,但是我们项目中实际需要修改的字段类型并不是包装类型Integer,而是java的基本类型int。

    当把常量的类型改成int之后。

    class Bean{

    private static final int INT_VALUE = 100;//把类型由Integer改成了int

    }

    在其他代码都不变的情况下,代码输出的结果竟然变成了诡异的:

    100

    100

    而且在调试的过程中发现,在第二次输出的时候,内存中的Bean.INT_VALUE是已经变成了200,但是System.out.println(Bean.INT_VALUE)输出的结果却依然时诡异的100?!

    是反射失效了吗?

    又试了其他几种类型,发现这种貌似失效的情会发生在int、long、boolean以及String这些基本类型上,而如果把类型改成Integer、Long、Boolean这种包装类型,或者其他诸如Date、Object都不会出现失效的情况。

    奇怪的原因

    对于基本类型的静态常量,JAVA在编译的时候就会把代码中对此常量中引用的地方替换成相应常量值。

    参考:Modifying final fields in Java

    即对于常量 public static final int maxFormatRecordsIndex = 100

    if( index > maxFormatRecordsIndex ){

    index = maxFormatRecordsIndex ;

    }

    这段代码在编译的时候已经被java自动优化成这样的:

    if( index > 100){

    index = 100;

    }

    所以在INT_VALUE是int类型的时候。

    System.out.println(Bean.INT_VALUE);

    编译时会被优化成下面这样:

    System.out.println(100);

    所以,自然,无论怎么修改Boolean.INT_VALUE,System.out.println(Bean.INT_VALUE)都还是会依然固执地输出100了。

    这本身是JVM的优化代码提高运行效率的一个行为,但是就会导致我们在用反射改变此常量值时出现类似不生效的错觉。

    相关文章

    总结

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

    展开全文
  • 该文档介绍了修改程序只读数据段(例如修改常量值)的几种方法,包含程序源代码
  • java常量和变量

    千次阅读 2021-02-28 19:16:35
    变量含义:程序过程变量的会发生变化,直白来说就是用来存储可变化的数据变量的好处:使内存空间的得到重复利用举个例子:1 System.out.println(10);2 System.out.println(10);3 System.out.println(10);这三...

    变量

    含义:在程序过程中变量的值会发生变化,直白来说就是用来存储可变化的数据

    变量的好处:使内存空间的得到重复利用

    举个例子:

    1 System.out.println(10);2 System.out.println(10);3 System.out.println(10);

    这三个10都是字面量,每一个字面量占用的都是不同的内存空间,就算这几个字面量相同,占用的也是不同的空间,字面量的内存是无法重复利用的,这样就浪费了空间,但是使用变量之后,内存空间就得到了重复利用。

    变量的三要素:

    1. 变量的数据类型(数据类型决定了内存空间的大小)

    2. 变量的名字(方便程序访问这个数据)

    3. 变量保存的值(保存的数据)

    注解:变量必须先声明,再赋值才能访问(没有赋值不能访问, 不然会报错),直白来说变量就是一个存储数据的一个盒子

    注意:在同一个域中,变量名不能重名

    1 int a = 10;2 double a = 10.01

    3 //重名了 不能编译成功

    变量的分类

    变量分为局部变量、成员变量。成员变量又分为实例变量(属性)和静态变量

    在方法体内声明的变量为:局部变量(在方法结束后,局部变量的内存空间就释放了)

    在类中,方法外声明的变量为成员变量,对于实例变量来说,声明了没有手动赋值,调用的时候系统默认赋值

    类型默认值

    byte、short、int

    0

    long

    0L

    float

    0.0F

    double

    0.0

    boolean

    false

    char

    ' '

    引用数据类型

    null

    注解:实例变量不能通过"类名."来访问

    实例变量前加上修饰列表符static就成为了静态变量,static是不允许用来修饰局部变量的。

    原因:被static关键字修饰变量随着类的加载而加载,被static修饰的变量成为了类变量 ,可以用类直接调用, 即作用域为全局,而局部变量在方法内,它的作用域在方法内,作用域变了,所以不允许用来修饰局部变量。

    静态变量: 在类加载时初始化,分配空间

    局部变量:在方法执行过程中分配空间

    实例变量:构造方法执行、对象创建时分配空间

    常量

    定义:常量就是在程序中固定不变的值,是不能改变的数据

    注解:Java中的常量,其实就是特殊的变量,也是固定不变的量,有且只能进行一次赋值。Java中定义常量的语法只需要在"定义变量的语法基础"上加上一个final关键字修饰即可

    常量有三种类型:静态常量、成员常量、局部常量、字面值常量

    字面值常量:

    整数型常量

    1 System.out.println(222);2 System.out.println(-111);

    浮点型常量

    1 System.out.println(3.14);2 System.out.println(3.1f);

    字符常量

    System.out.println('a');

    System.out.println('f');

    字符串型常量

    1 System.out.println("zhangsan");2 System.out.println("123456");

    布尔类型常量

    1 System.out.println(false);2 System.out.println(true);

    空常量(null)

    定义常量时需注意:

    在定义常量时就需要对该常量进行初始化,常量的值是不可改变的量、一次赋值,永不改变,也可以不用在声明时就初始化,但是初始化后必须在使用这个常量之前初始化。

    final修饰的实例变量必须手动初始化,不能采用系统默认值

    为了与变量区别,常量取名一般都用大写字符

    静态常量:被static和final修饰的成员变量

    注解:在定义静态常量时,就必须初始化,不然会报错

    例如下面的代码:

    1 public classTest {2 final static int i = 100;3 public static voidmain(String[] args) {4 System.out.println(i);5 }6 }

    成员常量:被final修饰的成员变量

    注解:当常量是成员常量时,在定义的时候必须初始化,不然编译会报错

    例如下面的代码:

    1 public classTest {2 final int i = 100;3 public static voidmain(String[] args) {4 Test test = newTest();5 System.out.println(test.i);6 }7 }

    局部常量:被final修饰的局部变量

    例如下面的代码:

    1 public classTest {2 public static voidmain(String[] args) {3 final int i = 100;4 System.out.println(i);5 }6 }

    展开全文
  • Java常量与静态常量能不能修改值

    千次阅读 2019-09-04 09:55:29
    直接上代码 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<>...

    直接上代码

    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();
    	}
    }
    

    总结

    • 不管静态常量还是普通常量只要是基本类型就不能在初始化后重新修改其值
    • 对象类型普通常量、静态常量可以在初始化后修改其对象状态,但不可以改变其引用
    展开全文
  • C语言之修改常量

    2021-05-20 09:10:16
    程序内存的存储划分对于程序内存是如何分布的,网上有多个解释的版本(解释为3、4、5、6个区的都有),这里我也不赘述了,反正该有的都有,只是看个人怎么理解建议自己搜来看看温习一下(主要是栈区、常量区、...
  • 常量是指该程序可能无法其执行期间改变的固定。这些固定称为文字。 常量可以是任何像一个整型常量,一个浮点常量,字符常量或字符串文字的基本数据类型。还有枚举常量常量是一样,只是它们的不能自己...
  • 详解JavaScript常量定义

    2020-11-26 14:41:33
    相信同学们看见这个...这里我们定义了一个对象 obj ,并且定义了这个对象的两个属性 a 、 b ,我们可以修改这两个属性的可以用 delete 关键字删除这两个属性,也可以用 for … in … 语句枚举 obj 对象的所有
  • Java 常量改变

    2021-03-08 06:24:58
    原因 经过一系列的研究、推测、搜索等过程,终于发现了原因: 对于基本类型的静态常量,JAVA编译的时候就会把代码中对此常量引用的地方替换成相应常量值。 参考:Modifying final fields in Java 即对于常量 ...
  • 修改一个常量类的静态常量值,然后把常量类的class文件上传到服务器后并没有生效,多次重启服务,最后查询了相关资料,使用GUI反编译工具反编译查看编译后源码,终于找到问题所在: 单纯的修改静态常量是没用的,...
  • 强制修改常量

    2018-12-15 22:38:00
    常量的值是不可以被修改的,但是由于指针的使用,使得常量值的改变成为可能。它所修改的常量也只是由const定义,通过取地址运算符指向该常量得到内存,然后改变该内存的内容,实现常量值的强制修改。 本例以整形...
  • 一、常量:不会变化的数据,不能被修改 1.举例: 比如 “hello” 为字符串常量、‘A’ 为字符常量 、-10 为整型常量、3.1415926 为浮点常量; 2. 宏定义 : #define PI 3.1415 这样定义出来的 PI 也是常量,数值为...
  • Java使用常量的方法发布时间:2020-08-20 14:38:32来源:亿速云阅读:92作者:小新小编给大家分享一下Java使用常量的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这...
  • 常量值是指不会更改的值。C + + 提供了两个关键字,它们使你能够表达不打算修改对象的意图,还可让你实现该意图。 C++ 需要常量表达式(计算结果为常量的表达式)以便声明: 数组边界 case 语句的选择器 位域...
  • python常量

    2020-11-21 00:42:13
    广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起... 那么python如何使用常量呢? 一般来说有如下两种方法: 通过命名风格来提示使用者该变量代表的意义为常量,比如max_number、total...
  • Calendar常量值

    千次阅读 2018-07-28 12:30:19
    关于Calendar常量值 © 黄玉昆 黑马帝 / 2013-2-28 09:42 / 535 人查看 / 1 人回复 / 0 人收藏 保留作者信息 禁止商业使用(站长自定义文字) 不知道大家有没有过这样的问题,就是你获取...
  • 【Java基础教程】第6讲,Java常量的定义和分类1 常量定义2 常量语法命名3 常量值3.1 整型常量值3.2 浮点数常量值3.3 布尔常量值3.4 字符型常量值3.5 字符串常量值4 码农来洞见 1 常量定义 程序存在大量的数据来...
  • 不允许任何魔法(即未经定义的常量)直接出现在代码中。 反例:String key = "Id#taobao_" + tradeId; cache.put(key, value); long 或者 Long 初始赋值时,使用大写的 L,不能是小写的 l,小写容易跟数字 1 混 淆...
  • Java定义常量字符串?

    千次阅读 2021-03-08 02:11:34
    在C语言,我可以在代码顶部定义以下字符串:#define WELCOME_MESSAGE"Hello, welcome to the server"#define WAIT_MESSAGE"Please wait 5 seconds"#define EXIT_MESSAGE"Bye!"我想知道用Java做这种事情的标准方法...
  • 通过指针,可以轻松修改常量,如下代码 #include int main(){  const int i=100; int *p=&i; *p=200; printf("%d",i); } 这样 常量i的就已经改变了 volatile 从内存读取数据 如果是c++...
  • 这个问题的前提不明 ...符号常量是一个常量,是不变量,所以,编译的时候,就把符号常量出现的地方,替换为符号常量对应的常量。符号常量一般用户定义一个全局使用的数据,而且要改变该数据的时候...
  • 一直想String类的实体是一个常量,为什么却可以对它进行修改呢 例如代码: public class Test { public static void main(String[] args) { String str="aaa"; str+="bbb"; System.out.println(str); }...
  • 如何修改一个字符串常量

    千次阅读 2018-11-25 02:50:31
    关于程序内存布局的问题面试经常会...首先我尝试了使用VirtualProtect更改Windows下的字符串常量值的读写权限,很成功的更改了其值,但是对Linux进行处理时则不然,使用先是mprotect失败,原因为EINVAL,查...
  • c++报错:表达式必须含有常量值

    千次阅读 2021-11-03 01:12:02
    很早之前的问题了,今天记录一下。 错误代码: char a[s.length()];...因此将代码修改为: //char a[s.length()]; char* a = new char[s.length()]; 并使用完毕后释放内存: delete[]a; a = NULL; .
  • 一、分析常量的声明是每一个项目不可或缺的,Java1.5之前,我们只有两种方式的声明:类常量和接口常量。不过,1.5版之后有了改进,即新增了一种常量声明方式,枚举常量代码如下:enum Season{Spring,Summer,...
  • 最近一个Java项目需要修改一个静态常量,本地修改编译以后调试正常,然后把对应的entity类的class文件上传到服务器对应的目录以后系统依旧我行我素,各种清除缓存,各种重启,最后查询了相关资料,使用GUI反...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 352,238
精华内容 140,895
热门标签
关键字:

常量的值可以在代码中被修改