博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中的引用类型和值类型的区别
阅读量:6682 次
发布时间:2019-06-25

本文共 2667 字,大约阅读时间需要 8 分钟。

什么是引用类型和值类型

我们知道java中变量的类型从大的分可分为值类型和引用类型,那么问题来了,什么是引用类型什么是值类型?其实基本上值类型就是八种基本类型,注意我这里说的是基本上,至于为什么,后面会有解释,除了基本类型剩下的都是引用类型。

基本类型:

基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。java中有四类八种:

四类:1,整型 2,浮点型 3,字符型4,逻辑型

八种:byte,short,char,int,long,float,double,boolean   

引用类型:

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

在搞清楚值类型与引用类型之后,那么它们之间用起来有什么区别呢?这就引出了下一个话题就是值传递与引用传递。

值传递与引用传递

talk is cheap show, me your code

package com.lsj;/** * 讲解java中的引用传递和值传递 * @author vi@jolie * */public class TestValueTransmit {  public static void main(String[] args) {    // TODO Auto-generated method stub    int i = 0;    User user = new User(1);//    String s ="Hello java";    testInt(i);    System.out.println("main 方法中的int值"+i);    testUser(user);    System.out.println("main 方法中"+user);//    testString(s);//    System.out.println("main 方法中的string值"+s);      }  private static void testInt(int m) {    m ++;  }//  private static void testString(String s) {//    System.out.println("testString 方法中的初始值是:"+s);//    s = "Hello world";//    System.out.println("testString 方法中的结果是:"+s);//  }  private static void testUser(User user) {    user.age ++;  }  }class User{  int age;  public User(int age) {    super();    this.age = age;  }  @Override  public String toString() {    return "用户的年龄是:" + age;  }  }复制代码

结果输出如下:

main 方法中的int值0main 方法中用户的年龄是:2复制代码

仔细观察看出它们的区别了么?

i在调用testInt()函数之后进行加1操作,可是实际上却并没有加1。因为int属于八种基本类型之一,是值类型,而值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。也就是说testInt()这个方法吧main()函数中i的值0传递给了函数testInt(),在testInt()中吧0这个值付给了m,对m进行加1操作,当然不会影响到main()函数中i的值。而testUser()则不是这样,因为User不是八种基本类型值一,因此是引用类型,而引用传递传的是地址,就是将实参的地址传递给形参,也就是说两者指向的是同一块内存,所以当testUser对user进行操作时,内存里的值发生了变化,两者指向的又是同一块内存地址,取到的是同一个东西,因此都会发生改变,打个比方,篮子只有一个苹果,有两个人都看见了,第二个人拿起了咬一口,那么第一个人再去拿苹果的时候,那个苹果是已经被咬了一口的,以为只有一个苹果。到此本文可以说结束了,但是记得文章开始前,有个小问题,为什么说基本上值类型就是八种基本类型,难道还有特殊的?有!看如下代码

ublic class TestValueTransmit {  public static void main(String[] args) {    // TODO Auto-generated method stub    String s ="Hello java";    String s1 ="Hello java";    String s2 = new String("Hello java");    String s3 = new String("Hello java");    System.out.println("s==s1"+(s==s1));    System.out.println("s2==s1"+(s2==s1));    System.out.println("s2==s3"+(s2==s3));    }  }复制代码

输出结果如下:

s==s1trues2==s1falses2==s3false复制代码

是不是感到很奇怪,按道理如果String是引用类型,s == s1应该是false啊。别急,慢慢说道说道。首先首先 == 号比较的是引用的地址是否相当,而s 和 s1 都是String 类型的引用,被声明在栈里,"Hello java”是字符串常量存储在常量区内。但是编译器做了优化,当发现之前已经有"Hello java"后( String s ="Hello java"),便让s1直接指向"Hello java"不会重新创建一个"Hello java"的常量,即现在s和s1都是指向的同一个"Hello java"了,所以为true。而String s2 = new String("Hello java") 是在堆中创建一个新的String实体,并拷贝“Hello java”的内容,并返回新的String实体的地址,赋值给指针s2,s2==s1false,s2==s3false,到此结束。

转载地址:http://vdaao.baihongyu.com/

你可能感兴趣的文章
30幅非常漂亮的微距摄影作品欣赏
查看>>
6、关于ctemplate的一个例子
查看>>
Sql Server 锁资源模式详解
查看>>
标准电声系统测试
查看>>
SQLite移植手记
查看>>
volcanol_Linux_问题汇总系列
查看>>
Bing Maps开发扩展一:Oracle Spatial的空间数据渲染
查看>>
HTTP中Keep-Alive(长连接)的一些说明
查看>>
apache2.4.1+mysql5.5.21+php5.4.0安装实践(二)
查看>>
LintCode 最大正方形
查看>>
python三方库之requests-快速上手
查看>>
PowerShell 获取Site Collection下被签出的文件
查看>>
见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用
查看>>
常用的HTML5、CSS3新特性能力检测写法
查看>>
安卓巴士诚招版主,希望各位巴友踊跃加入我们!
查看>>
【笔记】一些linux实用函数技巧【原创】
查看>>
JS验证集合
查看>>
第05篇:C#星夜拾遗之使用数据库
查看>>
现代软件工程讲义 4 方法论 - MSF
查看>>
线程同步工具类
查看>>