为了账号安全,请及时绑定邮箱和手机立即绑定

Java中import导入类与加载类有什么区别

Java中import导入类与加载类有什么区别

阿波罗的战车 2018-12-06 22:08:13
以 Jdbc为例 :Class.forName("com.mysql.jdbc.Driver"),这句话为什么不能替换成在首部导入驱动类:import com.mysql.jdbc.Driver ??  --------好吧,第二次修改------ import A;导入类A是否在运行时会将类A导入内存
查看完整描述

13 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

@学数学的程序猿: 我用的也是java8、myeclipse、真的是反复清理、刷新了好几次,确认编译后的文件的确删除了那条导入语句。。。。。

查看完整回答
反对 回复 2018-12-16
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

@爱前端的后端Coder: 确实被删除了,但我发现啥都不写直接DriverManager.getConnection(...)居然也成功获取到数据了,有图为证:

查看完整回答
反对 回复 2018-12-16
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

@学数学的程序猿: 应该报的是 找不到驱动的错误,不清楚你的什么情况  -_-

查看完整回答
反对 回复 2018-12-16
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

这是一个很简单的语法知识,Class.forName#String 是执行Class类的静态方法,你这里的“com.mysql.jdbc.driver”是参数而已,在java文件中,使用类需要写类全名(如直接写com.mysql.jdbc.Driver),或者写简名Driver,前提是在在前面写import 包名,Class类属于java.lang包,默认包含java.lang

查看完整回答
反对 回复 2018-12-16
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

谢答!
我知道的是 Class.forName(A)这个方法会将类A加载到内存当中,而类A一旦被加载到内存中时,就会执行类A中的静态代码块。所以我想的是,利用import A;应该也能将类A加载到内存中,从而实现同样的效果。可是貌似编译时,会删除无用的导入类,即使我加入了@SuppressWarnings("unused")也会删除。。。。。。

查看完整回答
反对 回复 2018-12-16
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

import是给编译器用的,

class.forName是运行时生效的,

查看完整回答
反对 回复 2018-12-16
?
当年话下

TA贡献1890条经验 获得超9个赞

你这个有点鸡蛋里挑骨头的样子    照着写不就好了嘛!

查看完整回答
反对 回复 2018-12-16
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

这个问题问的很尖锐

查看完整回答
反对 回复 2018-12-16
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

很好的问题,为此我特地实验了一下,直接import Driver, 然后DriverManager.registerDriver(Driver());是可行的的,事实上,看com.mysql.jdbc.Driver源码发现其内部就是执行了如下静态代码块:

static {
    try {
       DriverManager.registerDriver(new Driver());
    } catch (SQLException var1) {
        throw new RuntimeException("Can't register driver!");
    }
}

为啥jdk作者或者是mysql驱动开发者不直接让开发人员new,而是通过类全称来加载Driver类,我能想到的一点原因是 根据字符串来加载类可以做到java代码与具体数据库解耦分离,通常我们会将驱动类的全称写进配置文件,需要切换数据库时,只需修改配置文件即可,而java代码几乎可以不用做任何修改;而使用new加载创建Driver实例就不行了。

查看完整回答
反对 回复 2018-12-16
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

再补充一点,直接import com.mysql.jdbc.Driver;不写DriverManager.registerDriver(new Driver());也是可行的!缺点还是如上。

查看完整回答
反对 回复 2018-12-16
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

@学数学的程序猿: 谢答!直接import com.mysql.jdbc.Driver;这样是不行的,我反编译后,发现因为导入的这个Driver类,因为并没用用到,所以,编译器编译时会直接删除这句导包的语句:import com.mysql.jdbc.Driver;
我知道的是 Class.forName(A)这个方法会将类A加载到内存当中,而类A一旦被加载到内存中时,就会执行类A中的静态代码块。所以我想的是,利用import A;应该也能将类A加载到内存中,从而实现同样的效果。可是貌似编译时,会删除无用的导入类,即使我加入了@SuppressWarnings("unused")也会删除。。。。。。  

查看完整回答
反对 回复 2018-12-16
?
慕沐林林

TA贡献2016条经验 获得超9个赞

@爱前端的后端Coder: 我昨晚试的是可以的。之前也想到编译器可能会做优化,删除"无用"的语句,但事实上它没有,我用的是java8,不知你用的是啥版本?

查看完整回答
反对 回复 2018-12-16
  • 13 回答
  • 0 关注
  • 1480 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号