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

来源:互联网 发布:mysql insert安装教程 编辑:程序博客网 时间:2024/06/02 00:10

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

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


0 0
原创粉丝点击