您的位置:首页 > 编程语言 > C语言/C++

读thinking in java的收获(一)——java中的引用,c++引用与c指针的区别与联系以及java的数据类型

2015-01-29 16:45 549 查看
学了一年的java了,磕磕碰碰的成长,今天买了一本thinking in java,刚读前两章就发现有很多知识上的遗漏点,现总结如下。
读到第二章的第一节"用引用操纵对象"突然就懵了,结合查阅的一些资料谈谈目前情况下对java的引用和c++的引用,以及和c的指针的区别:
先说c指针:
   c指针有两个作用:1.在函数调用时可以只传递一个指针而不是整份数据。2.让两段代码处理同一条数据,而不是处理两份独立的副本可以避免副本和共享数据。
  (之前阅读first head c中的解释)指针就是内存的编号,可以加减,指哪打哪。
   引用:引用也是内存编号,但是不能改。但c++和java中的引用又有些区别:   在J***A中:
     1.非基本类型都是通过引用传递参数的。(下面会重点介绍java的基本数据类型和引用数据类型,至今才有这个意识)
     2.引用是非显式定义的,不像c++中int& ra = a;
     3.引用相当于原变量的别名,对它操作相当于对原变量操作
在c++中:
1.引用机制为运算符重载提供了大幅度的支持。C++ 的引用是用类“模拟”基本对象的根本要求。
2.他是显示定义的

重要区别:c++中一个引用指向的地址不会改变,改变的是指向地址的内容,然而java中引用指向的地址在变,Java中的“引用”倒是和C/C++的指针更像一些,
不过为了安全java去除指针概念,就用引用来操纵对象。
在java中:
A a = new A(1);
A b = new A(2);
a = b;
a和b引用同一个对象A(2),原来的A(1)成为没有被引用的对象。 垃圾回收机制会在之后的某个时刻把A(1)干掉。
java的引用机制是一个很复杂的机制。他必须区分“基本对象”和“复合对象”,你可以想象一下,如果其中没有基本对象,那么我们如何完成对象的复制?
唯一的解决方案是提供两个等于号,或者一律用构造函数.... 但是综合来看,他和垃圾回收形成了相当完美的组合方案。

而C++则不然。C++的引用就语义上说是“别名”,而并不是指针的另一种用法:
A a = A(1);
A b = A(2);
A& c = b; //c是b的别名
c = a; //并不是c引用a,而是拷贝操作c.operator=(a)

就语言机制来说,java的引用是用来管理和命名对象;而C++的引用机制是很纯粹的,就是别名而已。
在java中,引用相当与指针,它与c中的指针主要有两个区别:一是引用不能进行地址操作,如数组的加1操作,引用只是指向数据的一个副本,而不是数据本身,这样
就避免了由于对于地址的误操作而改变其他变量的值,甚至危害到系统的安全。二是 java中的引用只能指向对象,他的引用是在实例化对象时系统直接生成的,因此对于
普通数据类型是不能进行引用定义的,如果要对普通数据类型进行函数调用 时的地址传递(即java中的引用传递),必须把数据封装到类中。 java的这种特性使得在java
的函数或类的参数传递时可以实现与c中指针相同的功能。
java数据类型图:

┏数值型━┳━整数型:byte short int long
┏基本数据类型━━┫        ┗━浮点型:float double
┃ ┣字符型:char
数据类型╋                ┗布尔型:boolean
┃
          ┃                ┏类(class)ps:包括基本数据类型对应的包装类Byte,Integer,Short,Long,Boolean,Character,Float,Double
          ┗引用数据类型━━╋接口(interface)    
                            ┗数组(array)
特别说明:java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。可以看出他是一个类不是基本
数据类型。

java的数据类型分基本数据类型(原始数据类型)和引用数据类型;
1.基本八大类,图中可以很清楚的看到;这种类型的数据变量在声明之后java就会立刻分配给他内存空间。如:short a;  java会在可使用的内存空间寻找一个占两个字节的块给a变量;
2.引用数据类型就那三种,类似C/C++的指针,它以特殊的方式指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址,想具体知道看看数据结构就好了。

通俗讲,一.说内存、谈地址基本都是说引用而非基本;二.内存地址可以理解为学号,而对象实体就是学生,每次学生通过学号找,这就是引用;

这个知识点的应用:
1.“==”作用在引用数据类型间,判断内存地址是否相等,想判断内容实体用equals;
2、基本传值传参传的是副本,修改后原值不变;引用传值传参穿的是地址,修改后原值改变。
知道网友还有这样的解释:在栈中可以直接分配内存的数据是基本数据类型。引用数据类型:是数据的引用在栈中,但是他的对象在堆中。要想学好Java必须知道各种数据的在
内存中存储位置。因此特地搜了一篇关于java中的各种数据类型在内存中存储方式的文章,感觉也不错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: