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

  • 以 Jdbc为例 :Class.forName("com.mysql.jdbc.Driver"),这句话为什么不能替换成在首部导入驱动类:import com.mysql.jdbc.Driver ?? 
  • --------好吧,第二次修改------
  • import A;导入类A是否在运行时会将类A导入内存
阿波罗的战车
浏览 1481回答 13
13回答

鸿蒙传说

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

温温酱

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

眼眸繁星

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

慕哥9229398

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

海绵宝宝撒

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

翻过高山走不出你

import是给编译器用的, class.forName是运行时生效的,

当年话下

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

慕姐4208626

这个问题问的很尖锐

幕布斯7119047

很好的问题,为此我特地实验了一下,直接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实例就不行了。

慕田峪7331174

再补充一点,直接import com.mysql.jdbc.Driver;不写DriverManager.registerDriver(new Driver());也是可行的!缺点还是如上。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java