zoukankan      html  css  js  c++  java
  • Java的值传递和引用传递

    先不多说,看两个题。

    第一题,如下代码执行结果:

    package com.zhyea.test;
    
    public class Test {
    
        public static void main(String[] args) {
            String str = "123";
            changeString(str);
            System.out.println(str);
        }
    
        public static void changeString(String str){
            str = "ABCDEFG";
        }
    }

    第二题,如下代码执行结果:

    package com.zhyea.test;
    
    public class MyTest {
    
        public static void main(String[] args) {
            Person robin = new Person("Robin", 29);
            changePersonName(robin, "zhangsan");
            System.out.println(robin);
        }
    
        public static void changePersonName(Person p, String name) {
            p.setName(name);
        }
    }
    
    class Person {
        String name;
        int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String toString() {
            return "Person name:[" + name + "], age:[" + age + "]";
        }
    }

    看后心里运行下,稍后讨论结果。

    值传递:调用方法时,实参将它的值传递给形参,执行方法时形参值的改变不影响实参。

    引用传递:也称地址传递。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

    关于引用传递解释得有点晦涩是吧。不过也不影响理解。

    这里传递的两个变量都是引用类型(String和Person)。所以按引用传递的解释,第一个输出的应该是“ABCDEFG”,第二个输出的就是“Person name:[zhangsan], age:[29]”。

    嗯。跟我想的一样。可是我错了。

    这个问题在CSDN有讨论过:http://bbs.csdn.net/topics/390245117

    直接说结论:Java中没有引用传递。Java中实参交给方法形参的值是它实际值的一个副本。方法对形参所做的任何操作对实参无任何影响。

    回来说那两道题:

    第一题结果比较好理解,和结论一致,不解释了。

    第二题还需要解释下,在这道题中,实参的值并没有改变,改变的是实参的值所指向的对象里面的属性。解释得比较拗口。这涉及到引用类型与内存之间的一些关系。这个可以自己查些资料。

    说下我的理解:如果把引用类型对象比作一个房子,那么引用类型的变量(实参)就是一把可以打开这个房子的门牌号。实参把房子的门牌号告诉了方法,方法知道了门牌号就可以找到并进入这个房子。但是哪怕方法把房子里的东西都搬空了,这个房子的门牌号却是不能动的。

    再为第二题拿个实例出来就好理解了:

    package com.zhyea.test;
    
    public class MyTest {
    
        public static void main(String[] args) {
            Person robin = new Person("Robin", 29);
            changePerson(robin);
            System.out.println(robin);
        }
        
        public static void changePerson(Person p) {
            Person tom = new Person("Tom", 16);
            p = tom;
        }
    }
    
    class Person {
        String name;
        int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String toString() {
            return "Person name:[" + name + "], age:[" + age + "]";
        }
    }

    就这样。

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/amunote/p/4183905.html
Copyright © 2011-2022 走看看