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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 罗文杰 于 2012-5-28 01:58 编辑

关于下段语句:
URLConnection conn = url.openConnection();
url.openConnection();返回的是URLConnection类型的对象,而URLConnection类是个抽象类。
我的重点疑惑点是:我理解的抽象类未经子类覆盖其抽象方法之前,是不能new对象,也不能实例化的,这句通过openConnection()方法返回的不是实例化的URLConnection对象么?这个代码是具体是怎么实现的?我的理解上哪里有误区?
求详细指点~~~ 谢谢了~~感激不尽。
越来越感觉知识掌握的不牢固,继续加油努力~~~{:soso_e194:}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
褚代江 来自手机 中级黑马 2012-5-28 06:04:57
沙发
这个用到的可能是多态的,得到的conn就是URLConnection的一个子类对象。父类引用指向子类对象。个人理解,不对大家帮改正啊

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 胡团乐 于 2012-5-28 06:55 编辑

我查看了下文档 首先那个url应该是URL类的一个对象
在URL类里边有个方法  URLConnection openConnection() 返回URLConnection
所以用URL的对象调用方法openConnection()  返回URLConnection对象

在URLConnection抽象类里有个protected  URLConnection(URL url)  构造方法
我觉得肯定是URL的openConnection() 方法实现了URLConnection类的抽象方法 通过protected  URLConnection(URL url) 构造的新对象然后返回它

回复 使用道具 举报
本帖最后由 谢述华 于 2012-5-28 09:52 编辑

按图索骥。。。
1、找到openConnection()方法,如图需要handler。
2、找到URL中的handler实例。注:handler是抽象类URLStreamHandler一个定义了的未实例化类。
3、handler  =(URLStreamHandler)cls.newInstance();。
4、cls = cl.loadClass(clsName);
①cl为系统类加载器
②claName是由前面的sun.security.action.GetPropertyAction等方法组成的。
5、找不到GetPropertyAction的源代码了,不过猜测clsName指向一个API,这个API至少应该覆盖
①、URLConnection的connect方法
②、URLStreamHandler的openConnection方法
注:handlers为handler储存集合,factory为自定义handler。(看到这部分的,可以再探讨下)

一路找来,挺有意思的,大家也可以尝试下,希望能够帮到你~~
更多图片 小图 大图
组图打开中,请稍候......
回复 使用道具 举报
谢谢楼上的几位,二楼一语道破梦中人,不过我刚刚还是找了底层源码,和5楼找的差不多,不过还是没找到具体是指向的哪个子类。以下是我找到的源码:
openConnection()方法:

handler:

URLStreamHandler类下的 openConnection()方法:



可惜绕来绕去又绕回去了……  求各位大侠详细说明下源码的实现,谢谢了,十分感激。
再次感谢楼上的几位帮忙,以及感谢将要出现的帮助我解惑的人,谢谢~~

回复 使用道具 举报
{:soso_e149:}求高人指点下源码实现,感激不尽……
回复 使用道具 举报
罗文杰 发表于 2012-5-28 21:12
求高人指点下源码实现,感激不尽……

在我图示的newInstance里面呀。URL源文件下面的,你可以再看下。只有这一个出口,找其他的只能到处绕来绕去。。。
回复 使用道具 举报
受教了。。lz提的问题不错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马