java中,
类的权限有两种:
- 包访问权限
- public
数据成员的权限有四种:
- public
- protected
- default(缺省)
- private
注意,类的权限不可以是
private
(这会使得除了该类外,其他任何类都不可以访问它),也不可以是protected
。
一、类的权限
在说类之前,先明确一下编译单元的概念,一个java源文件就算作一个编译单元。
包访问权限 < public权限。拥有包访问权限的类,对同一个包内的其他类,可以看做表现为"public",
而对包外部的类,则可以看做表现为"private"。
包访问权限
在写了一个java源文件后,可以在它的开头加上package <包名>
来将它划分到指定包。
如果不指定,那么它就划分为默认包,可以认为它的包名为""
,也即是空。
在创建一个类后,如果不加访问控制符,那么这个类就拥有包访问权限。
拥有包访问权限的类,能被同一个包内的其他类访问,但不能被包外部的代码访问。
不指定包名,则源文件属于默认包(即不指定包名),且是当前目录的默认包。位于相同目录的源文件,如果不指定包名,则属于同一目录的默认包,默认包为同目录的所有其他文件提供了包访问权限。
举个例子:
//Animal.java
package com;
class Animal{
public Animal(){
}
}
这里的Animal
类所在文件指定了包名com
,所以它属于包com
。
它的class
前没有权限控制符,所以它拥有包访问权限。
此时如果com
中有另一个类Dog
:
//Dog.java
package com;
class Dog{
Animal dog;
public Dog(){
dog = new Animal();
}
}
那么它可以访问到这个类,因为Animal
有包访问权限。
public
继续上面的例子,如果有另一个类不在com
中,如:package net
,那么这个类中无法访问到Animal
。
如果想要访问,则需要在class Animal
前加上public
,此时Animal
不再局限于包访问权限,它既可以被包内的其他类访问,也可以被外部的类访问。
二、数据成员权限
public
- 所有类(同包的其他类、外部的类)都可访问。
protected
- 继承类(
extends
)可以访问,但是其他类不能访问。
- 继承类(
- 包访问权限(什么都不写)
- 类自己和同包的类可以访问。
private
- 只有该类自己可以访问,其他类(包括同包的其他类)都不可以。
三、补充
- 一个java源文件只能有一个
public
类,可以有多个拥有包访问权限的类。 public
类的名字必须与源文件名前缀相同,大小写也要一样,否则会编译出错。- 如:
public class LittleDog
,则源文件必须为LittleDog.java
- 如:
- 包名一般全部都小写。
- 包名必须与其放置的系统的目录(文件夹)对应,否则使用时会运行时报错:找不到类(哪怕这个类就在相同的目录下)。
- 如一个源文件指定了
package com.dog;
,则它必须位于com/dog/
的路径下。 - 检验是否是由于路径放置错误的一个方法是将
package xxx;
去掉再运行,如果可以运行,那么说明是 包名和目录路径不对应 导致的错误。
- 如一个源文件指定了
四、总结
在查看一个权限时:
- 首先看类的权限,判断是否对包外部可见:
- 若为
public
,则外部可以访问;- 再看类内数据成员的访问控制符,
- public
- 所有人都能访问
- protected
- 继承类可访问。
- 包访问权限
- 类自己和同包的类可以访问。
- private
- 只有该类能访问。
- public
- 再看类内数据成员的访问控制符,
- 否则不能,结束判断。
- 若为
参考书籍:
- [1] Eckel B. Thinking in Java[M]. 4. 机械工业出版社, 2018年1月 :109,124.