传引用 int java_【Java进阶】传值与传引用

本文详细分析了Java中的值传递和引用传递。通过一个User类的例子,展示了如何通过setParm方法修改对象属性,以及setNewUser方法无法改变原始对象引用的问题。在Java中,所有数据传递都是值传递,但对于类的对象,实际上是引用的值在传递,而非对象本身。这导致了在setParm中可以修改对象属性,而在setNewUser中不能改变原始对象的引用。
摘要由CSDN通过智能技术生成

传值与传引用

值调用:接收调用者提供的值

引用调用:接收调用者提供的变量地址

注:引用调用的值可以被修改,但是值调用不可以

-------------------------------------------------------------------------------------------------------

JAVA数据传递全部使用了值传递,针对于JAVA常规类型int、float等都是值传递,没有任何争议,存在异议的地方一般在于JAVA类的传递。

例:定义class:

package com.company;

public class User {

private String name;

private int age;

public String getName() {

return name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void setName(String name) {

this.name = name;

}

public User(String name, int age) {

this.name = name;

this.age = age;

}

public void printParm() {

System.out.println("The name is: " + name);

System.out.println("The age is: " + age);

}

}

class很简单,只有连个属性:name和ageMain函数

package com.company;

public class Main {

private static String newName= "Oldest man";

private static int newAge= 100;

private static User newUser= new User(newName, newAge);

private static void setParm(User user, String newName, int newAge) {

user.setName(newName);

user.setAge(newAge);

}

private static void setNewUser(User oldUser){

newUser.setAge(100);

oldUser = newUser;

}

public static void main(String[] args) {

// write your code here

User man = new User("man",25);

User woman = new User("woman", 22);

System.out.println("Before setParm:");

man.printParm();

setParm(man, "new man", 10);

System.out.println("After setParm:");

man.printParm();

System.out.println(" ");

System.out.println("Before setNewUser:");

woman.printParm();

setNewUser(woman);

System.out.println("After setNewUser:");

woman.printParm();

}

}

最终的运行结果:

可以看到调用setParm和调用setNewParm得到的结果不同,其中setParm修改了name和age的值,而setNewUser没有。依次分析一下:SetParm函数调用情况

在main函数中创建了明为man的实例,这是会在堆中创建一个User的实例,假设在堆中的地址为XX1,这是会在main函数栈中创建一个名为man的变量,man的类型为User的引用,其内存空间中放置的为XX1的值(User实例的引用)

调用函数setParm时,会在main自身的栈空间中构造出一个输入变量user,其类型为User的引用个,当调用函数时,user中存放的是XX1的值

当调用函数时,user和man中保存的是相同的地址,指向了同一个User实例,所以修改了实例XX1中的属性值。

setNewUser:

初始时,在静态变量区构建了User的实例XX3,且构建了User的引用newUser指向了XX3;在main函数堆中构建了User的实例XX2,且在main的栈中构建了User的引用women。

调用函数setNewUser时,会在main的栈中构建User的引用oldUser,当开始调用函数时,woman的值会传递给oldUser,这是oldUser也指向了XX2。

当调用到赋值语句时,newUser的值会赋值给oldUser,这是oldUser指向了XX3,但是women的值依旧为XX2,没有任何改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值