本文目录一览:
java引用与C语言指针的区别是什么?
java引用与C语言指针的区别有以下几方面:
1、现象
指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变,总是指向最初的对象。
2、编译
程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。
3、类型
引用其值为地址的数据元素,Java封装了的地址,可以转成字符串查看,长度可以不必关心;C指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。
4、内存占用
所占内存:引用声明时没有实体,不占空间。C指针如果声明后会用到才会赋值,如果用不到不会分配内存。
5、内存溢出
Java引用的使用权限比较小,不会产生内存溢出。C指针是容易产生内存溢出的,所以程序员要小心使用,及时回收。
6、本质
Java中的引用和C中的指针本质上都是想通过一个别名,找到要操作的目标(变量对象等),方便在程序里操作。所不同的是Java的办法更安全,使用更加方便些,但没有了C的灵活,高效。
java 中的引用是什么意思?
- 首先,你要明白什么是变量。变量的实质是一小块内存单元。这一小块内存里存储着变量的值 例如:
int a = 1;
a
就是变量的名称,1
就是变量的值。
而当变量指向一个对象时,这个变量就被称为引用变量
例如:
A a = new A();
a
就是引用变量,它指向了一个A
对象,也可以说它引用了一个A
对象。我们通过操纵这个a
来操作A
对象。此时,变量a
的值为它所引用对象的地址。
java里的引用是啥意思?
说白了就是内存地址。 在Java中的引用类型,是指除了基本的变量类型之外的所有类型。所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失)。基本的变量类型只有一块存储空间(分配在stack中),而引用类型有两块存储空间(一块在stack中,一块在heap中)。方法形参的值传递(引用)是指形参和传进来的参数指向同一个值的内存(heap中)。
java中的引用数据类型是怎样的?
Java中有两种数据类型:基本类型和引用类型。
基本类型
基本类型有8个:
- 整数类型:
byte
、short
、int
、long
- 浮点数类型:
float
、double
- 字符型:
char
- 布尔类型:
boolean
基本类型是通过诸如int a = 5; long b = 6L;
的形式来定义的,称为自动变量。自动变量存放的是字面值,不是类的实例,它存放在内存的堆栈中。数据大小和生存期必须是确定的,存取速度比较快。在堆栈中的字面值可以共享,也就是说我们定义一个int a = 5;
然后又定义了一个int b = 5;
这时a
与b
在内存中指向的是同一个字面常量。
引用类型
引用类型包括三种:
- 类(Class)
- 接口(Interface)
- 数组(Array)
引用类型一般是通过
new
关键字来创建,比如:
Integer num = new Integer(3);
它存放在内存的堆中,可以在运行时动态的分配内存大小,生存期也不必事先告诉编译器,当引用类型变量不被使用时,Java内部的垃圾回收器GC会自动回收走。引用变量中存放的不是变量的内容,而是存放变量内容的地址。
参数传递
在参数传递时,基本类型都是传值,也就是传递的都是原变量的值得拷贝,改变这个值不会改变原变量,而引用类型传递的是地址,也就是参数与原变量指向的是同一个地址,所以如果改变参数的值,原变量的值也会改变。这点要注意。 在Java中,8种基本类型在Java中都有对应的封装类型,也就是引用类型:
- 整数类型:
Byte
、Short
、Integer
、Long
- 浮点数类型:
Float
、Double
- 字符型:
Character
- 布尔类型:
Boolean
有时候我们会看到这样的语句:
Integer num = 3;
Boolean b = true;
这样定义也能行得通,其实这里面有一个自动装箱的问题,即Java自动把 3
这个字面常量封装成了 Integer
对象,同理也有自动拆箱。
特殊情况
1. Integer类型
Integer i1 = 3;
Integer i2 = 3;
此时 i1 == i2
返回的是 true
。
Integer i1 = 128;
Integer i2 = 128;
此时 i1 == i2
返回的是 false
。
这是因为 Integer
的数值在 -128~127 之间时,默认是按照基本类型 int
来存放的,仍旧存在堆栈中。如果超出了 int
的范围,就按照对象的方式来存放和比较了。
2. String类型
字符串类型我们有时候也会直接这样定义:
String s = "abc";
这里的 "abc"
称为字符串常量,也是存在堆栈中的,s
中存放的就是指向这个堆栈地址的引用。如果再定义一个:
String s1 = "abc";
这时,s
与 s1
存放的是同一个地址的引用,即 s
与 s1
指向的是同一个字符串常量,s == s1
的值是 true
。
但是如果有:
String s2 = new String("abc");
这时 s == s2
则为 false
,因为使用 new
之后,每次生成的对象都不是同一个,即使存储的内容相同。
上面的 s == s1
、s == s2
其实比较的都是地址,并不是里面的内容。如果要比较内容,可以使用 equals()
方法。