A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Faith_Yee 中级黑马   /  2014-9-9 01:13  /  1486 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

      在面向对象的理论中, 有一些方案要求你用一个办法来声明一个不可继承的类。一般而言,如果类提供的功能不应该被改变,或者更恰当的说,是被覆盖(override)的时候才会出现这种情况。在这篇文章里,我讨论在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权限的, 编译器将报错,说不能调用超类构件方法。因此,我们通过非官方办法阻止了一个类被其他类所继承。

评分

参与人数 1黑马币 +2 收起 理由
格子、 + 2

查看全部评分

7 个回复

倒序浏览
最近发现楼主频繁从网上COPY一些资料下来以骗取黑马币和技术分!方法很有效
回复 使用道具 举报
1楼的话提醒了我 还能这么干呢
回复 使用道具 举报
我说怎么总结的这么到位呢。。。。不过,还是谢谢分享
回复 使用道具 举报
恩恩,楼主总结的不错
回复 使用道具 举报
转载就注明转载,还以为楼主写的。。
回复 使用道具 举报
cs8630323 发表于 2014-9-16 15:51
转载就注明转载,还以为楼主写的。。

这重要吗
回复 使用道具 举报
nyk 中级黑马 2014-9-16 21:27:53
8#
赞一个,看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马