A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵志勇 中级黑马   /  2012-6-1 18:31  /  2346 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前几天在10期的版块提出的问题没有解决,故在这里重新提问一下:
请看下边的代码:
public static void sop (Object obj)
{System.out.println(obj);
}//
这是一个自定义函数。
在主函数中有这样的引用:
sop("size:"+al.size());
我疑惑的是在自定义函数中sop 中形参类型是object ,而在主函数中的sop 的实参是int 类型。这是怎么回事呢?
形参可以和实参的类型不同吗? 求高手回答。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 袁錦泰 于 2012-6-1 18:57 编辑

你参数定义为Object就意味着在调用时这个参数的数据类型可以接收任意数据类型的数据,因为Object是所有类的父类,可以理解为多态
我要纠正你一下,此时你这个在主函数调用sop()方法中传入的参数是String,因为这个方法的功能是输出语句,你输出的并不只是数字
还有就是输出后无论是什么数据类型都将以字符串形式所体现
回复 使用道具 举报
袁錦泰 发表于 2012-6-1 18:39
你参数定义为Object就意味着在调用时这个参数的数据类型可以接收任意数据类型的数据,因为Object是所有类的 ...

多谢,我记错了输出语句的强转,可是object 是超类,他也是类,而String是数据类型啊吗,他们能联系吗?我已经进入迷途了,当初看视频很容易看懂,可是就是那天突然就转不过弯来了。
回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-6-1 19:00 编辑
赵志勇 发表于 2012-6-1 18:47
多谢,我记错了输出语句的强转,可是object 是超类,他也是类,而String是数据类型啊吗,他们能联系吗? ...

是我描述的不准确,非常抱歉,String不是数据类型,而是一个类.
我的意思是你在调用方法后,参数传入的是字符串对象,并不是整形数字,输出后是以字符串形式打印出来的.
如果没有写"size:",你传入的参数即是整形数字,输出后是以字符串形式打印的.
String是类. 它直接继承于Object类.
回复 使用道具 举报
袁錦泰 发表于 2012-6-1 18:56
是我描述的不准确,非常抱歉,String不是数据类型,而是一个类.
我的意思是你在调用方法后,参数传入的是字符 ...

还有一个小问题我就彻底明白了,在输出语句中没有强制转化成String类的语句,是不是+的作用是强制转化成类?谢谢。
回复 使用道具 举报
heima_dinghua 发表于 2012-6-1 18:43
Object类是所有类的父类,是上帝,所有类型都可以上转成Object类型的。
因此将打印函数sop方法形参定为Obje ...

可是System.out.print()中的哪个是对象呢?他们不是字符串吗?是谁把它们封装成对象了?
回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-6-1 19:21 编辑
赵志勇 发表于 2012-6-1 19:12
还有一个小问题我就彻底明白了,在输出语句中没有强制转化成String类的语句,是不是+的作用是强制转化成 ...

因为"size:"是字符串,+是字符串连接符.
x + "" -->无论你x是什么数据类型,后跟+""都将变为字符串,并只是+的缘故

回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-6-1 19:26 编辑
赵志勇 发表于 2012-6-1 19:14
可是System.out.print()中的哪个是对象呢?他们不是字符串吗?是谁把它们封装成对象了? ...

是()中的内容,括号中的内容相当于传入的实参,你括号中是"size:"+al.size();,al.size()得来的结果是int型的数字,因为前面有"size:"+,所以他最终成为了字符串对象.刚说了String不是基本数据类型,而是一个类,现在你应该明了了吧?!
回复 使用道具 举报
public staitc void sop(Object obj)
{
     System.out.println(obj);
}
上面这个函数刚开始是在毕向东老师的视频里看到,开始没以为然,现在我已经离不开它了。
只要一开始写代码就把它先搞定。。。真的很方便。。。我觉得SUN在后面的升级中可以考虑把它封装起来!
那么现在来说说楼主的疑问吧:
首先,方法接受的参数是Object形的,这是由于我们做这个函数是为了它能够打印任何类。Object是java的顶层超类。所以只有它能实现。
其次,在主函数中调用的时候传入int形实参,实际上这个时候int形的整数做了一个自动装箱的过程,转化成了Integer对象,再调用Integer的toString方法。
最后,不管你在sop()中传入任何东东,都能调用其toString()方法来实现打印输出。当然前提是格式要对哦!
回复 使用道具 举报
梁清平 发表于 2012-6-1 19:38
public staitc void sop(Object obj)
{
     System.out.println(obj);

明白了非常感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马