权限修饰符
一、 针对类
类有两个可以使用的权限修饰符:
- 默认值(不写),此时只有同一包下的类才可以使用和继承该类,其它包下的类不能使用该类也不能继承该类
- public,此时可以在任意类中使用该类或者继承该类
比如,有以下三个类:
- package a
- class ADefault
- public class APublic
- package b
- public class BPublic
则:
- 类
APublic
和ADefault
可以相互访问,因为它们在同一个包下 - 类
BPublic
只可以访问类APublic
,不可以访问类ADefault
,因为类ADefault
的权限修饰符不是public
二、 针对变量和方法
变量和方法有四个可以使用的权限修饰符:
- private
- 默认
- protected
- public
此时,分为以下两种情况:
-
在同一包下时:
-
private:被修饰的成员变量和成员方法只有当前类可以调用,其它类即便是子类也不可以调用
-
默认、protected、public:被修饰的成员变量和方法可以被本包下的任意类调用,子类可以不实例化对象直接调用,非子类需要通过实例化对象调用
-
-
在不同包下时(前提是类必须被
public
修饰):- private:其它包中的类即便是子类也不可以调用被修饰的成员变量和成员方法
- 默认:其它包中的类即便是子类也不可以调用被修饰的成员变量和成员方法
- protected:仅限其它包中的子类调用被修饰的成员变量和成员方法,并且仅支持直接调用或通过
super
关键字调用,不可以通过实例化对象的方式使用 - public:其它包中的任意类都可以调用被修饰的成员变量和成员方法,子类可以不实例化对象直接调用,非子类需要通过实例化对象调用
三、 笔/面试题
-
问:访问权限修改符排序
答:private < 默认 < protected < public
-
问:A包下面有个类A和类C,B包下面有个类B(类B有个protect属性X),类C继承类B且为对X进行覆盖或重写,类A是否可以访问类C中的X?
答:类C继承了类B中的属性X,但并未对X进行覆盖或重写,因此X本质上还是属于类B,而类B和类A不属于同一个包且无继承关系,因此类A无法访问类C中的X。