文章目录
  1. 1. 将指针藏起来的JAVA

引言:将指针扼杀掉的JAVA到底能不能传引用?或者说,传入的实参能否被函数修改?


将指针藏起来的JAVA

  • JAVA是存在指针的,但它的用法被极大的限制了,以至于我们察觉不到它的存在。但我认为如果因此不去了解JAVA的指针,是无法学好JAVA的。

  • 代码转自知乎java到底是值传递还是引用传递?Intopass的回答。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //第一个例子:基本类型
    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"。
    • 如果已经入手一段时间JAVA,就会发现Dog d; 这样的声明只会产生一个Dog对象的指针,它没有任何空间,需要使用d=new Dog(); 为其划分空间后才能使用。这是对于对象。
    • 如果我这样写int a; 那么a是可以立即被使用的,它已经被划分好了空间。因为它是基本类型变量。

    也就是说,当我传参传入的是int的话,其实是将值复制了一份,形参和实参它们两个只有值是一样的,而我传入的是String的话,是将String的指针复制了一份,形参和实参(都指的是指向对象的指针)指向的对象是一样的。

  • 提问:那是不是意味着传对象就相当于传引用了呢?

    没错。但你也要考虑清楚,如同上述代码第二个例子,text="windows";,你要理解这究竟是什么意思,它实际上是重载运算符,等价于text=new String("windows");,说到这里你应该明白了,这只是给text指针分配了一个新的地址空间而已,原空间的str没有任何改变。

  • 提问:如果我写int[] iArray={1,3,5,7,9}; 将其传入函数,为什么可以修改?

    很好理解,你可以按照JAVA的理解,数组也是对象,因此可以成功将引用传入函数,而由于数组元素类型都是int,不存在重载赋值运算符为new之类的操作,因此是可以修改的。

    你也可以按照C语言的理解,传入的是数组首元素的地址,因此可以进行修改。

  • 提问:如果我想传int引用怎么办?

    实测Integer对象是无法达到传引用的目的的,因此我能想到的方法就是封装一个int类。因为目前水平有限,还不会重载运算符,因此我简单的进行了一个封装,看官明白一下意思就行了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public static void test(Intege a){
    a.setValue(123);
    }
    public static void main(String args[]){
    Intege a=new Intege();
    test(a);
    System.out.println(a.getValue());
    }

    //……省略若干代码

    class Intege{
    private int a;
    void setValue(int a){
    this.a=a;
    }
    int getValue(){
    return this.a;
    }
    }

    这样将Intege型的变量传入后,即可通过setValue方法对值进行修改。

  • 不管怎样,我觉得没有指针的日子很难过……

文章目录
  1. 1. 将指针藏起来的JAVA