![848153880b8b92fb07e4cc24a9a46a62.png](https://img-blog.csdnimg.cn/img_convert/848153880b8b92fb07e4cc24a9a46a62.png)
命名空间
包名
Java代码里面的类写多了,自然会遇到重名的问题,尤其是涉及到多人协作的时候。比如,两个人都想给自己的类命名为“Apple”,那么第三个人调用“Apple”这个类的时候,到底调的是哪个呢? 这就是命名冲突,Java给出的解决方案是引入包名,也就给类名加个前缀,如:com.Demo2。Demo2类的包名就是com,类名和包名之间用点号隔开。这时候“类名”就有了两个不同版本的叫法:全限定类名和非限定类名。前者指的是加上前缀之后的全名,后者就是平时所说的类名,也就是class关键字后面的名字。语法上,使用package关键字来单独声明包名,而不是将全限定类名放在class关键后面。如下所示:
package com;
class Demo {}
那么,类Demo2的全限定类名就是com.Demo2。有了前缀,就不怕冲突了,两个重名的类,只要他们的前缀不一样,也就是全限定类名不一样,就不会引起冲突。当然,引用的时候,需要写入全限定类名,而不是之前的“简称”。前缀,也就是包名,给了类一个安全的命名空间,只要在这个空间内没有重名就好,其余的事情让包名去考虑。在java的规范中,包名需要全部小写。
包的层次
如果包名也重名了怎么半?当然,理论上讲,包名可以做到不重名。26个英文字母随意排列组合,而且长度也可以无限扩大,怎么着都能组装出一个不同的包名。然而可以想象的是,随着类的无限增加,这个包名也会跟着不断增长,而且随意排列的名称也越来越没有意义。这显然不是我们想要的,于是设计者给包名添加了层级结构,类似于文件系统的目录树,包下面还可以有子包,各级之间的包名也用点号隔开。这样以来,问题也就解决了:当给一个类起了一个喜欢的包名,发现被别人占用了,那么给它加一个“父包名”;如果“父包名”也冲突,重复刚才的步骤,直到没有冲突。实际上,设计者建议使用公司层级倒序的域名作为包名,域名在世界范围内几乎是唯一的。
默认权限
默认权限其实指的就是包权限。当声明一个类时,若class关键字前没有任何访问权限修饰符,那么这个类默认的可访问权限就是包权限,即它只能被同一个包下的类访问,不是同一个包的类无法访问到它。 将类Demo2的包名声明为com2,如下:
package com2;
class Demo2 {
public static int a = 9;
p