《Java编程思想》第6章 访问权限控制

书中源代码:https://github.com/yangxian1229/ThinkingInJava_SourceCode
访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。
访问权限控制的等级,从最大权限到最小权限依次为:publicprotected,包访问权限(没有关键字)和private

6.1 包:库单元

如果你想要导入单个的类,可以在import语句中命名该类。如:
import java.util.ArrayList;
要想导入java.util中的所有类,只需使用“*”:
import java.util.*;
同一个包中,类名相同会冲突。
当编写一个Java源代码文件时,此文件通常被称为编译单元(转译单元)。每个编译单元都必须有一个后缀名.java。而在编译单元内侧则可以有一个public类,该类的名称必须与文件名相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持。

6.1.1 代码组织

当编译一个.java文件时,在.java文件中的每个类都会有一个输出文件,而该输出文件名称与.java文件中每个类的名称相同,只是多了一个后缀.class。Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR,使用Java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找、装载和解释。
类库实际上是一组类文件。其中每个文件都有一个public类,以及任意数量的非public类。
如果使用package语句,它必须是文件中除注释以外的第一句程序代码。Java包的命名规则全部使用小写字母,包括中间的字也是如此。

6.1.2 创建独一无二的包名

按照惯例,package名称的第一部分是类的创建者的反顺序的Internet域名。

6.1.3 定制工具库

静态import语句
import static net.mindview.util.Print.*;

6.2 Java访问权限修饰词

publicprotectedprivate这几个Java访问权限修饰词在使用时,是置于类中每个成员的定义之前的——无论它是一个域还是一个方法。

6.2.1 包访问权限

默认访问权限是没有任何关键字,但是通常是指包访问权限(有时也表示成friendly)。这就意味着当前包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类,这个成员却是private

6.2.2 public:接口访问权限

使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人都是可用的。

6.2.3 private:你无法访问

关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。

6.2.4 protected:继承访问权限

extends(扩展)
protected也提供包访问权限,也就是说,相同包内的其他类可以访问protected元素。

6.3 接口和实现

访问权限的控制常被称为具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。

6.4 类的访问权限

对于类的访问权限只有两个选择:包访问权限或public
1.每个编译单元(文件)都只能有一个public类。
2.public类的名称必须完全与含有该编译单元的文件名相匹配。
3.可以没有public类,这时可以随意对文件命名。
如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象,但是有一个例外,就是你在该类的static成员内部可以创建。下面是一个示例:

package ch6;

import net.mindview.util.New;

class Soup1{
	private Soup1(){}
	//(1) Allow creation via static method;
	public static Soup1 makeSoup(){
		return new Soup1();
	}
}
class Soup2{
	private Soup2(){}
	//(2)Create static object and return a reference upon request.(The "Singleton" pattern):
	private static Soup2 ps1 = new Soup2();
	public static Soup2 access(){
		return ps1;
	}
	public void f(){}
}

public class Lunch {
	void testPrivate(){
	//	Can't do this! Private constructor:
	//! Soup1 soup = new Soup1();
	}
	void testStatic(){
		Soup1 soup1 = Soup1.makeSoup();
	}
	void testSingleton(){
		Soup2.access().f();
	}
}///:~

Soup1Soup2类展示了如何通过将所有的构造器指定为private来阻止直接创建的实例。
Soup1中,创建一个static方法,它创建了一个新的Soup1对象并返回一个对它的引用。如果想要在返回引用之前在Soup1上做一些新的工作,或是如果想要记录到底创建了多少个Soup1对象(可能要限制其数量),这种做法将会是大有裨益。
Soup2用到了所谓的设计模式。这种特定的模式被称为singleton(单例),这是因为你始终只能创建一个对象。Soup2类的对象是作为Soup2的一个static private成员而创建的,所以有且仅有一个,而且除非是通过public方法access(),否则是无法访问到它的。

6.5 总结

控制对成员的访问权限有两个原因。第一是为了使用户不要碰触那些他们不该碰触的部分。第二个原因,是为了让类库设计者可以更改类的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响。

猜你喜欢

转载自blog.csdn.net/lanzijingshizi/article/details/84060844