第六章高级语言特征 个静态变量。颜色根据对象的不同而不同,其行为也根据对象的不同而不同,在它所作用的非静态数据的基础上对不 同对象返回不同的颜色 图6-1 Myclass例子 第七节关键字 final 6.7.1Fina1类 关键字 final Final类不能被分成子类 Fina1方法不能被覆盖 Final变量是常数 Java编程语言允许关键字 Final被应用到类中。如果这样做了,类便不能被子分成子类。比如,类Java.lang. String 就是一个fina1类。这样做是出于安全原因,因为它保证,如果方法有字符串的引用,它肯定就是类 String的字符串, 而不是某个其它类的字符串,这个类是 String的被修改过的子类,因为 String可能被恶意窜改过 6.7.2Fina1方法 个体方法也可以被标记为 final。被标记为 final的方法不能被覆盖。这是由于安全原因。如果方法具有不能被改变 的实现,而且对于对象的一致状态是关键的,那么就要使方法成为fina 被声明为fina1的方法有时被用于优化。编译器能产生直接对方法调用的代码,而不是通常的涉及运行时查找的虚 拟方法调用 被标记为 static或 private的方法被自动地fina1,因为动态联编在上述两种情况下都不能应用。 6.7.3Fina1变量 如果变量被标记为 final,其结果是使它成为常数。想改变 final变量的值会导致一个编译错误。下面是一个正确定 义 final变量的例子 public final int MAX ARRAY SIZE =25; 注-如果将引用类型(即,任何类的类型)的变量标记为 fina l,那么该变量不能指向任何其它对象。但可能改变对象的 内容,因为只有引用本身是 fina l。 第八节抽象类 抽象类 声明方法的存在而不去实现它的类被叫做抽象类 可以通过关键字 abstract进行标记将类声明为抽象 public abstract void drawDot (int x, int y) public void drawLine(int xl, int y1 x2, int y2)[ // draw using the drawDot()method repeatedly 个 abstract类可以包含非抽象方法和变量 有时在库开发中,要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该行为。取而代之 在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法 例如,考虑一个 Drawing类。该类包含用于各种绘图设备的方法,但这些必须以独立平台的方法实现。它不可能去 访问机器的录像硬件而且还必须是独立于平台的。其意图是绘图类定义哪种方法应该存在,但实际上,由特殊的从属于 平台子类去实现这个行为 正如 Drawing类这样的类,它声明方法的存在而不是实现,以及带有对已知行为的方法的实现,这样的类通常被称 做抽象类。通过用关键字 abstract进行标记声明一个抽象类。被声明但没有实现的方法(即,这些没有程序体或仆}), 81
第六章 高级语言特征 81 一个静态变量。颜色根据对象的不同而不同,其行为也根据对象的不同而不同,在它所作用的非静态数据的基础上对不 同对象返回不同的颜色。 图 6-1 Myclass 例子 第七节 关键字 final 6.7.1 Final 类 关键字 final Final 类不能被分成子类 Final 方法不能被覆盖 Final 变量是常数 Java 编程语言允许关键字 Final 被应用到类中。如果这样做了,类便不能被子分成子类。比如,类 Java.lang.String 就是一个 final 类。这样做是出于安全原因,因为它保证,如果方法有字符串的引用,它肯定就是类 String 的字符串, 而不是某个其它类的字符串,这个类是 String 的被修改过的子类,因为 String 可能被恶意窜改过。 6.7.2 Final 方法 个体方法也可以被标记为 final。被标记为 final 的方法不能被覆盖。这是由于安全原因。如果方法具有不能被改变 的实现,而且对于对象的一致状态是关键的,那么就要使方法成为 final。 被声明为 final 的方法有时被用于优化。编译器能产生直接对方法调用的代码,而不是通常的涉及运行时查找的虚 拟方法调用。 被标记为 static 或 private 的方法被自动地 final,因为动态联编在上述两种情况下都不能应用。 6.7.3 Final 变量 如果变量被标记为 final,其结果是使它成为常数。想改变 final 变量的值会导致一个编译错误。下面是一个正确定 义 final 变量的例子: public final int MAX_ARRAY_SIZE = 25; 注-如果将引用类型(即,任何类的类型)的变量标记为 final,那么该变量不能指向任何其它对象。但可能改变对象的 内容,因为只有引用本身是 final。 第八节 抽象类 抽象类 声明方法的存在而不去实现它的类被叫做抽象类 可以通过关键字 abstract 进行标记将类声明为抽象 public abstract class Drawing { public abstract void drawDot(int x, int y); public void drawLine(int x1, int y1, int x2, int y2) { // draw using the drawDot() method repeatedly. } } 一个 abstract 类可以包含非抽象方法和变量 有时在库开发中,要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该行为。取而代之, 在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 例如,考虑一个 Drawing 类。该类包含用于各种绘图设备的方法,但这些必须以独立平台的方法实现。它不可能去 访问机器的录像硬件而且还必须是独立于平台的。其意图是绘图类定义哪种方法应该存在,但实际上,由特殊的从属于 平台子类去实现这个行为。 正如 Drawing 类这样的类,它声明方法的存在而不是实现,以及带有对已知行为的方法的实现,这样的类通常被称 做抽象类。通过用关键字 abstract 进行标记声明一个抽象类。被声明但没有实现的方法(即,这些没有程序体或{})
第六章高级语言特征 也必须标记为抽象 public abstract class Drawing public abstract void drawDot (int x, int y)i public void drawLine(int xl, int yl int x // draw using the drawDot() method repeatedly 不能创建 abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不 能有抽象构造函数或抽象静态方法。 Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类 public class MachineDr awing extends Drawing public void drawDot (int mach x, intmach y) / Draw the dot Drawing d= new MachineDrawing( 第九节接口 接口是抽象类的变体 在接口中,所有方法都是抽象的。 多继承性可通过实现这样的接口而获得。 句法是 public interface Transparency t ublic static final int OPAQUE=I ublic static final int BITMAs public static final int TRANSLUCENT=3 public int getTransparency(: 接口是抽象类的变体。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义 static final成员变量。 接口的好处是,它给出了屈从于Java技术单继承规则的假象。当类定义只能扩展出单个类时,它能实现所需的多个 接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即,将程序体 给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许 使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换, instanceof运 算符可以用来决定某对象的类是否实现了接口 接口是用关键字 interface来定义的,如下所述 public static final int OPAQUE=1 public static final int BITMASK=2 public static final int TRANSLUCENT=3;
第六章 高级语言特征 82 也必须标记为抽象。 public abstract class Drawing { public abstract void drawDot(int x, int y); public void drawLine(int x1, int y1, int x2, int y2) { // draw using the drawDot() method repeatedly. } } 不能创建 abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不 能有抽象构造函数或抽象静态方法。 Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。 public class MachineDrawing extends Drawing { public void drawDot (int mach x, intmach y) { // Draw the dot } } Drawing d = new MachineDrawing(); 第九节 接 口 接 口 接口是抽象类的变体。 在接口中,所有方法都是抽象的。 多继承性可通过实现这样的接口而获得。 句法是: public interface Transparency { public static final int OPAQUE=1; public static final int BITMASK=2; public static final int TRANSLUCENT=3; public int getTransparency(); } 接口是抽象类的变体。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义 static final 成员变量。 接口的好处是,它给出了屈从于 Java 技术单继承规则的假象。当类定义只能扩展出单个类时,它能实现所需的多个 接口。 接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即,将程序体 给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许 使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运 算符可以用来决定某对象的类是否实现了接口。 接口是用关键字 interface 来定义的,如下所述: public interface Transparency { public static final int OPAQUE=1; public static final int BITMASK=2; public static final int TRANSLUCENT=3;