java访问权限控制
为什么java要有访问权限的控制?
访问权限的设置和代码的重构有关。在一个项目中,大多数的时间和金钱都投入到了代码的维护当中。维护中一定会修改已存在的不合理的代码。但是在重构的过程中,就出现了这样的问题:如何保证不影响那些使用了待修改代码的客户端代码的正常使用?如何知道客户端代码已经使用了哪些待修改的代码?这一切就要依靠权限修饰词来实现。通过权限修饰词说明了哪些是客户端代码可以使用的,只要保证这部分代码(我不准确的称之为接口)不变,那么无论内部代码如何改变,都能保证客户端代码的正常使用。
静态导入: import static ,只能导入一个类中静态的成员函数与成员变量
成员函数或者成员变量的访问权限修饰词:
- public:公有访问权限,表示修在任何地方都可以被访问到
- 包访问权限:又叫default访问权限,当一个成员函数或者变量没有被任何修饰词修饰的时候就是包访问权限,表示能够被当前包的所有类访问。有时候也叫friendly。包访问权限可以使当前包内所有相关的类都组合起来,以使他们彼此之间可以轻松地相互作用。当一个类没有通过package关键字显示指出所处的包时,他就属于默认包。
- private:私有访问权限,表示除了在该类能够被访问之外,其他所有地方都不能被访问。通过private关键字修饰构造函数可以控制如何创建对象,或者控制创建对象的数量
class A { private A(){} public static A getA() { return new A() ; } }
4. protected:继承访问权限,表示可以被当前包,以及该类的子类访问。
接口与实现:
访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类,以及具体实现的隐藏常被称为”封装“。其结果是一个同时带有特征和行为的数据类型。
处于两个很重要的原因,访问权限控制的边界划在数据类型的内部。第一个是要设定客户端程序员可以使用和不可以使用的界限。可以建立自己的内部机制,而不用担心客户端程序员会把内部机制当作是他们可以使用的接口的一部分。第二个原因,即将接口和具体实现进行分离。(说实在的,这部分没有看懂,尤其是边界划在数据类型内部,这句很疑惑。)
类的访问权限:
- public 访问权限
- 包访问权限,解释同上
正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。(一定要记住,相同目录下的所有不具有明确package声明的文件,都被视作是该目录下缺省包的一部分。)然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象
初看这一段话,很是费解,为什么一个包访问权限的类,能够有public static类型的成员可以在外包被访问。于是上网询问,经过一位前辈的指点,终于明白了什么意思。
在这段话之前还有一个例子:
//: c05:Lunch.java // Demonstrates class access specifiers. Make a class // effectively private with private constructors: class Soup { private Soup() {} // (1) Allow creation via static method: public static Soup makeSoup() { return new Soup(); } // (2) Create a static object and return a reference // upon request.(The "Singleton" pattern): private static Soup ps1 = new Soup(); public static Soup access() { return ps1; } public void f() {} } class Sandwich { // Uses Lunch void f() { new Lunch(); } } // Only one public class allowed per file: public class Lunch { void test() { // Can't do this! Private constructor: //! Soup priv1 = new Soup(); Soup priv2 = Soup.makeSoup(); Sandwich f1 = new Sandwich(); Soup.access().f(); } }
这段话中所说的public static所指的就是
public static Soup access() { return ps1; }
可以调用该static成员,尽管他们并不能生成该类的对象,之所以不能生成该类对象,是由于构造函数私有,而且访问是同一个包。
具体问题地址:http://segmentfault.com/q/1010000002549128
//thinking in java笔记,如果有不对的地方,还望指正^_^