黑马程序员技术交流社区

标题: 对输出语句的疑问 [打印本页]

作者: 木木赤赤    时间: 2013-11-26 10:06
标题: 对输出语句的疑问
本帖最后由 木木赤赤 于 2013-11-26 10:59 编辑

对输出语句的疑问
下面的红框里接受的是Object的对象,而上面的红框里要输出的是字符串和值,我想不明白了,这时如何输出的呢?有点转不过弯来,帮忙解释一下,谢谢!

clip_image001.jpg (64.47 KB, 下载次数: 30)

clip_image001.jpg

作者: 爱上这格调    时间: 2013-11-26 10:14
输出语句接受的对象是Object类型,这里用到多态的知识,一切对象都是他的子类,所以不管传进去什么,都能够接受,所以能打印出来
作者: 一直很安静    时间: 2013-11-26 10:18
字符串和任何东西相加都变成字符串,而字符串是Object的子类
作者: 樊志伟    时间: 2013-11-26 10:21
这里涉及到的知识点就是好多态以及类型转换
println()方法可以接收任何对象,不管是基本数据类型还是对象还是数组还是字符串。
而上面的sop中的字符串加数字("size:"+al.size();)会被自动转换成字符串对象,也就是说
("size:"+al.size();)实际就是一个字符串。而String也是Object的子类,所以sop方法就会输出
字符串。
作者: 回天之力    时间: 2013-11-26 10:23
sop("size:"+al.size());这个调用语句,sop函数中的参数为Object。那么"size:"+al.size(),表达式得出的结果是String类型的字符串。String是继承根类Object,所以可以把子类作为参数传入函数。用到多态的知识。
作者: 忄雾飞扬    时间: 2013-11-26 10:38
  1. public class Demo4 {

  2.         public static void main(String[] args) {
  3.                
  4.                 //多说一句:这里加泛型更安全些,ArrayList<String> al = new ArrayList<String>();把问题出现在编译阶段
  5.                 ArrayList al = new ArrayList();
  6.                 al.add("java01");
  7.                 al.add("java02");
  8.                 al.add("java03");
  9.                 al.add("java04");
  10.                 //在java中,int型数值加字符串肯定得到一个字符串
  11.                 sop("size:" + al.size());
  12.                
  13.         }
  14.         //Object 代表参数类型java中万物皆对象,Object相当于上帝是所有对象的父类; obj则是该函数接收的一个实例对象  
  15.         public static void sop (Object obj){
  16.                 //下面这句话实际上是自动调用了实例对象obj的toString()方法
  17.                 //System.out.println(obj.toString());
  18.                 System.out.println(obj);
  19.         }

  20. }
复制代码

作者: 樊志伟    时间: 2013-11-26 10:40
另外,我告诉你,为什么println方法可以输出任何对象。
API中,println方法是有很多重载形式的,这些println方法接收的参数有空参数,boolean,char,char[],double,float,int,long,String,Object等
下面是API中的截图




所以,你的sop方法里的println就是复写了参数为Object的println方法。
而这个方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用print(String)再调用println() 一样。
而String.valueOf()这个方法会自动调用toString方法,所以最后会打印字符串。你可以通过复写toString方法来验证这一点,我验证了,很对。

  1. class test {

  2.         public static void main(String[] args) {
  3.                 A a = new A();
  4.                 System.out.println(a);
  5.         }

  6. }

  7. class A
  8. {
  9.         public String toString()
  10.         {
  11.                 System.out.println("toString");
  12.                 return "";
  13.         }
  14. }
复制代码
最后的输出结果是:

toString


QQ截图20131126102528.jpg (68.36 KB, 下载次数: 12)

Api截图

Api截图

作者: 王雷1    时间: 2013-11-26 11:20
按老师视频里说的就是你别想那么多,Object就是上帝,他什么都能接手,像字符串,基本类型,方法,数组,都没有问题,因为任何东西都有一个返回值,而这里的Object接受的就是这个返回值。前面跟的又是一个打印语句,意思就是说,你的打印语句可以打印任意类型的返回值。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2