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 

标签:继承
0
投稿

猜你喜欢

  • Android客户端与服务端数据加密传输方案详解

    2023-07-14 13:55:37
  • Java应用EasyExcel工具类

    2023-07-07 18:45:32
  • C#对Xamarin框架进行数据绑定

    2022-04-07 23:36:50
  • 一文搞懂Java中的序列化与反序列化

    2021-11-22 00:26:45
  • SpringMVC 文件上传配置,多文件上传,使用的MultipartFile的实例

    2023-03-25 14:12:43
  • 详解使用Spring Boot开发Restful程序

    2023-01-24 09:20:09
  • JAVA学习之一步步搭建spring框架

    2023-02-24 06:39:44
  • Android仿直播类app赠送礼物功能

    2023-07-26 05:06:17
  • Java编程中字节流与字符流IO操作示例

    2022-02-23 20:35:40
  • 注解处理器(APT)是什么

    2021-09-29 09:03:30
  • 深入理解Java虚拟机 JVM 内存结构

    2022-05-01 20:49:57
  • Android选项菜单用法实例分析

    2022-11-02 07:42:44
  • MyBatis-Plus多表联查(动态查询)的项目实践

    2023-11-19 21:43:17
  • 简单记录C# 条件编译

    2023-10-20 05:49:07
  • Spark网站日志过滤分析实例讲解

    2021-06-08 12:59:24
  • Android实现自定义圆形进度条

    2022-10-28 04:55:22
  • Jackson序列化和反序列化忽略字段操作

    2022-08-29 14:01:14
  • 带你了解Java数据结构和算法之无权无向图

    2023-12-24 10:54:05
  • Maven的几个常用plugin

    2021-12-05 13:36:28
  • C#使用Twain协议实现扫描仪连续扫描功能

    2023-02-15 18:14:38
  • asp之家 软件编程 m.aspxhome.com