首页 > 编程语言 > 详细

【自学java笔记#第十七天#】按值传递与按引用传递

时间:2020-03-21 03:55:13      阅读:46      评论:0      收藏:0      [点我收藏+]

选用教材:《Java核心技术卷一》

第四章 对象与类

不同于C语言等其他语言,java程序设计语言中仅有一种参数传递方式,即按值传递。

1、方法可以修改按引用传递的变量的值,但不能修改按值传递的变量的值;

2、方法不能修改基本数据类型的参数,但能修改对象引用类型的参数;

3、方法不能让一个对象参数引用一个新的对象(对象的内容/状态可以在被调用的方法内改变,但对象的引用是永远不会改变的)。

4、示例代码:

package homework;

public class ParamTest 
{
    public static void main(String[] args)
    {
        System.out.println("Testing tripleValue:"); //测试能否改变基本数据类型变量的值
        double percent=10;
        System.out.println("Before:percent="+percent);
        tripleValue(percent);
        System.out.println("After:percent="+percent);
        
        System.out.println("\nTesting tripleSalary");//测试能否改变对象引用类型的值
        var harry=new Employee("Harry",50000);
        System.out.println("Before:salary="+harry.getSalary());
        tripleSalary(harry);
        System.out.println("After:salary="+harry.getSalary());
        
        System.out.println("\nTesting swap:");//测试方法对于对象引用类型的参数,是按值传递,还是按引用传递
        var a=new Employee("Alice",70000);
        var b=new Employee("Bob",60000);
        System.out.println("Before:a="+a.getName());
        System.out.println("Before:b="+b.getName());
        swap(a,b);
        System.out.println("After:a="+a.getName());
        System.out.println("After:b="+b.getName());
    }
    public static void tripleValue(double x)
    {
        x=3*x;
        System.out.println("End of method:x="+x);
    }
    public static void tripleSalary(Employee x)
    {
        x.raiseSalary(200);
        System.out.println("End of method:salary="+x.getSalary());
    }
    public static void swap(Employee x,Employee y)
    {
        Employee temp=x;
        x=y;
        y=temp;
        System.out.println("End of method:x="+x.getName());
        System.out.println("End of method:y="+y.getName());
    }

}
class Employee
{
    private String name;
    private double salary;
    public Employee(String n,double s)
    {
        name=n;
        salary=s;
    }
    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public void raiseSalary(double bypercent)
    {
        double raise=salary*bypercent/100;
        salary+=raise;
    }
    
    
}

5、打印结果:

Testing tripleValue:
Before:percent=10.0
End of method:x=30.0
After:percent=10.0

Testing tripleSalary
Before:salary=50000.0
End of method:salary=150000.0
After:salary=150000.0

Testing swap:
Before:a=Alice
Before:b=Bob
End of method:x=Bob
End of method:y=Alice
After:a=Alice
After:b=Bob

6、总结

纠结了两天的知识点,在今天终于明白了。java的按值传递说白了就是将变量的值copy一份传给方法,之后方法进行的任何操作,都与变量原本的值没有任何关系。

其中比较特殊的是对象引用类型参数的变化,对象的状态可以通过方法来进行修改。

之前学过的知识中,举过这样一个例子:

Date deadline=new Date();

这行简单的代码包括了3个部分:

①创建一个Date类型的对象;

②引用新创建的这个Date对象的值;

③将对象引用的值赋给变量deadline;

对象引用类型的参数本来指向的就是对象的地址,所以调用方法时会直接改变对象的状态;

同时对象引用只可能指向一个对象,不可能再指向新的对象,所以代码中的swap方法行不通。

这里有一个思维误区就是,被赋值的那个变量名是可以改变的,从a变到z都行;但是变量名的改变不代表对象引用的改变。

【自学java笔记#第十七天#】按值传递与按引用传递

原文:https://www.cnblogs.com/yizhinailu/p/12535607.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!