剑指offer没有java版吗,剑指Offer(Java版):不能被继承的类

方法一:

public final class FinalDemo {

}

public class FinalDemo2 extends FinalDemo {

}

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

FinalDemo2.java:1: cannot inherit from final FinalDemo

public class FinalDemo2 extends FinalDemo{}

方法二:

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

public class jiekou {

private jiekou(){

System.out.println("Private Default Constructor");

}

public static jiekou getInstance(){

return new jiekou();

}

}

class list extends jiekou{

}

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后就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值