A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 行如止水 中级黑马   /  2013-8-21 18:02  /  1324 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

开始在C++里定义变量的时候,直接用 类名 对象名就可以定义一个变量了。比如说:
Person thisman;   //然后就可以用thisman调用各种方法了;
而在JAVA中,则需要用     Person thisman = new Person();  
我感觉这个和C++中的指针的指针定义的很像,而且在JAVA中,类中还可以包含自己类的对象,这在C++中是不可能的。
我想问的是在JAVA中是不是用类名定义出来的对象都是指针,而定义的基本数据类型则不是指针?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

7 个回复

正序浏览
java对象中,除了基本类型,其他对象传递都是地址传递,虽然java取消了指针的设定,但是其内部还是使用指针操作的,定义一个对象就相当于定义了一个对象类型的指针,这个指针的值为null,如果不进行初始化的话自然会报空指针异常,也就是NullPointerException。即使是基本类型,如果不初始化直接调用的话一样会报异常的。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 javamov 于 2013-8-22 17:30 编辑

  
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间

问题: Person thisman = new Person();   我感觉这个和C++中的指针的指针定义的很像

解答:===引用对象操作一块内存地址,其实和指针一样的。
          java中jvm管理着内存对象,C/C++可以更灵活的使用指针,也可以直接使用电脑的全部内存,但具有危险性,
java不会使服务器因内存溢出而崩溃,但C/C++是可以由于某个语句的问题就可以使你的电脑崩溃,java只会是jvm崩溃,
其实java中有内存管理机制,很久没使用的对象java会帮助我们释放,不需要我们像C/C++一样手动释放,许多C/C++经常
会碰到内存溢出的情况,但java很少。(我想起以前老师给我们的一句话:C/C++中的指针就像枪一样,枪是很危险的但也是
作用很大的。看你如何去掌握了。)


问题:而且在JAVA中,类中还可以包含自己类的对象,这在C++中是不可能的
解答:这正是java的优势OOP

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。
看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的GOTO语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用,只不过在大多时候Java中不用关心如何操作这个指针,更不用象在操作C++的指针那样胆战心惊。唯一要多多关心的是在给函数传递对象的时候。如下例程:

package reference;
c2.strBuff.append( change strBuff clone);

改成下面这样:

c2.str.substring(0,5);
c2.strBuff.append( change strBuff clone);

去掉了重新赋值的过程,c2.str也就不能有变化了,我们的把戏也就露馅了。但在编程过程中只调用

c2.str.substring(0,5);

语句是没有任何意义的。

应该知道的是在Java中所有的基本数据类型都有一个相对应的类,象Integer类对应int类型,Double类对应double类型等等,这些类也与String类相同,都是不可以改变的类。也就是说,这些的类中的所有方法都是不能改变其自身的值的。这也让我们在编clone类的时候有了一个更多的选择。同时我们也可以把自己的类编成不可更改的类。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
这样的话,那就是我之前的认为是对的了。
回复 使用道具 举报
看楼主的名字就知道楼主相当厉害嘛
回复 使用道具 举报
基本数据类型定义的只是存储在栈内存中的临时变量
回复 使用道具 举报
java中叫对象的引用,他是指向对象实例(也就是new的部分)地址

Person thisman = new Person();  

thisman,对象引用,放在栈内存中
new Person(),对象实例,放在堆内存中

thisman中存放的是new Person()的地址,你也可以把他理解为指针,但在java中他叫对象的引用

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马