一流的小说家和三流的小说家都会写小说,但两者有本质上的区别。前者的语言流畅,善于运用贴切的修饰词汇来渲染主题;而后者的语言苍白无力,不能鲜明准确地反映主题。例如,从下面3 段文章可以看出,使用修饰符会产生不同的效果。
同样,在Java 语言中也提供了一些修饰符,这些修饰符可以修饰类、变量和方法。灵活正确地运用这些修饰符,会使软件程序最贴切地模拟真实世界的系统,并且有助于提供软件系统的可重用性、可维护性、可扩展性和系统的运行性能。
面向对象的基本思想之一就是封装实现细节并且公开接口。Java 语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而只向使用者暴露接口,但隐藏实现细节。一个Java 应用有很多类,但是有些类,并不希望被其他类使用。每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用。如何能做到访问控制呢?就需要使用访问权限修饰符。
Java 常用的权限修饰符有4 种:public(公共的)、protected(受保护的)、default(默认的,就是类成员什么修饰符也没有的时候)、private(私有的)。这4 种权限修饰符的访问限制见表4.1。
表4.1 权限修饰符的可访问级别
表4.1中的“√”表示可以访问,“×”表示不能访问。不在同一个包中的子类,可以继承父类中的protected 成员方法和成员变量。
1.private(私有的)
private 修饰符可以修饰类的数据成员和方法成员,不可以修饰类本身和接口。private 修饰符可以使被它修饰的对象不被类以外的任何代码访问,换句话说,就是对外隐藏它所修饰的成员。从外面看来,类的内部好像根本不存在该private 成员一样,无论是想通过类或实例对象进行直接访问,或者是试图以继承的方式来接触private 成员,都是不可能的。因此,只有在该类中可以自由访问该成员,一旦出了该类的范围,进入一个同包的继承子类、或者一个包外的继承子类,或者其他的类,该成员就变得不可见。
2.default(默认的)
一个被修饰对象没有修饰符修饰它的时候,并不表明它真的没有修饰符,而说明它此时带了一个“默认修饰符”。默认修饰符可以修饰类的数据成员、方法成员以及类本身和接口。默认修饰符所规定的被访问范围比private 稍大一些,在一个包的类里可以访问。(www.daowen.com)
当一个默认修饰符修饰一个类成员时,表明该成员可以在同属一个包的某个类里被自由访问,无论这个类是通过直接访问的方式或者是通过继承的方式来访问该成员。但是,一旦出了这个包,这个类成员就变得不可见了。也就是说,在非同一个包的某个类里面,获得一个该类的实例,通过这个实例是访问不到被默认修饰符修饰的该类的成员的;另一方面,如果非同一个包的某个类继承了该类,它同样无法访问该类(也就是其父类)的任何被默认修饰符修饰的成员。
当一个默认修饰符修饰一个类或接口的时候,表明它只可以被包内的其他类继承或(实例化)使用,而对于包外的任何类,它都是不可见的,因此就不能继承该类或者使用该类或者实现该接口。后面会说到,要使一个类能被包外的类所继承或(实例化)来使用,一定要在class 关键字前面加上public 访问修饰符。
3.protected(受保护的)
提到protected 修饰符,就一定要想到继承的情况,因为protected 关键字就是为了这种情况而创造的。protected 修饰符可以修饰类的数据成员、方法成员,但不能修饰类本身和接口。protected 修饰符修饰一个类的成员的时候,它所提供的被访问范围会比默认修饰符大一些。主要表现在下面的这种情况:非同一个包的某个子类继承了该类,将其作为父类的时候,虽然父类的默认修饰符修饰的成员对于子类不可见,但是此时被protected 修饰符修饰的父类成员对子类来说却是可见的。
4.public(公有的)
public 修饰符可以修饰类的数据成员和方法成员,以及类本身和接口。public 修饰符将提供最大的被访问范围。
一个被public 修饰符修饰的类成员可以在任何其他类内被自由访问,不管该类是不是同一个包的,也不管该类是直接访问或者通过继承的方式来访问。
一个被public 修饰符修饰的类或接口可以被同一个包或非同一个包的其他类自由继承和使用。
一个覆盖其父类方法的子类方法的访问修饰符只能保持或扩大该方法的被访问范围,而不能使之缩小。举例来说,如果父类里有一个被默认修饰符修饰的method()方法,则继承它的子类如果能访问该父类方法并且需要覆盖该方法的时候,它的修饰符就不可以是private,因为这样会缩小该方法原先的被访问范围,其他的访问修饰符将都是可以的。
在一个子类内部能够访问一个父类方法是覆盖该父类方法的一个必要前提。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。