java中指针怎么理解?

 我来答
匿名用户
推荐于2017-11-29
展开全部
实际上,java力图使程序员忘记指针,这包括2个方面:
第一,java限制指针,去除了指针运算。
第二,java从语法上努力隐藏指针,让指向某对象的指针看起来更像那个对象本身!

是的,所有的java书籍都让人忘记了指针这回事,我们仿佛只跟对象打交道。偶尔,会被迫分清引用和
对象的关系。这就是目前的情形。多么好的想法!对象可比那些个不知所以的指针亲和多了!这是一种伟大的抽象!

这里,我们也更愿意把引用和对象混淆。是的,为什么不呢?那样,整个世界都是对象,太好理解了!

可事实上,为了节省内存,java不能把引用(指针)完全废除。要知道,复制一个引用(指针)要比
复制整个对象有效得多!所以我们不得不面对引用和对象共存的事实。

下面我就好好分析分析:

指针已经被抽象成了引用,现在指针不能够随心所欲的运算,并且看起来就像个对象,完全没有了指针
的模样。但它毕竟和对象还是不同的,还要经过一层“转换”(从指向的那个对象里取数据)。如果我们
在引用满天飞的时候总想着这样一层转换,真的是很不舒服。比如:
String key="name";
String value="hyq";
HashMap map=new HashMap();
map.put(key,value);

你得想着:key只是个引用,value也是个引用,map还是个引用,我们刚刚做的是把key和value
这2个引用放进了map(也是个HashMap对象的引用)中,到时候我就可以通过map这个引用取得
里面的对应于key引用的value引用!

你不晕我就服了。
一旦你这样想,你每时每刻都要面对这样的绕口令。因为我们对对象的操作全部要通过引用!java没有提供语法让你直接得到对象!(指的是直接寻址)这一点通过比较原始类型很好理解,int i=8,那么
i就是8,不是什么指针,要先找到放着8那块内存的地址再把8拿出来。这样多直接,多方便啊!

所以,我们对引用最好也这么来理解,就轻松多了。
还是上面的例子,key就是个String,value也是个String,map是个HashMap,我们把key和value
放进map里,将来可以按key取出value。——多简单!

其实,这样的理解是很符合人的思维习惯的,我相信大多数人刚学java时都会自然而然的这么理解,
但是我们一定要注意在什么时候不能这么理解。只要记住什么时候不能这么理解,我们就不会因为
这种“近似”的理解方式而犯错,而同时从这种理解方式里得到了方便和好处。

把引用直接当作对象本身的好处是简单直接,容易理解,而“误差”的地方就在于,假设只有这个引用
可以修改此对象。换句话说,当别的引用修改了对象的时候,我们毫不知情并很感费解。比如:

String name=null;
HashMap map=new HashMap();
map.put("name",name);

//do a lot of things
name="hyq";

当我们再从map里取出name的时候,发现它已经被赋值为hyq了!放进去的时候明明是啥都没有啊!
咋就变了讷?
引用到name那个对象的不只你map一个阿!

在同一个函数里出现这种情况还不是很常见,我们一般也不必这么写,更多的是出现在函数调用、传参的时候,这样更加隐蔽,不易发现,也让代码可读性下降。比如:
String name=null;
HashMap map=new HashMap();
map.put("name",name);

alterName(name);

在alterName函数里我们修改了name对象,这会直接影响到函数外的map。

所以,当我们把引用和对象故意混淆时,一定要记住什么时候应该分清楚。

对象的使用不外乎以下几种情况:

1
String name=new String("hyq");
然后使用name,引用生命周期一结束,对象失效(无法被取用)了事。这里只有name一个引用指向此对象,随便怎么弄都不会出事。

2
String name=new String("hyq");
String anotherName=name;

这里假设只有name会修改对象,并且在anotherName引用此对象前做完所有修改,anotherName只是取用这个对象调用方法。在这种情况下,也不会出事。这也是我们经常遇到的情况,并且一般都是在函数调用传参时出现。注意传参实际上就是String anotherName=name;
这里尤其要注意的是2个引用的生命周期:name修改对象的时候另一个引用还没出世,而等它出世后
发现它又不会修改对象,怎一个爽字了得!

3
String name=new String("hyq");
String anotherName=name;
代码和上面一样,但是这里要么2个引用都会修改对象,要么只有一个修改但会影响到另一个。这个时候无论如何你不能再把引用当对象了,你必须分清楚它们。你必须小心仔细,不能有丝毫疏忽。

当然,这种写法和风格无论如何是不值得提倡的,若非必要(没办法)请勿模仿!因为必然有一个引用
在不知情的情况下被人修改了对象,等它用的时候会大吃一惊,而这个对象是在什么时候被什么人修改的,极难排查。
(上面例子举得不好,String类是不变类,汗!)
StringBuffer name=new StringBuffer("hyq");
StringBuffer anotherName=name;
//do a lot of things
anotherName.append("is my gf");

你可能写得爽,一时痛快就这么写了,你也知道是什么人在什么时候修改了对象,但是别人呢?
要知道,这里可能不是相隔几行代码这么简单,可能是嵌套了好几层函数调用!你把那个anotherName传到第5层函数里面,然后丧心病狂的修改了那个对象,除了天知地知你知,鬼
都看不出来!
Saingel
2021-05-31
知道答主
回答量:19
采纳率:100%
帮助的人:2422
展开全部
以cpp标准来看,java里只有指针而没有引用,
cpp里引用是指变量的别名,
swap(int& a, int&b)交换会改变a和b的值,
声明既绑定,中间途不可更换引用对象,
引用本身不会产生额外内存占用,
==是变量值本身比较(不同对象只要符合相等条件就成立),而不是地址比较(即判断是否是同一个对象),
而java里的引用更倾向于cpp里的指针用法,
按值传递,初始可以空指向,中途可以随便更换对象,占用栈内存
最后的java空引用异常官方抛出的错误是nopointerexception,翻译过来就是 空指针异常
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-11
展开全部
Java里没指针!只又传引用和传地址两个!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-11
展开全部
JAVA没有指针。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1mych
2018-05-23
知道答主
回答量:14
采纳率:0%
帮助的人:3.2万
引用jbpad6a24ca1c的回答:
实际上,java力图使程序员忘记指针,这包括2个方面:
第一,java限制指针,去除了指针运算。
第二,java从语法上努力隐藏指针,让指向某对象的指针看起来更像那个对象本身!

