java-final变量和普通变量的区别

问题描述

final变量和普通变量的区别
        String str1 = "hello2";
        final String a = "hello";
        String b = "hello";
        String c = a + "2";
        String d = b + "2";
        System.out.println(str1 == c);
        System.out.println(str1 == d);

结果:
true
false
为什么第二个结果为false?这是什么原理呢?

解决方案

final string 在编译的时候,值已经确定,a可替换成"hello",所以就是 "hello"+"2",这个形式的初始化会被编译器优化成"hello2"存在字符串常量区,由于str已经被初始化为"hello2",这个字符串已经存在于常量区,所以直接返回其引用,str==a.
b的值在编译时不确定,不能编译优化,所以d=b+"2",jvm会在堆中生成一个值为"hello2"的对象,返回引用给d。所以str不等于d

解决方案二:

普通变量,你执行拼接后赋予另一个变量,会在内存区域重新开辟一块儿进行存储。
对于final,则能够直接进行改变而不会进行重新开辟内存空间。
至于string型的比较,基本上是进行内容比较,会用equals进行比较的。
=进行比较,就设计到内容以及内存区域了比较了

解决方案三:

final变量在编译期间就已经确定了值,然后这个值是被存储到运行时数据区域中的常量池中的。
而你使用b+"2",是使用了引用变量b, JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即b+"2"无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给d。所以上面程序的结果也就为false。
如果改成String d = "hello" + "2";那么str1==d就是true了,因为d本质上也是常量了。

解决方案四:

java中比较字符串,要用equals,不要用等号

解决方案五:

xxx.equals("xxx")

解决方案六:

输出false能理解吧。String d = b + "2";这句话生成了两个对象,等同于String d = new String("hello")+"2";所以第二个会输出false;
final 修饰String 之后,引用a也变成不可变量, String c = a + "2";这句话的效果就等于String c = "hello"+"2";,自然是true;

解决方案七:

a字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。
SString b = "hello";这种情况是引用数据类型,引用数据类型肯定存放在堆中 栈中放置的是参数变量而不能放对象 对象只能放在堆中,
可能是因为是对象,所以才不等吧

解决方案八:

static变量与普通变量的区别
static变量与普通变量的区别
C# 静态变量与普通变量的区别

时间: 2024-12-31 05:12:31

java-final变量和普通变量的区别的相关文章

java当中的接口的变量都是final修饰的常量,那么方法的方法是final修饰的吗

问题描述 java当中的接口的变量都是final修饰的常量,那么方法的方法是final修饰的吗 java当中的接口的变量都是final修饰的常量,那么方法的方法是final修饰的吗 final能不能修饰类呢 解决方案 不知道你说的方法的方法是什么 final可以修饰类,但是含义不同,final类表示无法派生. 解决方案二: final可以修饰类,方法,和域, 如果修饰方法, 参考这个博客吧http://blog.csdn.net/zrf1335348191/article/details/501

变量 属性-JAVA初始块中的变量与类中的成员变量区别

问题描述 JAVA初始块中的变量与类中的成员变量区别 class Demo{ { a = 4; } int a = 6; public static void main(String[] args){ System.out.println(new Demo().a); } } 两个a是同一个变量吗? 解决方案 是同一个变量. 初始化块中指定的变量a的初始值每次都会被定义时指定的变量a的值所覆盖,因为定义变量时指定的初始值和初始化块中指定的初始值的执行顺序,跟它们在源程序中的排列顺序相同. 详细可

java中静态变量和实例变量的区别详细介绍_java

运行效果: 控制台效果: ================================================== 代码部分 ================================================== /hello_test/src/com/b510/test/StaticTest.java 复制代码 代码如下: /**  *   */ package com.b510.test;  /**  * 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实

[JAVA · 初级]:2.变量 & Integer和int的区别

变量 定义:它是计算机内存中一个存储单元,用来存储制定类型的数据: 性质:变量的值(存储的内容)会随程序的运行而产生变化. 三要素:            1) 名称: 注意: 变量名必须符合标识符的定义.            2) 类型: 例如: int 表示整型数据.            3) 作用域:指变量起作用的范围. 声明:            在java中,变量必须先声明,后使用.            格式1:  类型名 变量名 ;           格式2:  类型名 变

关于Java语言for循环内外变量定义的问题

问题描述 今天被TeamLeader批了一顿,本来想和他争论争论的,后来感觉自己也不清楚,遂只有来Iteye讨教讨教了.这是个关于在for循环内外变量定义的问题,先看代码:public class Test2 {public static void main(String[] args) {// 放入10000000的元素List<Object> list = new ArrayList<Object>(10000000);for(int i = 0; i < 1000000

final修饰的终态变量只能在声明变量时或构造函数里赋值嘛?

问题描述 final修饰的终态变量只能在声明变量时或构造函数里赋值嘛? class GongChengShi { final String name;//名字 final String dizhi;//地址 int age;//年龄 public GongChengShi(String name, int age) { this.name = name;//构造函数初始化时给名字和年龄赋值 this.age = age; } void setDizhi(String dizhi){//在子类中调

java-Java 中final修饰的成员变量在创建对象时候会不会被附初值?

问题描述 Java 中final修饰的成员变量在创建对象时候会不会被附初值? 如上所述 Java 中final修饰的成员变量在创建对象时候会不会被附初值? 我看周志明的jvm说在创建对象时候要给所有的内存空间都要初始化为零值(不包括对象头),我就想如果是final类型的会不会被初始化微零值再进行程序员自己编写的赋值语句呢?那样的话是不是就是两次对final变量赋值了? 解决方案 不会自动赋值.不赋值会报错.final修饰成员变量,会强制要求赋上值. 解决方案二: 会,比如int初值就是0 解决方

java final 和instanceof 关键字的区别_java

final 可以适用的范围:修饰类:使用这种修饰符的类无法被继承 修饰函数:被修饰的不能被重写 修饰属性:1.final修饰的成员变量是常量,值不能被修改      而java的命名规则:常量都要大写 当形参变量使用final修饰基本类型变量,在函数中该变量不能被修改   引用类型变量:不能改变地址 复制代码 代码如下: /* final class A{    public final void eat(){        System.out.println("测试");    }

PHP中魔术变量__METHOD__与__FUNCTION__的区别_php技巧

本文实例讲述了PHP中魔术变量__METHOD__与__FUNCTION__的区别,分享给大家供大家参考.具体分析如下: __METHOD__类的方法名(PHP 5.0.0 新加).返回该方法被定义时的名字(区分大小写). __FUNCTION__函数名称(PHP 4.3.0 新加).自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写).在 PHP 4 中该值总是小写字母的. 文档解释都是说返回函数(方法)的名字.区别在于: __FUNCTION__只是返回方法的名字: __METHO