JAVA值类型和引用类型的区别
java这两种数据类型分别有哪些?
java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型)
一:值类型:
整数类型(byte,short,int,long) 浮点类型(float,double) 布尔类型(boolean) 字符类型(char)
二:引用值类型:
除了值类型外就是引用值类型了,引用值类型有 类类型(class) 数组 接口类型(interface)
值类型和引用类型的区别
值传递和引用传递
基本数据类型的赋值是值传递,当值类型变量a赋值给值类型变量b之后,再去改变a的值那么b不会随着a的改变而改变。
int a=1;
int b=a;
a=2;
System.out.println("a:"+a+"b:"+b);
引用值类型的赋值是引用传递,传递的是对象的引用地址。当引用值类型变量a赋值给引用值类型变量b之后,再去改变a的值那么b会随着a的改变而改变。
public class Test(){
int num;
public Test(int num){
this.num=num;
}
public void steNum(int num){
this.num=num;
}
public static void main(String args[]){
Test ta= new Test(1);
Test tb= new Test();
tb=ta;
ta.setNum(2);
System.out.println("ta:"+ta.num+"tb:"+tb.num);
}
}
2 内存分配
之所以会出现以上的现象是因为,值类型数据和引用类型数据在在Java中的内存分配不一样。
值类型数据是直接存储在栈中,Java JVM直接在栈中给数据开辟了一块空间,直接存储数据的值。
int a=1; //JVM为变量a在栈中开辟了一块空间(假设为A),栈中存储的是 1;
int b=a; //JVM为变量b在栈中开辟另了一块空间(假设为B),栈中存储的也是 1;
a=2; //为变量a重新赋值,栈空间A中存储的值改为2,栈空间B中存储的值不变为1
引用类型数据并不是直接存储在栈中,Java JVM会在堆中给数据分配内存空间,堆存储数据。栈存储的是指向对应堆的地址。可以说是栈中的地址引用了堆中的数据。
Test ta= new Test(1);
/* JVM为ta变量在堆中开辟一块空间(假设为K),那么堆空间K存储的是 1;
JVM为ta变量在栈中开辟一块空间(假设为A),那么栈空间A存储的是指向堆空间的地址(假设为1000)
*/
Test tb= new Test(0);
/* JVM为tb变量在堆中开辟一块空间(假设为J),那么堆空间J存储的是 0;
JVM为ta变量在栈中开辟一块空间(假设为B),那么栈空间B存储的是指向堆空间的地址(假设为2000)*/
tb=ta;
/*栈空间B中存储的地址从2000改为1000(从指向J改为指向K) 现在ta 和 tb 都引用堆空间K*/
ta.setNum(2);
/*堆空间K中存储的值改为2 所以ta.num和tb.num 都是2 */
垃圾回收机制
当堆空间存储的对象没有被栈空间中存储的地址所指向时(引用时),该对象会被自动清理掉。如前面提到的堆空间J中本来存储着 0
Test tb= new Test(0);
但是
tb=ta;
不再有地址指向堆空间J中本来存储的0,0会被自动清楚。
JAVA值类型和引用类型的区别的更多相关文章
- JAVA初学(1):值类型和引用类型的区别
JAVA值类型和引用类型的区别(转) [定义] 引用类型表示你操作的数据是同一个,也就 ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...
- C#入门篇6-7:字符串操作 看看字符串的特殊之处 值类型与引用类型的区别
//看看字符串的特殊之处值类型与引用类型的区别 public static void CompareString(string stra, string strb, int i) { #region ...
- C# 值类型和引用类型的区别
C# 值类型和引用类型的区别 1. 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 2. 值类型存取速度快,引用类型存取速度慢. 3. 值类型表示实 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- js中的值类型和引用类型的区别
1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(String).数值(Number).布尔值(Boolean).Undefined.Null (这5种基本数据类型是按 ...
- C#中关于值类型和引用类型的区别
小声哔哔 一直以来对于值类型与引用类型之间的区别都不是特别清晰,直到踩了坑.... 正好最新闲暇,便想着梳理梳理这一两年来遇到的奇葩问题和解决方案,顺便就把它给拎出来记一下,免得以后再摔跤 值类型与引 ...
- java中值类型和引用类型的区别
[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...
- 学习记录 java 值类型和引用类型的知识
1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...
随机推荐
- thinkphp5在Linux下Nginx配置问题解决
首先tp5的访问目录指向到webroot/public文件夹中. thinkphp的url访问:http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参 ...
- Python校验用户名是否合法示例
#校验用户名是否合法例子: #输入账号密码 #input #如果账号存在提示已经注册,如果不存在的,就可以注册 all_users [] #不能为空 #strip() #用户名长度6-12之间 #le ...
- (12)SecureCRT中文乱码问题
Options -- Session Options -- Appearance --Character encoding:选择UTF-8
- 获取的是 string 类型的字段,直接输出 数字 或者 需要的第几行
Freight = driver.find_element_by_xpath("//tbody/tr/td[6]").text print(type(Freight)) # 这里输 ...
- Xcode中编译iOS程序,运行出错:Thread 1: signal SIGABRT
添加一个全局Exception Breakpoint 就检测出来了 导航栏里面 Debug 菜单里面
- django settings多环境配置
通常我们会把本地.线上的配置拆分,django不同环境的配置可如下: 1.在settings.py同级目录添加settings文件夹 2.把settings.py移到settings文件夹内,并重命名 ...
- mysql 函数获取子节点
DELIMITER $$ USE `topsale`$$ DROP FUNCTION IF EXISTS `getShopIdByUserId`$$ CREATE DEFINER=`root`@`%` ...
- Linux 重装系统 连接不上的问题
https://blog.csdn.net/liqi_q/article/details/78465949 ssh-keygen -R ip
- 超详细的遗传算法(Genetic Algorithm)解析
https://blog.csdn.net/u010451580/article/details/51178225 https://www.jianshu.com/p/c82f09adee8f 00 ...
- ReactiveX 学习笔记(28)使用 RxJS + React.js 进行 GUI 编程
课题 程序界面由3个文本编辑框和1个文本标签组成. 要求文本标签实时显示3个文本编辑框所输入的数字之和. 文本编辑框输入的不是合法数字时,将其值视为0. 3个文本编辑框的初值分别为1,2,3. 创建工 ...