Skip to content
**限定符**

public, protected和private:用于控制对类、方法和变量的访问。

限定符static:用于创建类方法和类变量。

限制符final:用于固定(finalize)类、方法和变量的实现。

限制符abstract:用于创建抽象的类和方法。

限制符synchronized和volatile:用于线程。

要使用限定符,可以将其对应的关键字放在要限定的类、方法或变量的定义中。限定符位于语句的最前面,如下例所示:
public class RedButton extends javax.swing…

在一条语句中使用多个限制符时,它们的顺序无关紧要,只要位于要限定的元素之前即可。不要将方法的返回类型(如void)看作限定符。返回类型必须位于方法名前面,且在返回类型和方法名之间没有限定符。
限定符是可选的。

**控制对方法和变量的访问**
通过控制访问,可以控制其他类将如何使用您的类。类中的有些变量和方法只能在该类中使用,应对与该类进行交互的其他类隐藏它们。这被称为封装:对象控制外部世界对它的了解程度以及如何 与它进行交互。

封装防止类中的变量被其他类读取或修改。只能通过调用该类的方法来使用这些变量。Java语言提供了4种级别的访问控制:
1。默认:不使用限定符。则它们对于同一个包中的其他任何类都是可用的。Java类库被组织成包,如java.swing和java.util,前者是一系列窗口类,用于图形用户界面编程,后者包含大量的实用工作类。对于变量,同一个包中的其他类都可以读取和修改它;对于方法,同一个包中的其他任何类都可以调用它。除此之外,其他任何类都不能以任何方式访问这些元素。
2。私有:这种变量仅在其所在的类中是可见的。私有实例变量可被其所属类中的方法使用,但不能被其他任何类的对象使用。私有方法也可被其所属类中的其他方法调用,但不能被其他任何方法调用。这种限制也会影响继承:任何私有变量和私有方法都不能被子类继承。私有方法在以下两种情况下还有用:

其他类没有理由使用该变量时;

其他类以不合适的方式修改该变量将带来严重的后果。

使用private限定符的一个优点是,可以修改类的实现,而不影响使用它的用户。
3。公有:类变量通常被声明为仅有的。使得方法或变量可供其他任何类使用。
4。受保护:方法和变量仅供以下类使用:子类和同一个包中的其他类。


如果想让子类更容易实现,这种级别访问控制将很有用。您的类可能使用一个方法或变量来帮助完成其任务。由于子类继承了大多数相同的行为和属性,因此它也可能需要完成同样的任务,保护控制让子类能够使用助手方法或变量,同时防止无关类使用它们。

**访问控制和继承**
当您创建子类并覆盖方法时,必须考虑原来方法的访问控制。
覆盖方法时,新方法的访问控制不能比原来的方法更严格,但可以更松。
下面是一些用于继承方法的规则:

在超类中被声明为公有的方法在子类中必须也是公有的;

在超类中被声明为保护的方法,在子类中可以是保护的或公有的,但不能是私有的;

对于没有访问控制的方法,在子类中其访问控制可以更严格。

被声明为私有的方法根本不能继承,因此上述规则 不适用。

**存取器方法**
在很多情况下,对于类中的实例变量能够存储的值可能有严格的限制。例如zipcode变量,在美国,邮政编码必须是5位数。
为防止外部类错误地设置变量zipCode,可以将它声明为私有的:
private int zipCode;
然而,其他类必须能够设置zipCode变量时,又该怎么办呢,在这种情况下,可以让其他类通过存取器方法来访问该私有变量。存取器方法因对某些内容的存取权限而得名,如果不通过存取器方法,将无法访问这些内容。通过使用方法来提供对私有变量的访问,可以控制该变量将如何 被使用。

通常,有分别用于读取和设置变量的存取器方法。读取方法的名称以get开头,而设置方法的名称以set开头,如setZipCode(int)和getZipCode(int)。

