包名与全限定名
如果说存在于文件系统中的JAVA代码文件就像是一栋栋房屋,那么包路径就是这些房屋门牌号,JVM在扫描classpath下的文件,并将package名+class名拼接作为该类的全限定名(门牌号),格式如packageName.className,路径使用英文半角句号分割。
放代码:
PS E:\opt\applog\learn\scope> Get-Content .\Scope.java
package learn.scope;
public class Scope {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
PS E:\opt\applog\learn\scope> javac -encoding UTF-8 Scope.java
PS E:\opt\applog\learn\scope> java -classpath . Scope
错误: 找不到或无法加载主类 Scope
PS E:\opt\applog\learn\scope> java -classpath . learn.scope.Scope
错误: 找不到或无法加载主类 learn.scope.Scope
PS E:\opt\applog\learn\scope> cd ../../
PS E:\opt\applog> java -classpath . learn.scope.Scope
Hello world
PS E:\opt\applog> java -classpath . Scope
错误: 找不到或无法加载主类 Scope
classpath的作用是指定类文件存在的路径,jvm会扫描这些路径和文件,然而在运行的时候,类名必须使用全限定名,且当前位置一定要是包的根路径,即从当前路径可以根据类的全限定名找到类文件。这也是jvm在保证类名不会重复的手段之一。
经过这次联系,明确了jvm加载类时的路径问题及类的包名对于类的重要性。
访问权限
介绍完包和全限定名,与之相关的访问权限问题就随之而来。JAVA中的访问权限有以下几种
- public
- protected
- 默认(无声明)
- private
public | protected | 默认 | private | |
---|---|---|---|---|
同一个类文件 | 是 | 是 | 是 | 是 |
相同包中子类 | 是 | 是 | 是 | 否 |
相同包中非子类 | 是 | 是 | 是 | 否 |
不同包中的子类 | 是 | 是 | 否 | 否 |
不同包中的非子类 | 是 | 否 | 否 | 否 |
此访问权限规则同样适用于继承时子类访问父类方法的场景