转、java指针,LC21题

JAVA里面的“指针”

最终版权:JDram314 如转载请贴出出处!

  众所周知,在java里面是没有指针的。那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址,该地址就是存储变量的值。该地址所存储的变量值是“公有”的,此处的“公有”是对于拥有该地址的变量而言。它们都可以访问该地址的内容,并且可对其就行修改,一经修改则所有指向该地址的变量值也将改变。那么在Java里面何来的指针?在java里面没有指针的定义。但是java里面的“指针”无处不在。下面将进行介绍。我们知道JAVA里面用的最多的就是对象,我们经常将一个对象传递给不同的变量,例如:

[java] view plaincopy

<embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

<embed id="ZeroClipboardMovie_7" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

  1. Student s1 = new Student();

  2. Student s2 = s1;、

    此时s1和s2是指向同一个对象的,也就是s1和s2引用同一个对象,我们知道java里面创建一个对象是存放在堆的,当我们new一个对象的时候其实是在堆中开辟了一个存储该对象的空间,返回是的存储该对象在堆中的地址,所以在java中我们所谓的对象引用就是指针,只是没有像C/C++中给出了一个明确的定义。java是为了避免指针带来的使用上的麻烦,所以就使用对象的引用来代替了指针。上面的例子中,当我们在s1中进行修改Student中的属性的时候,那么当s2取Student中属性的值的时候便是取得了s1修改后的值,这是因为s1和s2是指向堆中的同一块内容,所以只要其中一个变量修改了堆中的值,则其他的变量将取得堆中最后更新的值。所以我们可以知道,s2=s1并不是又在堆中创建了一块内存,而只是把一个对象的地址赋给了s2,此时还是只是创建了一个对像,而不是两个。在实际开发中会经常碰到这些,假设创建一个Map<String,Object>类型的对象,它的value是一个对象,而key是一个字符串,定义如下:
    

[java] view plaincopy

<embed id="ZeroClipboardMovie_3" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

<embed id="ZeroClipboardMovie_8" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

  1. class Student{

  2. private String name;

  3. private int age;

  4. public void setAge(int age)

  5. {

  6. this.age = age;

  7. }

  8. public Student(String name)

  9. {

  10. this.name = name;

  11. }

  12. }

  13. Map<String,Student> studentMap = new HashMap<String,Student>();

  14. Student s1 = new Student("张三");

  15. Student s2 = new Student("李四");

  16. studentMap.put(s1.name,s1);

  17. studentMap.put(s2.name,s2);

此处是一个学生姓名对应了一个学生,所以此处的Map的key是学生姓名,value是一个学生对象。那么就是将一个Student对象的引用赋给了Map中key所对应的value,所以当程序在别处改变了s1/s2的值后,不必将s1和s2的信息更新到studentMap中,studentMap就会获得key所对应的value最新的值,例如:在程序的某处我们将s1的age修改成了“23”,我们不必将s1的最新信息更新到studentMap中,studentMap就会获得s1的最新值。这是因为已经将s1对象的引用赋给了studentMap中张三所对应的value,也就是将对象在堆中的地址赋给了value。所以只要s1一更新,studentMap就可以获得最新的值。
有时候这种情况会影响我们程序的执行和我们想想的会有偏差,当我们需要保存一个对象在某时刻的状态时,按照一般的理解是将此时的对象赋给一个变量来进行存储,但是在java里面这样是行不通的!因为这样直接将该对象赋给另一个变量只是将该对象的引用赋给了此变量,该变量的值并不能保持在此刻该对象的值,会随着程序的执行,该对象的改变而变化。所以达不到我们的目的。下面就举个例子来说明解决该现象:

[java] view plaincopy

<embed id="ZeroClipboardMovie_4" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

<embed id="ZeroClipboardMovie_9" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

  1. class Student{
  2. private String name;
  3. private int age;
  4. public void setAge(int age)
  5. {
  6. this.age = age;
  7. }
  8. public Student(String name)
  9. {
  10. this.name = name;
  11. }
  12. public Student(Student student)
  13. {
  14. this.name = student.name;
  15. this.age = student.age;
  16. }
  17. }

上面还是student类,基本和上面一样,只是多添加了一个构造函数——Student(Student student),为什么要多加这样一个函数呢?这就是为了满足我们上面的需求(保存对象某个时刻下的状态),我们知道直接将一个对象赋给一个变量会存在对象的引用,不能保存对象某时刻的状态。同时也知道要想保存一个对象就要在堆中开辟一个空间,用于存放我们的对象。其实上面的需求可以看做当我们要保存某时刻下对象的状态,其实就是该对象的状态不会随以后对象的变化而变化,所以何不将当前某时刻下对象的状态属性全部都复制到一个新的对象中去!这样保存下来的属性就不会受以后对象的变化而变化了。就上面的例子,举例说明:

[java] view plaincopy

<embed id="ZeroClipboardMovie_5" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

<embed id="ZeroClipboardMovie_10" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; word-break: keep-all;">

  1. Student s1 = new Student("王麻子");
  2. s1.age=23;
  3. ........
  4. //此时要保存s1此刻的状态
  5. Student s2 = new Student(s1);

此时s1和s2就不是指向堆中的一个地址了,因为s2不是直接将s1赋给它的,而是通过new出来的!上面说了new可以在堆中开辟一个存储当前new的对象的空间。这种操作可以实现将s1中的状态全都转移到s2中,所以在值的方面看s2和s1此时是一样的,但是在堆中确实不一样的,s1!=s2,因为s1和s2的hashcode不一样!但是s1.name.equal(s2.name)==ture,s1.age=s2.age。这不就实现了保存某个对象某个时刻下的状态了吗?而切不会在受程序执行的影响!

  到此已全部介绍完有关java“指针”,其实java“指针”就是对象的引用,而对象就是存放在堆中的。我们知道java中的内存分为堆内存(heap)和栈内存(stack)。堆就是用来存放对象的,而栈则是存放一些数据基本类型的值,如int,float,double,char.......。

https://blog.csdn.net/github_39587265/article/details/79111408

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 《一起同过窗2》 《一起同过窗》第二季上线仅一天,豆瓣开分8.9,成为目前为止年度评分最高的青春剧,没有之一! 该...
    老三荐剧阅读 1,255评论 2 12
  • 1、学习型组织 人们为了创造自己真心渴望的成绩而持续拓展自身能力,开阔的新思想培育,在集体中产生共同愿景,不断的去...
    陈小叙阅读 490评论 0 2
  • 正月十五,外面烟花满天,暖爸特意也买了几个大个烟花说是要放给暖暖看,暖奶抱着裹着小被子的她在门前一直看一直看,那双...
    暖暖的日子阅读 238评论 2 2