剑指Offer(Java版):不能被继承的类

方法一:
public final class FinalDemo {
}java

public class FinalDemo2 extends FinalDemo {
对象

 

在编译第一个类后,若是你接着编译第二个类,那么JDK编译器报错,你会获得下列错误信息:继承

FinalDemo2.java:1: cannot inherit from final FinalDemo
public class FinalDemo2 extends FinalDemo{}ci

方法二:get

声明构造方法为私有(private)的, 并且也声明一个静态方法(static method)来返回一个类对象。  编译器

public class jiekou {it

    
        private jiekou(){
                System.out.println("Private Default Constructor");
        }
        public static jiekou getInstance(){
                return new jiekou();
        }
        
        
        
}编译

 class list extends jiekou{
    
 }class

list下面会有红线,提示权限

Implicit super constructor  jiekou () is not visible for default constructor. Must define an explicit constructor

JAVA语言要求在一个类中至少要提供一个构造方法。 若是你没有提供任何 构造 方法, JDK将会在你声明的类中插入一个默认的 构造 方法。 换句话说,默认的是一个不带参数,空 构造 体,和一个公共(public)访问权限的 构造 方法。 可是,若是你本身定义了一个 构造 方法, 那么JDK编译器就不会插入默认的 构造 方法。咱们刚才在 jiekou 类中声明了一个默认的 jiekou 方法,可是咱们将默认的public访问权限 改成了private权限,这些都是符合JDK编译器语法检查的规则的。 

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

    咱们刚才在第一个类中将构造器声明为private的权限。如今,当咱们在其余类中继承这个类的时候,编译器将会尝试调用一个默认的超类 构造 方法。由于超 类范围内的 构造 方法是声明为private权限的, 编译器将报错,说不能调用超类 构造 方法。所以,咱们经过非官方办法阻止了一个类被其余类所继承,只要 private 改成public后就能够了。

相关文章
相关标签/搜索