我们在输出变量名、对象名、数组名时有时会得到地址,有时会得到内容,那么,这个有什么有什么规律呢?
今天我主要跟大家分析JAVA基础学习阶段目前已经遇到的最复杂的一类,就是自定义类的对象作为ArrayList<E>的元素时的情况。
如下代码:
//查看自定义Student类的地址关系
ArrayList<Student> stuList = new ArrayList<Student>();
Student stu1 = new Student("琳琳", 18);
Student stu2 = new Student("Tom", 20);
stuList.add(stu1);
stuList.add(stu2);
//直接打印ArrayList类的对象名stuList得到
System.out.println(stuList);//[cn.itcast.day07.demo05.Student@75412c2f, cn.itcast.day07.demo05.Student@282ba1e]
//用ArrayList类的对象名引用get方法并打印得到
System.out.println(stuList.get(0));//cn.itcast.day07.demo05.Student@75412c2f
//直接打印ArrayList类的对象名stuList得到
System.out.println(stu1);//cn.itcast.day07.demo05.Student@75412c2f
System.out.println(stu2);//cn.itcast.day07.demo05.Student@282ba1e
===============================================================
//查看引用String类型的地址
ArrayList<String> strList = new ArrayList<>();
strList.add("one");
strList.add("two");
//直接打印ArrayList类的对象名strList得到
System.out.println(strList);//[one, two]
//用ArrayList类的对象名引用get方法并打印得到
System.out.println(strList.get(0));//one
System.out.println(strList.get(1));//two
从结果中我们可以看出:
1、 当用String作为泛型的类型时,打印得到的直接是内容;
2、 当用自定义类作为泛型的类型时,得到的都是地址,也就是说,此时ArrayList类的对象stuList中储存的都是一系列的地址值。这一点与我们之前学到的,当生命一个类的实例化对象时,对象名储存的是地址值这一点是一致的。
3、 以上两点的差异原因在于,String类的成员方法对print重新做了定义,理论上将这样的方法应用于我们自定义的类应该会得到同样的效果。
|
|