精华内容
下载资源
问答
  • 详解:final修饰的变量 是引用变量能变 还是引用变量指向对象的内容能变
    千次阅读
    2019-03-20 10:48:42

    直接上代码:

    /**
     * 问: 使用final关键字 修饰一个变量时,是指引用变量不能变,还是指引用变量所指向的对象的内容不能变?
     * 
     * 答: 使用final关键字 修饰一个变量是,是指引用变量不能变,引用变量所指向的对象的内容是可以变的。
     * 
     * 验证思路:
     * 		在java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到对应的对象。
     * 		因此,根据哈希编码你就可以确定一个唯一的对象。
     * 		
     */
    public class HomeTest {
    	public static void main(String[] args) {
    		// StringBuilder 线程不安全 但速度快
    		final StringBuilder sb = new StringBuilder("验证");
    		System.out.println("sb=" + sb);
    		System.out.println("sb的哈希编码hashcode=" + sb.hashCode());
    		
    		// 为sb追加内容   验证变量所指向的对象的内容是否可变
    		sb.append("成功");
    		System.out.println("追加后的sb=" + sb);
    		System.out.println("追加后的sb的哈希编码hashcode=" + sb.hashCode());
    		
    		//为sb 指向一个新的对象  验证引用变量是否可变
    		//sb=new StringBuilder("nihao");该行会报错  所以引用变量不可变
    		
    		
    		/*
    		 * 经过验证  发现 sb的内容发生了改变,但是sb的哈希编码没有变化,说明是同一个对象。
    		 * 
    		 * 总结:使用final修饰的变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改。
    		 * 如果是引用类型的变量,则在对其初始化之后不能指向一个另一个对象。
    		 * 即 引用变量不可变,引用变量指向的对象的内容可变。
    		 */
    	}
    }
    

     

    更多相关内容
  • 使用final关键字修饰一个变量时,是指引用变量能变,引用变量所指向对象中的内容还是可以改变的。

    我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    下面让我们来看这段代码:

    /**
     * 验证final修饰的变量是引用不能变,还是引用的对象不能变
     * StringBuilder 线程不安全 但速度快
     * 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变
     * @author Tomato
     *
     */
    public class TestFinal {
    	public static void main(String[] args) {
    		final StringBuilder sb = new StringBuilder("haha");
    		//同一对象的hashCode值相同
    		System.out.println("sb中的内容是:"+sb);
    		System.out.println(sb+"的哈希编码是:"+sb.hashCode());
    		sb.append("我变了");
    		System.out.println("sb中的内容是:"+sb);
    		System.out.println(sb+"的哈希编码是:"+sb.hashCode());
    		
    
    		System.out.println("-----------------哈希值-------------------");
    		TestFinal test = new TestFinal();
    		System.out.println(test.hashCode());
    		System.out.println(Integer.toHexString(test.hashCode()));
    		System.out.println(test.getClass()+"@"+Integer.toHexString(test.hashCode()));
    		System.out.println(test.getClass().getName()+"@"+Integer.toHexString(test.hashCode()));
    		//在API中这么定义toString()等同于 getClass().getName() + '@' + Integer.toHexString(hashCode())
    		//返回值是 a string representation of the object.
    		System.out.println(test.toString());
    	}
    }
    
    代码结果是:

    sb中的内容是:haha
    haha的哈希编码是:1928052572
    sb中的内容是:haha我变了
    haha我变了的哈希编码是:1928052572
    -----------------哈希值-------------------
    1398828021
    53606bf5
    class TestFinal@53606bf5
    TestFinal@53606bf5
    TestFinal@53606bf5

    可以看出StringBuilder中的内容变了 而所指向的哈希编码却没发生变化,在Java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到相关的对象,也就是说,根据这个编码你可以独一无二地确定这个对象。
    因而使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。


    总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

    展开全文
  • java中final修饰的变量是引用不可变,还是对象不可变... 答案是引用不可变,引用的对象还是可以改变的。 在这里我要强调一下,不知道有没有小白和我一样,以为string之所以是一个不可变的字符串常量,是因为string是...

    如题,

    java中final修饰的变量,是引用不可变,还是对象不可变...

    这个其实是要分情况讨论的。


    总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;

    如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。


    在这里我要强调一下,不知道有没有小白和我一样,以为string之所以是一个不可变的字符串常量,是因为string是一个被final修饰的类,其实不然,如上所说,String修饰后只是引用不可变而已。至于为什么String是一个不可变的字符串常量,有兴趣的同学可以看一下源码,也可以看一下这里:https://www.zhihu.com/question/20618891.


    在这里,我只解释final修饰的引用类型的变量为什么只是引用不可变。

    final int[] value={1,2,3}
    int[] another={4,5,6};
    value=another;	  //编译器报错,final不可变

    在这里我们就能看出来,在最后一行,把another指向了value,而value是被final修饰的,所以这里编译器会报错;


    在看一串代码:


    1.  final StringBuilder sb = new StringBuilder("haha");  
    2.         //同一对象的hashCode值相同  
    3.         System.out.println("sb中的内容是:"+sb);  
    4.         System.out.println(sb+"的哈希编码是:"+sb.hashCode());  
    5.         sb.append("我变了");  
    6.         System.out.println("sb中的内容是:"+sb);  
    7.         System.out.println(sb+"的哈希编码是:"+sb.hashCode()); 
    在这里又一个final修饰sb,StringBuilder中的append方法可以改变引用的对象...输出结果为:


    代码结果是:

    sb中的内容是:haha
    haha的哈希编码是:1928052572
    sb中的内容是:haha我变了
    haha我变了的哈希编码是:1928052572


    由此可以看出hash编码没有变,但是内容改变了...



    展开全文
  • 引用,其实可以改变指向

    千次阅读 2015-04-02 15:07:54
    今天跟几位同学讨论了一点小问题,最后谈到指针和引用的区别……最后,谈到引用永远指向初始化它的对象。。。问题就从这里提出。按我的理解,引用是可以改变指向的(说明:这是错误的思维)。 #include using ...

    今天跟几位同学讨论了一点小问题,最后谈到指针和引用的区别……最后,谈到引用永远指向初始化它的对象。。。问题就从这里提出。按我的理解,引用是可以改变指向的(说明:这是错误的思维)。

    int main(int argc, char *argv[])    
    {    
    	int a = 10, b = 20;
    	int &p = a;
    	p = b;
    	printf("a = %d b = %d p = %d\n", a, b, p);
     
    	return 0;    
    }


    并不是说,p = b之后,p就指向了b,而是,将b的值赋给了a。我差一点就“成功”的愚弄了群里的同学。其实,p还是指向a的。事实就是这样。


    可以验证改变a和b的值之后p的改变,结果改变a,p值改变,但是改变b值,p值并不改变


    虽然引用不可以改变指向,但是可以改变初始化对象的内容。对引用的操作直接反应到所指向的对象

    展开全文
  • python中的可变对象不可对象

    千次阅读 2018-12-20 22:40:20
    python与C/C++一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象引用”这句话,其实这个特点类似于JAVA,所以在python里面大家也不用担心类似于C/C++中的指针的复杂...
  • Python可变对象不可对象

    千次阅读 2020-12-06 12:34:31
    其中,不可对象包括:数字,字符串,tuple可变对象包括:list,dict,setPython中的变量可以指向任意对象,可以将变量都看成是指针,保存了所指向对象的内存地址(对象的引用)。不可变对象对于不可变对象,如果要更新...
  •  此处说的“引用初始化以后不能被改变”不是指变量的值不可变,而是指向的变量地址不可变。这个得再去理解下引用的定义。   1.定义回顾  引用——引用就是某一变量(对象)的一个别名,对引用的操作与对变量...
  • JAVA - 可变对象不可对象

    千次阅读 2018-06-14 18:34:08
    基本概念 *不可对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,任何对它的改变都应该产生一个新的对象。* 可变对象(Mutable Objects):相对于不可变类,可变类创建...
  • Python中的可变对象不可对象

    千次阅读 2020-12-14 09:39:17
    一、python中的变量与对象首先在理解python的可变对象不可对象时,要理解python的赋值操作。在python中,一切事物皆是对象,变量是对象在内存中的存储和地址的抽象对变量的理解在Python中,类型是属于对象的,而...
  • 在Python中,如果将数字、字符串等传入到函数中,再改变其值,我们会发现:当函数结束时,该变量不会发生改变。 In [20]: def q(x): ...: x = 2 ...: In [21]: a = 1 In [22]: q(a) In [23]: a Out[23]: 1 ...
  • python中对象的可变与不可

    千次阅读 2020-12-09 05:34:02
    在python中一切皆对象对象是对数据的抽象。所有对象有三个要素:类型、...对象一旦被创建,它的类型和标识是不变的,根据值的绑定关系是否可变分为可变对象不可对象。如果“值”理解为对象的内容容易产生疑...
  • Java并发编程(六)不可改变对象

    千次阅读 2016-08-16 10:06:02
    6. 不可改变对象如果一个对象在创建后不可改变,那么就称之为不可改变对象。基于不可变对象被广泛接受为创建简单、可靠代码的有效策略。不可变对象在并发程序中显得尤为重要。由于它们不能改变,所以他们不会在线程...
  • 基类指针和引用可以指向派生类对象,但是无法使用存在于基类只存在于派生类的元素。(所以我们需要虚函数和纯虚函数)原因是这样的:在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间。 当其指向派生类...
  • 对于刚接触不久面向对象的真小白童鞋来说,类的对象对象的实例,对象引用引用变量的问题以及莫过于没得对象虽然博主也没得对象,本文将逐个逐个讲解! 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆...
  • 在逛博客,温习指针与引用的区别时,一直对”引用被初始化后,能再指向其他对象“这句话有所不解,今天测试个小例子,算是比较清晰透彻领悟,与大家交流学习一下。
  • 文章目录四个线程安全策略不可对象定义不可对象需要满足的条件如何创建不可对象使用final关键字定义不可对象修饰变量示例final 修饰基本数据类型及String: 初始化之后不能修改 (线程安全)final修饰引用...
  • 问题原因: 原始值和引用值 ...引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。 官方文档:http://www.w3school.com.cn/js/pro...
  • 指向一个对象,而这个对象e被WeakReference实例持有引用,则由于对象引用被变量e持有,对象符合上述回收规则,因此对象至少在变量e的作用域范围内都不会被回收。 例如: class Apple{ String color; void ...
  • 吃人的那些 Java 名词:对象引用、堆、栈

    万次阅读 多人点赞 2019-09-05 15:57:09
    作为一个有着 8 年 Java 编程经验的 IT 老兵,说起来很惭愧,我被 Java 当中的四五个名词一直困扰着:**对象引用、堆、栈、堆栈**(栈可同堆栈,因此是四个名词,也是五个名词)。每次我看到这几个名词,都隐隐...
  • 在定义对象时加关键字const,指定对象为常对象,常对象必须要有初值,定义后就不可修改。Time const t1(10, 20, 30);//定义t1是常对象 const Time t1(10, 20, 30);//等价说明:(1)如果一个对象被声明为常对象,则...
  • python中有可变对象不可对象,可变对象:list,dict.不可对象有:int,string,float,tuple.最近看到这些知识下面来整理一下... python不可对象int,string,float,tuple先来看一个例子 def int_test(): i = 77...
  • 从简,不说废话: # 数字、字符串、tuple都是不可变对象 # list、dict是可变对象 #Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;...不可变对象,改变的是函数内变量的指向对象
  • 对Java String不可变的理解

    千次阅读 2019-01-08 13:27:41
    在实际Java编程中经常有这样的疑惑: java的String类为什么要设置成不可变类型?...注意,是对象不可变,并非引用不可变。 例如:定义并初始化一个String变量s ,s是引用类型变量,“hello”是String对象;  Str...
  • 学习Python首先我们要知道Python变量保存的是值引用 也可以说:变量是对内存及其地址的抽象 Python:一切变量都是对象 变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量...
  • 可变数据类型与不可变数据类型 引用传递与值传递 深拷贝与浅拷贝 (id函数:你可以通过python的内置函数 id() 来查看对象的身份(identity),这个所谓的身份其实就是 对象 的内存地址) 一、引
  • python的可变与不可变数据类型

    千次阅读 2020-12-08 20:22:47
    用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来...
  • 使用JS有一个很恼人的问题,当我把对象赋值给新的对象后,新的对象改变了,旧的对象也会跟着改变,如以下例子: // 被引用对象 var oldModel = { name: "oldModel", value: 123 } // 新的对象从...
  • Java不可对象

    千次阅读 2017-01-12 13:45:46
    不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,...
  • 刚刚接触Java时应该听说过一...对于对象引用,心里大概知道,却不知怎么表达。还有一个问题就是Java是值传递还是引用传递,在C语言中这个问题看到的比较多,在Java中似乎没怎么探讨过。下面围绕上面两个问题来分析!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 270,104
精华内容 108,041
关键字:

引用指向的对象不可改变