java中package,jar,import和非public类的困惑

初学java,对这些概念不是很清楚。大概了解了一点,但是有困惑如下:
1,import其实和c里面的include还是有区别的是吧?import只是帮我们多打了点字,不用import也是可以的,就是自己要多打点字对吗?
2,package的作用只是为了包含多个java文件,方便被其他java文件来import它里面的java文件是吧?那如果package内的java文件想使用本package内的其他java文件,需要code“包名.java文件名”吗?还是直接code java文件名就可以?
3,jar包是一个java文件编译后产生多个class文件的集合对吗?
4,一个java文件里面的非public类,我看很多资料都说非public类不可以被包外使用,但可以被包内引用,这里的“包”指的是什么?指的是java文件还是package,还是jar?
万分感谢!!

阅读 6.5k
2 个回答
  1. C/C++里面的include是把源文件包含进来一起编译,java里面的import只是告诉java编译器编译该源文件需要使用到这些类,Java编译器会到class path中加载这些类

  2. java里的package作用和c++里的namespace类似,不同的是java强制package和文件夹对应以方便加载。

  3. yes,一开始jar包的作用是方便部署,现在jar包里面可以包含一些meta信息,这样jar有点类似组件化的思想了,可以动态加载和卸载,比如OSGi里面的jar就是一个组件。

  4. 包指的是该类所属的package,就是每个java文件最顶上申明的那一行。非public分为private和package作用域的,如果什么都不声明那就是package作用域,package作用域表示只有同一package下的class才能访问。

1,Java的import和C的include在语义上没有区别,意思都是指源文件需要依赖其它文件才能编译成功。但是在编译的(链接)link阶段时候有区别,C会将源文件包含进来一起编译,而Java会在classpath下找到对应的源文件,引用它。

2,package的作用能将各个类用命名空间分隔开,方便管理。你说的方便被其他java文件来import它里面的java文件也是对的,比如说你的程序里有两个Father类,那么必须通过包名来区分这两个类,在import时候指定特定的包名.Father。例如java.sql.Datejava.util.Date,这也体现出包名的作用。

3,jar包并不只是一个Java文件编译后产生多个class文件,当然,可以在一个Java文件里写多个类,编译出来自然会有多个class。一个jar包可以包含多个package编译后的class文件。另外,jar包也并非只能包含class文件,实际上还包含了一些关于jar包的元信息。甚至,jar包还能包含Java源文件。只是Java虚拟机在加载jar包的时候只关注class文件和元信息。
jar包虽然已.jar命名作为后缀,但实际上是zip格式的,zip解压工具都能解压,建议解压出来看看里面都有什么东西。

4,你看过的很多资料都说非public类不可以被包外使用,但可以被包内引用,这是错的,要么你看的资料是错的,要么是你理解错了。
Java的访问权限总共分四种public, protected, default, private,除了public,其实protected也可以被包外访问(用在继承的时候),这里的包指的是package。default和private只能被包内使用。

建议过一过Java基础。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题