`

[#0x0004] 关于class和class member的访问权限

    博客分类:
  • Java
EXT 
阅读更多

1. class的访问权限

 

  class的访问权限只有public和package两种,不存在private和protected(内部类是特例)。
  每一个编译单元(即.java文件)至多只能有一个public class,且如果有的话,该public class名必须与文件名相同。
  class访问权限是member访问权限的基础。

2. member的访问权限


  当一个class是可访问的时候,member的访问权限才有意义。
  private、package、protected、public,具体的就不详细说了。
  protected包含package权限。

 

7月27日补充:member的访问权限是针对类而言的

  public: 对所有类可见。

  protectd: 对其Ext Class可见 + package。

  package: 对同一pkg内的类可见。

  private: 仅对member所在的类可见。

  我们这里说的都是Class,而不是Object。有时候在理解上会有这样的混淆:

class Test
{
	private int i;
}

public class PrivateTest
{
	public static void main(String[] args)
	{
		Test t = new Test();
		System.out.println("i = " + t.i); // syntax error
	}
}

  我们的确是获得了Test对象t,i也的确是t的member,不过我们访问i是在PrivateTest类中,根据private的定义,这里依旧是会出错。

  所以说,member的访问权限是针对类而言的,而不是针对对象。不能单纯地以为只要获得了对象(引用),就能随便访问对象中的所有成员。

 

10月10日补充:可见的意思

  如果类A的字段i对类B可见,则在类B中可以通过类的对象引用(假设有A a = new A();)(如果是static字段,则是通过类名)来访问字段i,即:可以在类B中直接写a.i(如果是static字段,则是可以写A.i)。

  那么,我们现在回头看,如果类A的字段i是:

  public: 对所有类可见            --> 即:所有的类中都可以写a.i或是A.i

  protectd: 对其Ext Class可见 + package  --> 即:只有与类A同包的类,或是类A的子类中可以写a.i或是A.i

  package: 对同一pkg内的类可见       --> 即:只有与类A同包的类中可以写a.i或是A.i

  private: 仅对member所在的类可见     --> 即:只有类A本身可以直接用a.i或是A.i

 

  这里又涉及到另外一个问题,即我自己常用的表达:private、package不可继承。其实这里private、package权限字段是由于对子类不可见所以不能继承。[#0x0006]里面的那个理解很好:可以理解为ext class隐式包含一个base class,base class根据member的访问权限决定是否将member暴露给ext class。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics