JAVA中阻止类的继承(官方和非官方)
官方办法 JAVA语言提供的一个关键字“FINAL”可以用来履行该任务。看看下面的源代码范例: 复制代码 代码如下: //FinalDemo.java public final class FinalDemo { } 下面让我们来制作另一个类,它将会继承上面声明的类。JAVA语言提供的“EXTENDS”关键字将能够使得一个类继承于一个现有的类。 复制代码 代码如下: //FinalDemo2.java public class FinalDemo2 extends FinalDemo { } 在编译第一个类后,如果你接着编译第二个类,那么JDK编译器报错,你会得到下列错误信息: FinalDemo2.java:1: cannot inherit from final FinalDemo
非官方办法 但是,阻止类被其他类所继承的办法也不是唯一的。考虑下面的代码,我声明了构造方法为私有(private)的,而且也声明了一个静态方法(static method)来返回一个类对象。 复制代码 代码如下: public class PrivateTest{ private PrivateTest(){ System.out.println("Private Default Constructor"); } public static PrivateTest getInstance(){ return new PrivateTest(); } } 上面被修改的代码被称为是"Singleton模式," 一个getInstance方法总是只返回这个类的一个实例。 但是为什么这段代码阻止了类被继承呢?考虑下面的代码,声明的类应该能继承上面的类。 public class PrivateTest2 extends PrivateTest{
PrivateTest2.java:1: PrivateTest() has private access in PrivateTest
现在我们来看看第二个部门。JAVA语言也要求你必须在构件方法里的第一行来调用(call)超类(super class)的构件方法。 这个是启动继承特征所必须的。 在JAVA中,我们通过调用super()这个方法来完成这个任务,它将会映射到一个超类的构件方法中。 如果你没有给超类提供一个默认的构造方法,那么JDK编译器将会插入一个默认的超类构件方法用来调用。 我们刚才在第一个类中将构造器声明为private的权限。现在,当我们在其他类中继承这个类的时候,编译器将会尝试调用一个默认的超类构件方法。因为超类范围内的构件方法是声明为private权限的, 编译器将报错,说不能调用超类构件方法。因此,我们通过非官方办法阻止了一个类被其他类所继承。 Usman Saleem (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |