Java的引用类型和基本类型的区别

目录

存储内容的不同:

存储方式的不同:

变量的赋值方式不同:

变量间值传递方式不同:

String:特殊的引用类型:

基本类型也存在着自己的包装类,包装类的作用:


存储内容的不同:

基本类型:变量的值就是一个数字,一个字符或者是一个布尔值。基本数据类型包括:byte,char,short,int,long,double,float,boolean。

引用类型:是一个对象类型,它的值是 指向内存空间的引用,就是地址,所指的内存中保存着变量所表示的一个值或者一组值。

存储方式的不同:

基本类型(值类型)在内存中的存储位置主要与该变量声明的位置有关:

  • 声明在方法内的局部变量,存放在栈中。
  • 类变量和成员变量,存放在堆中的。

引用类型变量在栈中分配,引用类型的实例分配在堆中存储。

变量的赋值方式不同:

int a;
a = 123; // 基本数据类型 a,在声明的时候就已经为其分配了内存空间,所以可以直接赋值

MyDay today;
today.day = "Monday"; // 该方式就会报错,应为在引用对象的声明时只分配了引用空间,并没有分配数据空间,
// 没人知道他是一个值,还是一组值。

// 引用类型对象的赋值,必须在声明后通过实例化为其分配一块数据空间,才对变量所指的对象进行访问。
today = new MyDay(); 

变量间值传递方式不同:

基本类型是值传递:因为基本类型在变量声明的时候就分配了内存空间,所以a和b占用不同的内存空间,因而二者的改变不存在互相影响。

int a = 5;
int b = a;
b = b + 5;

// b = 10 ,a = 5;  值传递b的改变不会影响a

引用类型是引用传递:引用类型只有在实例化new MyDay()的时候才会分配内存空间。

MyDay a = new MyDay();
a.today = "Monday";
MyDay b = a;

b.today = "Tuesday";

// a.today = "Tuesday",b.today = "Tuesday"。a,b间发生的引用传递,是二者存储了同一个对象的数据内存地址

String:特殊的引用类型

String间是值传递,因为String是 final类型变量,所以他是字符串常量。当String类型变量的值改变的时候,是重新指向另一个内存空间。

String 是字符串常量,无法改变字符串的内容,如果改变则创建一个新对象指向修改后的内容。所以经常改变的字符串变量不适合用String,StringBuffer和StringBuild是字符串变量,区别就在于 StringBuffer是线程安全的 ,StringBuilder不是线程安全的。但StringBuilder的效率高于StringBuffer。

String str = 'aa';// str指向内存1,内存1存放的内容是aa
str = 'bb';// 对于String类型变量的修改,并不是修改了内存1中的内容,而是另外开辟了一块新的内存,内存2来存放bb

根据以上特征,在来看一下传递的过程:

String a = 'aa';
String b = a;
String b = 'bb';

第一步 a指向内存1 存放的是aa
第二步 b指向内存1 存放的是aa
第三步 修改string的内容,则申请一块新的内存2,存放bb,并将变量b指向内存2

此时的变量a的指向仍然是 内存1 存放的是aa

基本类型也存在着自己的包装类,包装类的作用:

基本类型拥有的赋值,运算,取值功能,包装类提供更多的功能来操作基本类型数据。

  • 基本类型和包装类间相互转化
  • 包装类和字符串之间相互转化 toString,valueOf

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值