这种约定有一个例外:如果访问的变量为布尔变量,存取器方法将不以get打头,而以is打头。
使用方法来访问实例变量是一种常用的面向对象编程技术。这提高了类的重用性,因为它可以防止变量被不正确地使用。

**静态变量和方法**
要访问类变量和类访问,可以使用类名和变量(方法)名,并用句点将它们连接超来,如color.black和Circle.pi;也可以使用类的对象名,但对于类变量和类方法而言,使用类名更好,这样变量或方法的类型将更清晰。对于实例变量和实例方法,根本就不能通过类名来引用。

提示:基于与实例变量相同的原因,私有类变量也只能通过存取 器方法来使用它们。

**f****inal****类、方法和变量**
限定符final用于类、方法和变量,指出它们将不会被修改。对于类、方法和变量,final的含义各不相同,如下所示:

final类不能被继承

final方法不能被子类覆盖;

final变量的值不能被修改;

**变量**
final变量常被称为常量(或常量变量),因为它们的值不会改变。

对于变量,限定符final通常与static一超使用,这样,该常量将是类变量。对于操持不变的值,没有什么理由让每个对象都存储这个值的一个拷贝,而应将其声明为类变量。下面是声明常量的例子:
public static final int TOUCHDOWN = 6;
static final String TITLE=”Captain“;

**方法**
final方法不能被子类覆盖。在类声明中,使用限定符final来声明它们,如下例所示:
public final void getSignature() {
//body of method
}
将方法声明为final的最常见的原因是,提高类的运行效率。通常,当JVM运行方法时,它首先在当前类中查找 该方法,接下来在其超类中查找,并一直沿类层次结构向上查找,直到找到该方法为止。这提供了灵活必,简化了开发工作,但代价是速度较低。

如果方法是final的,Java编译器便可将其执行字节码直接放到调用它的程序中,因为该方法不会被子类覆盖而发生变化。

首次开发一个类时,没有理由使用final,然而,如果要提高类的执行速度,可以将一些方法改为final的。但要考虑到子类将无法覆盖它们。Java类库将很多常用的方法声明为final的,这样当程序调用它们时,执行速度将更快。
注意:私有方法是final的,而无须显式地声明,因为不可能在子类中覆盖它们。

**类**
通过在类的声明中使用限定符final可将其指定为不能继承的,如下所示:
public final class ChatServer {
}
在创建子类的声明中,final类不能出现在关键字extends的后面。与fianl方法一样,这以降低灵活性为代价,提高了Java语言的速度。
final的不足,如果您想创建一个类,其行为与字符串相似,但要做些修改,您不能继承String,并只定义不同的行为,而必须从空白开始。

在final类中,所有方法都将是final的,因此声明它们是,无须使用限定符。由于能够将其行为和属性遗传给子类的类更有用,所以将类声明为final时要考虑得失。

**抽象类和方法**
在类层次结构中,类的位置越高,其定义的抽象程度超高。位于类层次结构顶部的类只能定义所有类都有的行为和属性。更具体的行为和属性应在层次结构的更低层定义。
定义类层次结构的过程中,当您确定通用的行为和属性时,有时可能遇到一些永远不会被实例化的类。这样的类用于定义其子类都有的行为和方法。

这些类被称为抽象类,是使用限定符abstract来声明的。下面是一个这样的例子:
public abstract class Palette {
//
}

java.awt.Component就是一个抽象类,它是所有图形用户界面组件的超类。由于很多组件都是从这个类派生而来的,因此它包含了对这些组件都很有用的方法和变量。然而,并没有这样的通用组件 ,即可以被加入到用户界面中,从而无须在程序中创建Component对象。

抽象类可以包含常规类能够包含的任何东西,包括构造函数,因为子类可能需要继承这种方法。抽象类也可以包含抽象方法,这里只有方法特征标,而没有实现的方法。这些方法将在抽象类的子类中被实现。抽象类是用限定符abstract来声明的。不能在非抽象类中声明抽象方法。如果一个抽象类除除抽象方法外什么都没有,则使用接口更合适。

本站总访问 — 次