JAVA中阻止类的继承(官方和非官方)
发布时间:2023-06-29 16:02:56
官方办法
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
猜你喜欢
- 问题由来一个简单的需求,要求把和当前用户相关的数据置顶展示。这里,我用了一个简单的用户表来复现这个需求。很简单,查询语句后面加上:order
- 传统“长轮询”实现Web端即时通讯的问题WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。
- ListJava 的list又分为 ArrayList 和 LinkedListArrayListprivate class Itr imp
- 什么是Spring BootSpring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初
- 本文实例为大家分享了Java实现24点小游戏的具体代码,供大家参考,具体内容如下程序设计要求:24点游戏是经典的纸牌益智游戏。常见游戏规则:
- 1.使用IDEA新建项目2.选择创建Maven工程3.填写GroupId和ArtifactId4.填写项目名称,与上一步的ArtifactI
- 具体代码如下所示:public class Parent { public static int a = parentStati
- 封装(Encapsulation)是面向对象编程的一个核心概念,它意味着将数据(属性)和方法(操作数据的函数)捆绑在一起,形成一个类(Cla
- 题外话:学习.NET已经有一年了,从C#->ASP.NET->WPF。主要以看电子书为主,比较少写代码。现在回头学习以前接触过的
- 本文实例总结了C#遍历DataSet控件的方法。分享给大家供大家参考。具体方法如下:DataSet控件在.net主要是用来存储数据的,它更像
- Android:4.4.4一、应用场景在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0:#
- 目录前言I. 项目环境1. 项目依赖2. 配置II. 邮件发送1. 简单文本邮件发送2. html发送3. 添加附件4. Freemaker
- 整理文档,搜刮出一个C# 通过 oledb 操作Excel实例代码,稍微整理精简一下做下分享。public string GetConnec
- Android多媒体 MediaPlayer我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我
- spring-boot-maven-plugin:打包时排除provided依赖spring-boot-maven-plugin 插件提供s
- RocketMQ修改生产者消费者日志保存路径rocket默认是将所有日志文件保存到user.home的对于win系统就是C盘了。1.修改Ro
- 参数设置java程序启动参数 -D是用来做什么的呢? 官方解释如下:Set a system property value. If valu
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 我就废话不多说了,大家还是直接看代码吧!public static String mapToTxt(Map<String,String
- 最近有一个java实验,要求用java使用数据库,于是本人新手小白,在idea上卡了好半天希望看到这个博客的人能解决问题,跳过一些坑首先,我