Java中值类型和引用类型详解

网友投稿 260 2022-09-05


Java中值类型和引用类型详解

我们都知道java是一种面向对象的编程语言,但是在实际意义上java并不ejuus是纯面向对象,因为面向对象的意义就是万物皆对象,那么如果说int类型的变量也是一个对象的话,那么我们应该能用"."这个东西访问到它的属性或者是方法,例如:

import java.util.ArrayList;

import java.util.List;http://

public class Test {

public static void main(String[] args) {

List list = new ArrayList<>();

list.get(0);

}

}

就好比是这样,我们把这个list这个对象看做一个变量,如果他是对象的话那么我们应该能够访问到它的属性和方法,但是在java中的基本数据类型是没属性和方法的,那么我们就可以说,只要点"."不出来东西的变量都是基本数据类型(于是就出现了包装类这种东西)。

关于java中的值类型和引用类型的方法传递问题

咱们先看看Java中的这些数据是怎么存储的

不知道兄弟们能不能理解,我在用语言描述一遍

在一个函数中两个基本类型的变量在声明了之后,将这两个变量作为参数传递给另一个方法,这个方法会复制两个副本,也就是说在swap(int, int)方法中交换的是两个副本的值,其真实的值并没有交换,那么就会有人想了,那用包装类啊,用引用类型的数据不就能交换了吗,咱么看一下:

public class Test {

public static void main(String[] args) {

Integer n1 = 1, n2 = 2;

System.out.println("交换前: num1: " + n1 + "\tnum2: " + n2);

swap(n1, n2);

System.out.println("交换后: num1: " + n1 + "\tnum2: " + n2);

}

public static void swap(Integer num1, Integer num2) {

Integer temp = num1;

num1 = num2;

num2 = temp;

}

}

这个结果是没有交换的,那么就会有人想了,这是怎么回事呢?

其实虽说是引用类型,但是在传参数的过程中,还是按照副本的方式传递的,只不过是将栈区中存储的地址作为副本进行交换,但是数据在堆中,并没有交换。

Oracle官方也说过,java是没有引用传递的,只有值类型的按值传递和引用类型的按值传递,说白了只有按值传递,是无他将引用进行传递的。但是C++中是有引用类型的,我们来看一段代码:

#include

using namespace std;

int main(int agv, char** args)

{

int num1 = 1, num2 = 2;

cout << "交换前 " << "num1: " << num1 << "\tnum2: " << num2 << endl;

swap(num1, num2);

cout << "交换后 " << "num1: " << num1 << "\tnum2: " << num2 << endl;

}

void swap(int& num1, int& num2)

{

int temp = num1;

num2 = num1;

num2 = temp;

}

结果显示为:

这个是C++中的引用类型传递,传递的参数确确实实是数据的引用

在C++中或者利用指针进行地址中的值交换操作也可以,只不过相对来说麻烦一些(其实这是在C中的操作)输出结果和上面的是一样的

#include

using namespace std;

int main(int agv, char** args)

{

int num1 = 1, num2 = 2;

cout << "交换前 " << "num1: " << num1 << "\tnum2: " << num2 << endl;

swap(num1, num2);

cout << "交换后 " << "num1: " << num1 << "\tnum2: " << num2 << endl;

}

void swap(int* num1, int* num2)

{

int temp = *num1;

*num1 = *num2;

*num2 = temp;

在C#中也有引用传递,需要用到关键字ref,代码如下

static void Main(string[] args)

{

int num1 = 1, num2 = 2;

Console.WriteLine("交换前: num1: {0}\tnum2: {1}", num1, num2);

swap(ref num1, ref num2);

Console.WriteLine("交换后: num1: {0}\tnum2: {1}", num1, num2);

Console.ReadKey();

}

static void swap(ref int num1, ref int num2)

{

int temp = num1;

num1 = num2;

num2 = temp;

}

输出结果为:

确实也进行交换了

说了这么多都快跑题了,这时候可能就有人想  诶 明明标题是Java的标题,怎么说了这么一大堆其他语言的东西,马上了  不用着急

但是Java这两个功能没有怎么办呢?

我们可以用数组的方式,反正就是想法设法把堆中的数据进行交换,或者用返回值的方式,但是返回的话也只能返回一个数据(不像C#中能返回多个数据,有人就会想了,怎么java这么菜,啥啥干不了),但是事实就是如此,我们又能有什么办法。。。

public static void main(String[] args) {

int[] n1 = {1}, n2 = {2};

System.out.println("交换前: num1: " + n1[0] + "\tnum2: " + n2[0]);

swap(n1, n2);

System.out.println("交换后: num1: " + n1[0] + "\tnum2: " + n2[0]);

}

public static void swap(int[] num1, int[] num2) {

int temp = num1[0];

num1[0] = num2[0];

num2[0] = temp;

}

所以咯,java只能这么进行交换了


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python __future__ package的几个特性(python是什么意思)
下一篇:用一个简单的例子来理解python高阶函数(python函数详解)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~