java基础(五)——数据类型和方法传递类型
来源:互联网 发布:知天下资源邀请码 编辑:程序博客网 时间:2024/06/15 21:40
在java中,分为两大类数据类型:值类型和引用类型。其中,值类型又可以称为基本数据类型
1.值类型(基本数据类型)(byte, short, int, long, float, double, char, boolean)
基本数据类型又可以分为数字类型(整数(byte,short,int,long)和浮点数(float,double))、字符型(char)、布尔型(boolean)
1字节:byte
2字节:short char
4字节:int float
8字节:long double
至于布尔类型(boolean)并没有明确指出占用了多少字节
2.引用类型(除了基本数据类型之外的都是引用类型,枚举是一种特殊的引用类型)
引用类型一般是指指向对象的变量,如User这个类,执行了这句:User u = new User();之后,u就是一个引用类型,它保存的是User对象的堆内存地址,指向User这个对象
3.方法的值传递
java中,所有的类型都会被分配到内存空间中,基本数据类型只有一块存储空间(被分配在栈中),而引用类型有2块存储空间(一块是存储引用变量的分配在栈中,另一块存储对象的分配在堆中)
以下摘自知乎大神@Intopass的答案(https://www.zhihu.com/question/31203609)
一、基本类型 和 引用类型的不同之处
int num = 10;String str = "hello";
如图所示,num是基本类型,值就保存在变量中。str是引用类型,变量中保存的只是对象的的地址,一般这种变量称为“引用”。引用指向实际对象,对象中保存着内容。
二、赋值运算符(=)的作用
num = 20;str = "java";
对应基本类型num,赋值运算符会直接改变变量值,原来的值被覆盖;
对应引用str,赋值运算会改变引用中保存的地址(指向另一个对象),原来的地址被覆盖掉,但是原来的对象不会被改变(还是“hello”)
三、调用方法时发生了什么?参数传递基本上就是赋值操作。
第一个例子:基本类型void foo(int value) { value = 100;}foo(num); // num 没有被改变第二个例子:没有提供改变自身方法的引用类型void foo(String text) { text = "windows";}foo(str); // str 也没有被改变第三个例子:提供了改变自身方法的引用类型StringBuilder sb = new StringBuilder("iphone");void foo(StringBuilder builder) { builder.append("4");}foo(sb); // sb 被改变了,变成了"iphone4"。第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。StringBuilder sb = new StringBuilder("iphone");void foo(StringBuilder builder) { builder = new StringBuilder("ipad");}foo(sb); // sb 没有被改变,还是 "iphone"。
下面是第3个例子图解:
StringBuilder sb = new StringBuilder("iphone");foo(sb);void foo(StringBuilder builder) { builder.append("4");}
开始在堆内存中创建了一个地址为0x11的StringBuilder对象,对象内容为“iphone”,sb保存着这个对象的地址(0x11),也就是sb指向这个对象;调用方法foo,实际上就是把sb的值0x11赋给了另一个StringBuilder类型的引用builder,此时builder的值也变成了0x11,与sb指向的是同一个对象。所谓值传递,其实就是把变量值赋给方法参数。
builder.append("4")之后,其实就是builder指向的对象的内容发生了改变。
下面是第4个例子的图解:
StringBuilder sb = new StringBuilder("iphone");foo(sb);void foo(StringBuilder builder) { builder = new StringBuilder("ipad");}
一开始,创建了sb对象,存储的对象地址是(0x11),对象内容为"iphone";调用foo方法,将sb的值(也就是0x11)赋给builder,然后builder也指向"iphone"
builder = new StringBuilder("ipad"); 之后,实际上是在堆内存中创建了一个新的StringBuilder的对象,对象里面保存的值是:"ipad",而builder指向了这个新对象,所以builder的值变成了0x12,不再指向原来地址为0x11的对象了
小结:java中的“=”符号是一种赋值操作,调用方法其实就是将值复制到形参上面。如果参数是基本类型变量,那么就是对值的复制;如果参数是引用类型,那么就是对地址的复制。
- java基础(五)——数据类型和方法传递类型
- java基础五 数据类型
- Java基础---Java中的数据类型(五)
- java基础之----基本数据类型和引用数据类型的参数传递过程(一)
- Java中的原生数据类型和引用类型的参数传递
- Java中的原生数据类型和引用类型的参数传递
- 夯实基础——Java基本数据类型、应用类型和转换
- Java基础--基本数据类型(浮点类型)
- JavaScript基础(五)--- 基本数据类型和引用数据类型
- Java语言基础(四)—— 变量和数据类型
- java基础篇(七:数据类型——1)——基本类型
- C#基础原理拾遗——引用类型的值传递和引用传递
- Java数据类型和参数传递
- Java基础(五)Java中的参数传递机制
- java数据类型补充——字符串和其他类型相加
- java基础——方法参数的值传递机制
- Java基础——方法的参数传递机制
- java方法传递引用、传递基本类型
- 入侵渗透的经验
- Java之冒泡排序
- Qt笔记-qml-lineEdit
- canvas绘制质控图
- ssh连接失败自动重连脚本
- java基础(五)——数据类型和方法传递类型
- Docker images导出和导入
- 《知识付费与内容创业分析》,看内容付费工具、内容付费系统的发展
- 9.一些代码
- Java之快速排序
- 通过例子学设计模式之--单例模式以及多线程下说明(C++实现)
- tomcat配置全局JNDI和私有jndi的方式
- 【steam】steam双击没反应
- 集算器入门之安装与基本使用