Java里的值传递与“引用传递”——一些想法

这两天在看Java的时候看到了方法中的值传递与引用传递,对于值传递我们都可以理解,非常的简单,但是对于引用传递,对于我们学过c++的人来说,那可不就来劲了吗,直接写一个函数来用“&”操作符直接改变参数的值——多么方便啊!!

BUT!!

Java没有引用传递,只有值传递

  • 实参:实际参数,是提前准备好并赋值完成的变量。分配到栈上。如果是基本类型直接分配到栈上,如果是引用类型,栈上分配引用空间存储指向堆上分配的对象本身的指针。
  • 形参:形式参数,方法调用时在栈上分配的实参的拷贝。
  • 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,形参接收的是原始值的一个拷贝,此时内存中存在两个相等的变量
  • 引用传递:方法调用时将实参的地址传递给对应的形参,实参和形参指向相同的内容 

那么我们如何改变想要改变的数据呢?

Java中有两种大的数据类型:

1、基本数据类型:包括数值类型(整数,浮点数),字符类型(char),逻辑类型(boolean)

2、引用数据类型:包括类,接口,数组

我们对于基本数据类型进行操作的话只能改变形参的值,并不能改变实参,而如果我们对于引用数据类型进行操作,则可以改变我们想要改变的数据(由于对地址直接进行了操作)

在Java里我们并不能像c++一样放荡不羁,如此简单的操作内存,对于Java来说,简便是要素,那么让人头疼的引用自然需要用其他的方法来代替——

下面我来说两种最近看到的方法来对于我们想要让它本身改变的方法:

一、使用数组进行操作。

我们知道在c++中,数组是与指针其实是一样的,在Java中似乎保留了这样的特性,所以我们可以直接对于数组进行操作,从而将变化体现在实际上面。

扫描二维码关注公众号,回复: 6914994 查看本文章

代码如下:

public class helloworld {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        for(int i=0 ; i<5 ; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        change(arr);
        for(int i=0 ; i<5 ; i++) {
            System.out.print(arr[i]+" ");
        }
}
    public static void change(int arr[]) {
        for(int i=0; i<5; i++) {
            if(arr[i]%2 == 0) {
                arr[i]*=2;
            }
        }
    }
}

(原谅博主懒,同一个项目反反复复用了好多遍。。。。。哭辽orz)

当然还有我们无法使用数组的时候:

这时候还有一个比较麻烦的方式——创建对象。。。

二、使用对象进行操作。

由于对象是引用数据类型,我们可以直接改变数据的值,代码如下:

class number{
        private int a;
        private int b;
        public number(int num1,int num2) {
            this.a=num1;
            this.b=num2;
        }
        public void ShowNumber() {
            System.out.println("a = "+a+" b = "+b);
        }
        public void Swap() {
            int temp = this.a;
            this.a = this.b;
            this.b = temp;
        }
}

public class helloworld {
    public static void main(String[] args) {
        System.out.println("Input two numbers:");
        Scanner sc1 = new Scanner(System.in);
        Scanner sc2 = new Scanner(System.in);
        number num = new number(sc1.nextInt(),sc2.nextInt());
        num.ShowNumber();
        num.Swap();
        num.ShowNumber();
        sc1.close();
        sc2.close();
}
}

这就是两种方法啦

在以后或许还会有新的方法加入叭~

到时候也会继续更新的呢~

猜你喜欢

转载自www.cnblogs.com/ever17/p/11278667.html