一、包
1、作用:
对类文件进行分类管理;
给类提供多层命名空间;
也为了避免类重名;
2、包的定义:
package,要放在源文件的第一条语句;
包名所有的字母都小写;
注意:有包名后,编译运行时要把包名带上;类的全名是必须要带包的;否则就是错误的类名;如果不带报名,编译时不会出错,但是运行时会抛出错误NoClassDefFoundError,即错误的类名;
包的目录和文件夹目录是一样的;
编译运行格式:包名.文件名.java
如果没有包,在编译时加一些参数可以自动生成包文件;
javac–d 指定包的目录,或者新建目录;如javac –d c:\......
javac –d 源文件名,不带包,它就会自动把包生成出来;
点表示当前目录里,在创建包时,可以简写
编译时,或者指定classpath时,只需指向包的父目录即可;
当制定包文件后,运行后就无法运行,因为类文件不在当前目录;所以就需要指定classpath路径(包的父目录),即可。
1、源文件中带上包后,类名就必须要把包加上,否则时错误的类名,会报错NoClassDefFoundError不是例外;(正确的类名格式是:父包与子包之间用点号分隔)
2、编译时,必须要指定到源文件,在当前目录编译或者通过斜杠指定都可;(所有的地方都用斜杠分开,到最后源文件也是,特别发现在指定目录时,斜杠和反斜杠没有区别),
D:\>javac e:/equip/practice/package_import.java
E:\>javac e:/equip/practice/package_import.java
至于现在在什么目录不重要,只需要保证源文件名称和指定地址正确即可;
3、运行时,只能在带包的类名的父目录下进行,其他地方找不到文件,如果没包,就默认当前目录;如果在别的地方,可以通过设置classpath也可以;(注意类名的正确性)
编译时,设不设classpath没有任何影响,那是对类文件而言的;
(记住,运行只有两种途径,要么在当前目录,要么在classpath指定的目录;别无他法;)
4、通过命令行javac -d命令创建目录,只需要指定源文件的目录位置即可按照源文件的包目录创建目录;
E:\ >javac -d d:\ e:/equip/practice/package_import.java
D:\>javac –d d:\ e:/equip/practice/package_import.java
或者在当前目录下直接创建也可以,就不需要指定前面的包目录了
3、不同包之间的类,该如何进行访问呢?
在源文件中加了包之后,范围变大,一个包中的类要被访问,就必须要有足够大的权限,所以被访问的类要被public修饰;
类公有后,被访问的成员也要公有,才可以被访问;
即不同包的文件,默认的权限时不够的;默认权限只限同包;
包也是一个封装形式,如果一个包中有十个文件,只有一个公有,其他九个文件,其他的包也访问不了,只设置一个公有包提供访问;
不同包之间的文件要进行继承时要注意,继承的类要带上包名,或者构建对象等都要带上包名;也就是不同的包之间的文件,只要时公有的,都是可以访问的,构建实例等都可行;
总结:包与包之间进行访问,被访问的保重的类以及类中的成员,需要public修饰;
不同包中的子类,还可以直接访问父类中,被protected权限修饰的成员;
权限问题:
包与包之间可以使用的权限:public protected;
public protected default private
同一个类中 ok ok ok ok
同一个包中 ok ok ok
子类 ok ok
不同包中 ok
注意:在继承的覆盖中,子类的活动权限一定要大于等于父类的活动权限才行;因为要保证父类调用的属性,子类能调用到才行,否则无法覆盖;
一个源文件里面,不可以出现两个以上的公有类或者公有接口,因为要和源文件名字相同;
二、import
为了简化带包名的类名的书写,就使用import关键字导入包中的类文件;再写类名的时候就不需要再带包名写类了;
格式:import aa.bb.cc.dd.Demo;导入指定的类文件;(都用点作为分隔符;)
或者使用一个通配符*;导入该包中的所有的类文件;
格式:import aa.bb.cc.dd.*;只表示导入该包中的类,不包括子包中的类文件;
建议:
一般情况下,不要写通配符*,需要用到包中的哪个类,直接就导入哪个类即可;因为只用一个类,而把所有的类都导入了,比较占用内存空间,不高效;
注意:当导入不同类出现重名时,这个类必须要加包名;
建议定义包名不要重复,可以使用url来完成定义;因为url时唯一的;
一个程序里面可以不写import的,可以按照全名类书写,写import只为简化书写;