OOP-封装

来源:互联网 发布:韩版硅胶手表淘宝 编辑:程序博客网 时间:2024/06/06 05:46

封装这种OOP的原则是:保护对象需要确保安全的部分,只暴露对象可以安全暴露的部分。

Java支持通过访问控制来进行封装,访问控制由访问控制修饰符来管理。Java中有四种访问控制修饰符:public、protected、private、缺省访问控制级别。访问控制修饰符可以应用到类或者类成员中。

在有很多类的应用程序中,类可以实例化,并通过同一个包或者不同包的其他类成员使用。在类的开头使用一个访问控制修饰符,就可以控制能从哪些包调用你的类。

package app04;/* * 类可以有public类或者缺省访问控制级,使用public访问控制修饰符,这个类就是公共的, * 没有访问控制修饰符声明的类具有缺省访问控制级。 * Book类是公共的,因此他可以从其他类实例化。 */public class Book {    String isbn;    String title;    int width;    int height;    int numberOfPages;}

一个Java源文件只能包含一个公共类,但可以包含多个非公共类。

公共类必须存在于和类同名的文件中,扩展名必须是java。上边中的Book类必须保存在Book.java文件中。并且Book.java文件必须在app04目录下。

package app04;/* * 缺省访问级别的Chapter类 * 具有缺省访问级别的类只能被同一个包中的其他类使用。例如,Chapter类可以从Book类 * 的内部实例化,这是因为Chapter类和Book类属于同一个包,但是从其他包是看不到Chapter类的。 */class Chapter {    String title;    int numberOfPages;    public void review() {        Page page=new Page();        int sentenceCount=page.numberOfSentences;        int pageNumber=page.getPageNumber();    }}

可以将下面的getChapter方法加入Book类中:
Chapter getChapter() {
return new Chapter();
}
如果将同样的getChapter方法加入不属于app04包的类中,就会产生编译错误。

类成员(方法、域、构造器等)访问控制修饰符:

public访问控制修饰符用于使类成员公开化;
protected修饰符也是使类成员公开化;
private修饰符则是使类成员私有化;
没有任何访问控制修饰符的成员将具有缺省访问级别,有时也称包私有(packageprivate)

访问级别 其他包中的类 同一包中的类 子类 同一类 public 是 是 是 是 protected 否 是 是 是 缺省 否 是 否 是 private 否 否 否 是

能访问公共类的其他任何类都可以访问该公共类包含的类成员。

例如:
java.lang.Object类中的toString方法是公共的,
public String toString()
一旦构造了Object对象,就可以调用它的toString方法,
Object obj=new Object();
obj.toString();

package app04;/* * protected类成员的访问级别更加严格,他只能从下面的类中进行访问: *  和包含该成员的类在同一个包中任何类 *  包含该成员类的子类 */public class Page { //Page类为public级别,可以从任何其他的类型中实例化    int numberOfSentences=10;   //缺省访问级别,允许同一个包中的类访问    private int pageNumber=5;   //private,只允许从同一个类的内部进行访问    protected int getPageNumber() { //getPageNumber方法为protected级别,可以被任何属于app04包的类访问        return pageNumber;  //pageNumber的访问仍然是private的,因此其他任何类都不能修改这个域,但是允许把他作为一个非private方法的返回值    }}

UML类图中可以包含类成员访问级别信息。
Manager_UML

Public成员前面加前缀+,
protected成员前面加前缀#,
private成员加前缀-,
没有前缀的成员看作具有缺省访问级别。

构造器的访问级别与域和方法是一样的。有些构造器设计成private的,以便让他们的类不能用关键字new实例化。private构造器通常使用在单例(singleton)类中。

0 0