JAVA中阻止类的继承(官方和非官方)_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
public class FinalDemo2 extends FinalDemo{}
                                ^
1 error

现在,你已经通过官方办法来成功阻止了第一个类被另一个类所继承。

非官方办法

    但是,阻止类被其他类所继承的办法也不是唯一的。考虑下面的代码,我声明了构造方法为私有(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{

}

在编译第一个类后,如果你接着编译第二个类,那么JDK编译器报错,你会得到下列错误信息:

PrivateTest2.java:1: PrivateTest() has private access in PrivateTest
public class PrivateTest2 extends PrivateTest{
       ^
1 error

    第二个类不能继承第一个类。 但是提示错误的意思是什么呢? JAVA语言要求在一个类中至少要提供一个构件方法。 如果你没有提供任何构件方法, JDK将会在你声明的类中插入一个默认的构件方法。 换句话说,默认的是一个不带参数,空构件体,和一个公共(public)访问权限的构件方法。 但是,如果你自己定义了一个构件方法, 那么JDK编译器就不会插入这么默认的构件方法。我们刚才在PrivateTest类中声明了一个默认的构件方法,但是我们将默认的public访问权限改为了private权限,这些都是符合JDK编译器语法检查的规则的。 

    现在我们来看看第二个部门。JAVA语言也要求你必须在构件方法里的第一行来调用(call)超类(super class)的构件方法。 这个是启动继承特征所必须的。 在JAVA中,我们通过调用super()这个方法来完成这个任务,它将会映射到一个超类的构件方法中。 如果你没有给超类提供一个默认的构造方法,那么JDK编译器将会插入一个默认的超类构件方法用来调用。

    我们刚才在第一个类中将构造器声明为private的权限。现在,当我们在其他类中继承这个类的时候,编译器将会尝试调用一个默认的超类构件方法。因为超类范围内的构件方法是声明为private权限的, 编译器将报错,说不能调用超类构件方法。因此,我们通过非官方办法阻止了一个类被其他类所继承。

Usman Saleem
Mohammad Ali Jinnah University
E-mail: usman_saleem@yahoo.com 

时间: 2024-08-28 09:14:04

JAVA中阻止类的继承(官方和非官方)_java的相关文章

java中实体类和JSON对象之间相互转化_java

在需要用到JSON对象封装数据的时候,往往会写很多代码,也有很多复制粘贴,为了用POJO的思想我们可以装JSON转化为实体对象进行操作 package myUtil; import java.io.IOException; import myProject.Student; import myProject.StudentList; import org.codehaus.jackson.map.ObjectMapper; import org.json.JSONArray; import or

详解Java中使用externds关键字继承类的用法_java

理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承.(1)继承 class Animal{ void eat(){ System.out.println("Animal eat"); } void sleep(){ System.out.println("Animal sleep"); } void breathe(){ System.ou

Java中的类反射机制

一.反射的概念 :反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩.其中LEAD/LEAD++ .OpenC++ .MetaXa和OpenJava等就是基于反射机制的语言.最近,反射机制也被应用到了视窗系统.操作系统和文件系统中. 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学

对象-JAVA中有关类的一个基础问题

问题描述 JAVA中有关类的一个基础问题 父类Father和子类Son,父类中有一个方法A,在子类中也定义了一模一样的一个方法A(具有与老方法相同的方法签名),那么在子类中那个A自然会把父类中的A给覆盖了.通过子类的对象调用方法A的时候,自然执行的是子类的A,通过父类的对象调用A的时候,自然执行的是父类的A,那么问题是:如果父类中有一个成员变量是子类Son,那么在父类中通过调用这个私有对象变量的方法A的时候, 是子类的A,还是父类的A? 解决方案 这么给你说吧,假如你实例化son,jvm会根据继

java中匿名类有关键字new 实例化一个对象有关键字new

问题描述 java中匿名类有关键字new 实例化一个对象有关键字new java中匿名类有关键字new 实例化一个对象有关键字new 那么如何区分匿名类和实例化一个对象 解决方案 不用区分.其实两者是一回事. 你可以认为对匿名类new是一个特例,它产生一个这个类型,然后产生一个这个类型的对象. 本质上这里new还是实例化对象. 解决方案二: 在程序运行中,以及调用者看来,一个匿名类的对象和一个一般的对象是一回事. 解决方案三: 转化的中间代码两个是一回事儿 解决方案四: C++中关键字newne

stringbuffer-关于Java中FileInputStream类的一些新手疑问

问题描述 关于Java中FileInputStream类的一些新手疑问 在每次使用FileInputStream的read方法时,需要用到字节数组bytes和真实读取长度len,如代码: public static void read(){ File file = new File("D:/学习/Android/代码/Workplace/Java_8_1_File/a.txt"); try { //针对文件创建一个输入流 InputStream in = new FileInputSt

基于Java中Math类的常用函数总结_java

Java中比较常用的几个数学公式的总结: //取整,返回小于目标函数的最大整数,如下将会返回-2 Math.floor(-1.8): //取整,返回发育目标数的最小整数 Math.ceil() //四舍五入取整 Math.round() //计算平方根 Math.sqrt() //计算立方根 Math.cbrt() //返回欧拉数e的n次幂 Math.exp(3); //计算乘方,下面是计算3的2次方 Math.pow(3,2); //计算自然对数 Math.log(); //计算绝对值 Mat

Java中获取类路径classpath的简单方法(推荐)_java

如下所示: <SPAN style="FONT-SIZE: 18px"> System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("java.class.path"); String path2 = FreeMarkerWriter.class.getProtectionDomain().getCodeSource().getLo

java object用法-Java中object类的用法

问题描述 Java中object类的用法 class Student { String name; int age; public boolean equals (Object obj) { Student st = null; if(obj instanceof Student) st =(Student)obj; else return false; if(st.name==this.name&&st.age==this.age) return true; else return fa