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