Concept
Java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符控制权限来向使用者暴露接口,但隐藏实现细节。
默认访问权限没有任何关键字,但通常是指包访问权限。这就意味着当前的包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类,这个成员却是private。
如果两个文件同处于相同的目录并且没有给自己设定包名称,Java会把这样文件自动看成是隶属于该目录的默认包中,于是它们为该目录中所有其他的文件都提供了包访问权限。
public
-
使用关键词public,就意味着public之后紧跟着的成员声明了自己对每个人都是可用的,尤其是使用类库的客户程序员更是如此。
-
如果一个顶层类使用public修饰,那该类的类名必须与他所在的源文件名相同。一个.java源文件中有且只有一个public顶层类。
-
方法和属性前有public修饰,可以被任意包内的类访问。如果类想被其他类导入,必须声明为public。
private
-
关键词private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员,同一个包内的其他类也不可以。任何可以肯定只是该类的一个“助手”方法的方法,都可以把它指定为private,以确保不会在包内的其他地方误用到它,于是就防止了你会去改变或删除这个方法。
-
private允许你随便改变该成员,而不必考虑这样做是否会影响到包内其他的类。
-
声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问。
-
有时可能希望将一个计算代码划分成若干个独立的辅助方法。通常,这些辅助方法不应该成为公有接口的一部分,这是由于它们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别调用次序,最好将这样的方法设计为private。
-
对于私有方法,如果改用其他方法实现相应的操作,则不必保留原来的方法。如果数据的表达方式发生了变化,这个方法可能会变得难以实现,或者不再需要。然而,只要方法是私有的,类的设计者就可以确信:它不会被外部的其他类操作调用,可以将其删去。如果方法是公有的,就不能将其删去,因为其他的代码很可能依赖它。
protected
- 关键词protected处理的是继承的概念。如果创建了一个新包,并自另一个类中继承类,那么唯一可以访问的成员就是源包的public成员。有时,基类的创建者会希望有某个特定成员,把对它的访问权限赋予派生类而不是所有类,这就需要protected。protected也提供包访问权限,也就是说,相同包内的其他类可以访问protected元素。
- protected修饰的成员变量和方法可在本类或同一个包中的其他类(包括子类)通过类的实例进行访问,也可以被同一个包中的类或不同包中的类继承,但是不能在不同包中的其他类(子类)通过类的实例进行访问。
Conclusion
-
顶层类只能用public或者没有任何修饰符修饰,其中无修饰符的类不能被其他包内中的类继承,这也说明无修饰符突出的是包权限。
-
方法继承规则:1.父类中声明为public的方法在子类中也必须为public。2.父类中声明为protected的方法在子类中要么声明为protected,要么声明为public,不能声明为private。3.父类中声明为private的方法,不能被继承。
-
取得对某成员的访问权的唯一途径是:1.使该成员成为public。于是,无论是谁,无论在哪里,都可以访问该成员。2.通过不加访问权限修饰词并将其他类放置于同一个包内的方式给成员赋予包包访问权,于是包内的其他类也就可以访问该成员了。