Java中的修饰符

第一步我们首先需要知道java中有两类修饰符,一种是访问修饰符,一种是非访问修饰符,访问控制符有default,private,public,protected四种,非访问控制符有static,final,abstract,synchronized等,下面是访问修饰符的权限范围,如下图所示:

Java中的修饰符
注意:这个图有一个小纰漏,下图已经修正:

Java中的修饰符
第二步我们来看一下私有访问修饰符private,它只能被当前类访问,常用于私有变量,然后通过set,get方法进行封装,如下图所示:
Java中的修饰符
第三步我们来看一下公有访问修饰符public,它能被当前类,同一包内,子孙类,其他包访问,常用于方法,类的修饰,如下图所示:
Java中的修饰符
第四步我们看一下protected修饰符,它能被当前类,同一包内,子孙类访问,需要注意的是protected修饰符不能修饰类和接口,只能修饰方法和变量,如下图所示:
Java中的修饰符
第五步我们看一下默认的修饰符default,也就是不使用任何修饰符关键字,它能被当前类,同一包类访问,如下图所示:
Java中的修饰符
第六步最后我们看一下非访问修饰符的static,final,abstract,synchronized

,static主要修饰静态变量,方法,final和static结合使用,创建常量,abstract修饰抽象方法和变量,synchronized修饰后只能被一个线程访问,如下图所示:
Java中的修饰符

重要总结:通过上面的分析,我们可以看到:
   1. 顶层类只能用public访问修饰符和default(默认)访问修饰符修饰,其中用默认修饰符修饰的类(及没有任何修饰符的类,如class B{})不能被其他包中的类继承,这也说明了default(默认)访问修饰符突出的是包权限
   2. protected:不同包的子类中,new一个父类对象,并用该父类对象去访问父类中的用protected修饰的类属变量和方法时不能访问,而new一个子类对象时,子类对象可以访问(说明protected修饰的类可以被其他包中的类继承)。也可以在子类重写父类的方法中使用super关键字调用。这岂不是和上面表格中的总结(红色对勾)冲突了?本人也是百思不得其解。最后在网上找到了一个相对比较认可的解释,如下:    
  protected修饰符的修饰的成员变量和方法也称为受保护的成员变量和方法, 受保护的成员变量和方法可以在本类或同一个包中的其它类(包括子类)中通过类的实例进行访问,也可以被同一个包中的类或不同包中的类继承,但是不能在不同包中的其它类(包括子类)中通过类的实例进行访问。
  3. 如果一个类使用public修饰,那该类的类名必须与他所在的源文件名相同。一个.java源文件中有且只有一个public类,顶层类只能用public和默认修饰符(即无修饰符)修饰
  4. final修饰的类不能被继承,没有子类。
  5. abstract修饰的类不能被实例化,必须被子类继承。类只要有一个抽象方法就必定是抽象类,但抽象类不一定要有抽象方法。

最终总结,就一句话:**protected修饰符所修饰的类(这句话中指父类)属成员变量和方法,只可以被子类访问,而不管子类是不是和父类位于同一个包中。**default修饰符所修饰的类属成员变量和方法,只可被同一个包中的其他类访问,而不管其他类是不是该类的子类。protected属于子类限制修饰符,而default属于包限制修饰符。