是的,所有的java书籍都让人忘记了指针这回事,我们仿佛只跟对象打交道。偶尔,会被迫分清引用和
对象的关系。这就是目前的情形。多么好的想法!对象可比那些个不知所以的指针亲和多了!这是一种伟大的抽象!

这里,我们也更愿意把引用和对象混淆。是的,为什么不呢?那样,整个世界都是对象,太好理解了!

可事实上,为了节省内存,java不能把引用(指针)完全废除。要知道,复制一个引用(指针)要比
复制整个对象有效得多!所以我们不得不面对引用和对象共存的事实。

下面我就好好分析分析:

指针已经被抽象成了引用,现在指针不能够随心所欲的运算,并且看起来就像个对象,完全没有了指针
的模样。但它毕竟和对象还是不同的,还要经过一层“转换”(从指向的那个对象里取数据)。如果我们
在引用满天飞的时候总想着这样一层转换,真的是很不舒服。比如:
String key="name";
String value="hyq";
HashMap map=new HashMap();
map.put(key,value);

你得想着:key只是个引用,value也是个引用,map还是个引用,我们刚刚做的是把key和value
这2个引用放进了map(也是个HashMap对象的引用)中,到时候我就可以通过map这个引用取得
里面的对应于key引用的value引用!

你不晕我就服了。
一旦你这样想,你每时每刻都要面对这样的绕口令。因为我们对对象的操作全部要通过引用!java没有提供语法让你直接得到对象!(指的是直接寻址)这一点通过比较原始类型很好理解,int i=8,那么
i就是8,不是什么指针,要先找到放着8那块内存的地址再把8拿出来。这样多直接,多方便啊!

所以,我们对引用最好也这么来理解,就轻松多了。
还是上面的例子,key就是个String,value也是个String,map是个HashMap,我们把key和value
放进map里,将来可以按key取出value。——多简单!

其实,这样的理解是很符合人的思维习惯的,我相信大多数人刚学java时都会自然而然的这么理解,
但是我们一定要注意在什么时候不能这么理解。只要记住什么时候不能这么理解,我们就不会因为
这种“近似”的理解方式而犯错,而同时从这种理解方式里得到了方便和好处。

把引用直接当作对象本身的好处是简单直接,容易理解,而“误差”的地方就在于,假设只有这个引用
可以修改此对象。换句话说,当别的引用修改了对象的时候,我们毫不知情并很感费解。比如:

String name=null;
HashMap map=new HashMap();
map.put("name",name);

//do a lot of things
name="hyq";

当我们再从map里取出name的时候,发现它已经被赋值为hyq了!放进去的时候明明是啥都没有啊!
咋就变了讷?
引用到name那个对象的不只你map一个阿!

在同一个函数里出现这种情况还不是很常见,我们一般也不必这么写,更多的是出现在函数调用、传参的时候,这样更加隐蔽,不易发现,也让代码可读性下降。比如:
String name=null;
HashMap map=new HashMap();
map.put("name",name);

alterName(name);

在alterName函数里我们修改了name对象,这会直接影响到函数外的map。

所以,当我们把引用和对象故意混淆时,一定要记住什么时候应该分清楚。

对象的使用不外乎以下几种情况:

1
String name=new String("hyq");
然后使用name,引用生命周期一结束,对象失效(无法被取用)了事。这里只有name一个引用指向此对象,随便怎么弄都不会出事。

2
String name=new String("hyq");
String anotherName=name;

这里假设只有name会修改对象,并且在anotherName引用此对象前做完所有修改,anotherName只是取用这个对象调用方法。在这种情况下,也不会出事。这也是我们经常遇到的情况,并且一般都是在函数调用传参时出现。注意传参实际上就是String anotherName=name;
这里尤其要注意的是2个引用的生命周期:name修改对象的时候另一个引用还没出世,而等它出世后
发现它又不会修改对象,怎一个爽字了得!

3
String name=new String("hyq");
String anotherName=name;
代码和上面一样,但是这里要么2个引用都会修改对象,要么只有一个修改但会影响到另一个。这个时候无论如何你不能再把引用当对象了,你必须分清楚它们。你必须小心仔细,不能有丝毫疏忽。

当然,这种写法和风格无论如何是不值得提倡的,若非必要(没办法)请勿模仿!因为必然有一个引用
在不知情的情况下被人修改了对象,等它用的时候会大吃一惊,而这个对象是在什么时候被什么人修改的,极难排查。
(上面例子举得不好,String类是不变类,汗!)
StringBuffer name=new StringBuffer("hyq");
StringBuffer anotherName=name;
//do a lot of things
anotherName.append("is my gf");

你可能写得爽,一时痛快就这么写了,你也知道是什么人在什么时候修改了对象,但是别人呢?
要知道,这里可能不是相隔几行代码这么简单,可能是嵌套了好几层函数调用!你把那个anotherName传到第5层函数里面,然后丧心病狂的修改了那个对象,除了天知地知你知,鬼
都看不出来!
展开全部
内容有误,那个再map存储后,再改变存入前的对象的值是不会改变,map对象中存储的对象的值的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式