java基本数据类型和引用数据类型

早上想到用 类的实例对象作为形参传入函数,如果在函数中改变了形参对象的属性值,那实参对象的属性值会不会也改变?

package new_start1;
public class Test1 {
    class Person
    {
        public String name;
        public Person(String n)
        {
            this.name=n;
        }
        public Person(){}
    }
    public static void change(Person a)//改变对象a的name值
    {
        a.name="haha";
    }
    public static void main(String[] args) {    
        Test1 t=new Test1();
        Person p=t.new Person("zhangsan"); //实例一个对象p
        Person a=t.new Person();//又实例一个对象a
        a=p;
        System.out.println("两者哈希码值相同:"+a.hashCode()+" "+p.hashCode());
        change(a);//改变a的属性值
        System.out.println(p.name);
    }
}

结论是,因为是类是引用类型,传递的是地址,即传进来的形参是地址值,所以现在实参和形参共同指向同一块地址,哈希码值相同证明两者是相等的==,只要两者指向不变,修改地址上的值自然两者都改变.

后来我又试一下,那么Integer不也应该是类吗,那么Integer实例后的对象,调用change()后能否也跟上面的结果一样?

测试:

package new_start1;
public class Test1 {
	public static void change(Integer aa)//改变
	{
		aa=100;
	}
	public static void main(String[] args) {	
		Integer a=new Integer(1);
		change(a);
		System.out.println(a);
		//输出 1
	}
}
excese me?为什么main中的a还是没变,我明明在change中改变了a的值呀,其实并不是.

首先需要明确一个问题Integer是引用类型,这绝对没问题,只是我们理解错了aa=100这句代码的含义。

一开始,在调用函数change是,a与aa指向相同,都是Integer(1)

当执行aa=100后,其实就相当于执行了aa=new Integer(100),aa的指向已经改变,aa不等于a了所以改变aa的指向对象的值,并不影响main中的a

所以a还是等于1;

画图会更清楚:


ps:

基本数据类型有:char short int long float double boolean byte

引用类型有: array  class(Integer Double Date....)   interface


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值