一、public、protected、default、private四种权限修饰符的区别
public:具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。
protected:主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西
default:有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
private:访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。
注意:java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。
- public:可以被所有其他类所访问
- protected:自身、子类及同一个包中类均可以访问
- default:同一包中的类可以访问,声明时没有加修饰符,认为是friendly
- private:只能被自己访问和修改
二、Java的外部类为什么不能使用private、protected进行修饰
对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。
为什么是这种情况呢?可以想一下,一个java项目是不可能在一个class里面完成的。mvc模式中,是把类分为三层,一层层调用类。如果定义为私有的和受保护的就无法调用。换句话说,对于一个java文件,要么就是自己单独运行,要么就是被其他程序作为库调用,如果一个java文件的类被private修饰,那么是不是其他的程序或是类是无法使用它的,那么他作为一个单独的文件就没啥用了。如果它作为单个文件运行,类加载怎么找到它呢,因为它对外不可见。同时,也失去了类的存在意义。因此,类只有public和默认修饰符。
如果类使用了private修饰符,说明是个内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。当一个内部类使用了private修饰后,只能在该类的外部类内部使用。
三、private能否修饰class?
private只能修饰内部类。
//外部类
public class OuterClass { //内部类 private static class InnerClass { public static void doSomething() { System.out.println(“我是内部类的方法。"); } public static void main(String args[]){ System.out.println("我是内部类的主方法main()"); } } //外部类主方法 public static void main(String[] args) {
//在外部类中调用内部类的方法 InnerClass.doSomething(); } }
public class OutClass { /** * 内部类 */ private class InnerClass{ public void doSomething(){ System.out.println("我是内部类的doSomething()方法"); } } public void todo(){ System.out.println("我是外部类的todo()方法,调用内部类的doSomething()方法-----"); new InnerClass().doSomething(); } } class Test{ public static void main(String[] args) { new OutClass().todo(); } }
本博客部分内容转载自CSDN 作者:yangyongUestc 原文:https://blog.csdn.net/yangyong0717/article/details/78379760