A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gczsjj 中级黑马   /  2017-1-12 22:27  /  2882 人查看  /  10 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

方法传参时:
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问.
那么, java中到底是传值还是传址?

来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端

10 个回复

倒序浏览
Java核心技术卷,卷一,121页
Java程序设计语言总是采用按值调用,Java程序中方法参数的使用情况为:
1.一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
2.一个方法可以改变一个对象参数的状态
3.一个方法不能让一个对象参数引用一个新的对象
package com.luan.test;

public class ParatmTest {
        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");
                Employee 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");
                Employee a = new Employee("Alice",70000);
                Employee 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 the 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 tmp = x;
                    x = y;
                    y = tmp;
                    System.out.println("End of the method:x="+x.getName());
                    System.out.println("End of the 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+=salary;
        }
}
回复 使用道具 举报
参数都是传值,引用数据类型,将引用拷贝后传递给参数,参数和原值指向童一个引用对象,所以参数可以改变引用的对象的状态。但是又因为它是值传递,所以它不能让原值引用一个新的对象。
回复 使用道具 举报
地址值也是值~~java之父说的,记住这个就行
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
基本数据类型肯定是值传递,引用数据类型传递的是地址值,地址也是值,所以可以说传递的都是值。不是那种传递的争议,而是变量的原理不一样,基本类型本身里面存储的就是对应的值,而引用数据类型需要根据引用变量指定的地址去找到对应的值。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
叶宇光 发表于 2017-1-12 23:09
地址值也是值~~java之父说的,记住这个就行

谢谢了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
传智给的视频里老师说了,这是面试题
地址值也是值,,java之父,高司令说的
回复 使用道具 举报
Rhwan 中级黑马 2017-1-13 12:03:48
8#
回复 使用道具 举报
回复 使用道具 举报
面试题的一道经典题.是java之父说的地址值也是值.学习并巩固了!
回复 使用道具 举报
我记得视频上有讲解啊,面试的时候都是值传递,因为地址值也是值啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马