注:本文主要参考自《快学Scala》
Java中的包
在讲这个问题之前,有必要先了解一下Java里面的类和成员变量的访问控制符(本人也有点模糊,顺便复习下)
一.首先说下Java中类的访问控制符:
在Java中类的访问控制符只有public和default两种
public访问控制符修饰的类,可以在所有地方访问(包括当前包,当前包的子包,父包,其他包)
default访问控制符修饰的类,只能在当前包中访问,即便在子包、父包中也不能访问,其他包更不能访问
上述只是结论,下面证明,使用的项目的包结构如下
我们在com.cnblog.scala.test的各级包目录下新建两个类,其中一个类是public访问控制符,另一个类是default访问控制符
命名规则是:当前包的层级+public/default+Class,如com包下面的ComPublicClass.java是public的,ComDefaultClass
是default的
我们首先在com.cnblog.Main.java中查看其对当前包下的类的访问权限
从上图可以看出public和default的类访问控制符在当前包都是可见的
接下来我们测试public和default的类访问控制符对父包限制,我们的做法是在com.ScalaPublicClass.java中进行测试
从上图可以看出父包看不到子包下default访问控制符修饰的类文件,可以看到public修饰的类文件
我们再测试public和default的类文件在子包中的可见性,做法是在com.cnblog.scala.ScalaPublicClass.java中进行测试
通过上图可以看出子包中可以看到父包中的public修饰的类文件,看不到default修饰的类文件
最后我们测试public和default修饰的类文件在其他非子包、父包的类中的可见性,我们的做法是在cn.test.Main中进行测试
从上图可以看出,在一个包中可以看到其他包的public修饰的类文件,看不到default修饰的类文件
综上所述:Java中类的访问控制符有public和default两种。public的访问控制符修饰的类可以在任何地方访问,default修饰
的类只能在当前包自身的类中访问,子包、父包、其他包都不能访问
二.JAVA中成员的访问控制
这里只测试变量的访问控制,方法类比即可
在com.cnblog.CnlogPublicClass.java类中添加如下代码
package com.cnblog; @SuppressWarnings("all") public class CnlogPublicClass { public static String strPublic = "static"; private static String strPrivate = "private"; protected static String strProtected = ""; static String strDefault = "default"; public static void main(String[] args) { } }
性子急的可以直接看结论:
public修饰的成员:在所有地方可见
private修饰的成员:仅在当前类中可见
protected修饰的成员:在当前包(不包含子包和父包)和子类中可见
default:在当前包可见
下面测试:
首先测试当前包下面的类对其他类的成员的可见性,我们在com.cnblog.Main.java中进行测试,如下:
如图可知,一个类的成员对当前包下的其他类的可见性为:default,protected,public的成员可以看到,private看不到
然后测试对子包的可见性,测试方法是在com.cnblog.scala.ScalaPublicClass.java中进行测试
上图可以看到,子包对父包的类成员的可见性为:只能看到public的类成员
父包的表现跟子包一样,不再测试。
最后测试子类对父类的成员的可见性,做法是新建一个类,该类继承自com.cnblog.CnlogPublicClass如下
package cn.test; public class ScalaFieldTest extends com.cnblog.CnlogPublicClass{ public static void main(String[] args) { } }
在该类中输入代码,查看结果
上图可以看出,子类可以看到父类的public和protected的成员,看不到default(在同一包下可以)和private成员
归纳上述实验,就得出入上结论,这里不再赘述。
三、Java的引入-import
Java中的导入都是针对类来说的。
import com.*的意思只是说导入com包下的所有类,没有把“com”包也导入的意思,如有能导入com包,第三行就不会报错了
Java中的支持静态导入-导入一个类的所有静态成员
-----------------------------------------------------------------------------------------------------------------------------------
四.