Java中访问修饰符public、private、protect、default范围
| 同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 |
Private | √ |
|
|
|
Default | √ | √ |
|
|
Protected | √ | √ | √ |
|
Public | √ | √ | √ | √ |
一、权限修饰符修饰外部类的包内包外情况分析:
1、首先能修饰外部类的权限修饰符只有public和default,为什么不能是private和protected呢?
这是因为:我们知道外部类中的成员(成员变量、成员方法、嵌套类等)的上层结构是类,而外部类的上层结构是包。
① 如果外部类使用private修饰,表明该包下的这个类被私有,无法被其它类访问,那就根本谈不上继承、多态这些的特征,因此该类也失去了存在的意义,所以不能使用private来修饰类。而且编译也通不过:Illegal modifier for the class XXX; only public, abstract & final are permitted,意思是:非法修饰符,只允许用 public, abstract,final来修饰外部类。
② 如果外部类使用protected修饰,表示该类所在的包的其它类可以访问该类;或该类所在的包的子包的类可以访问该类,但是包没有继承的概念,所以后一句是不对。所以用protected来修饰外部类也是没有意义的。
综上,类只有public和default修饰可以修饰外部类。
2、default修饰外部类,则该外部类相当于被封装在包内。
包内:该外部类出现在包内的其他类中不需要加包名;
包外:该外部类无法存在于包外的其他类中,即使导包也没用。
3、public修饰外部类,该类不仅能被包内的其他类所访问,也能被包外的其他类所访问。
包内:该外部类出现在包内的其他类中则不需要加包名;
包外:该外部类若想被包外的其他类中所访问,可以在类名前面加上包名,也可以通过import关键字进行导包。
二、权限修饰符修饰成员的包内包外情况分析:
(ps:因为静态成员方法相当于和方法所在类所绑定,可以直接通过方类名去调用,也可以通过方法所在类的对象来调用(相当于非静态方法的调用了)。为了方便,都以权限修饰符修饰非静态成员方法进行分析,权限修饰符修饰成员变量是一个道理,就不浪费空间了)
1、public修饰成员方法
包内:可以在包中任意类中直接创建该方法所在类或子类的对象进行方法的调用;
包外:可以在包外任意类中直接创建该方法所在类或子类的对象进行方法的调用。
2、protected修饰成员方法:最想写的就是这个修饰符,它是专门为子类所提供的一个权限修饰符。
包内:可以在包中任意类中直接创建该方法所在类或子类的对象进行方法的调用;
包外:只能创建该方法所在类的子类的对象进行方法的调用,方法所在类的对象无法进行调用。
3、default修饰成员方法:则该外方法相当于被封装在包内了。
包内:可以在包中任意类中直接创建该方法所在类或子类的对象进行方法的调用;
包外:无法访问该方法。
4、private修饰成员方法:则该外方法相当于被封装在类中了。
包内:仅在方法所在类中可以被访问,包中其他类也无法访问;
包外:无法访问该方法。
小结一下:
① 外部类仅能被public和default修饰。倘若外部类被default修饰则只能在包内中进行访问;被public修饰既能在包内中进行访问也能在包外访问,在包外出现时必须带上包名,否则就导包。
② 成员可以被4中权限修饰符所修饰,由大到小依次为public、protected、default、private。其中该成员若想在包外被调用,则只能用public和protected权限修饰符所修饰。包外:成员被public修饰时,方法所在类的对象和子类的对象都能调用;成员被protected修饰时,只有子类的对象能调用。