如果一个父类所有构造方法都是私有的,还可以有子类吗

#### 问题
> 看到了一个问题,java中如果一个父类所有构造方法都是私有的,还可以有子类吗

#### 回答
java中有规定:`子类继承父类,子类的构造方法必须调用super(),即父类的构造方法,而且必须放在构造方法的第一行(如果代码没有显示调用,系统在编译时会隐式添加调用)`,因此可以得出,一个类的子类一定要可以访问到父类至少一个构造方法,但根据java访问权限,私有的方法在外部是无法访问的,这么看来,问题似乎有了答案:在java中,如果一个父类所有构造方法都是私有的,那么它不能有子类。

不过我们再细想一下,"私有的方法在外部是无法访问的",那么我们可以在内部访问啊,即通过内部类继承主类,实现"曲线救国",具体代码如下:

```java
package pers.mine;

public class Fat {

	public static Fat newInstance() {
		return new Fat();
	}

	private Fat() {
	}

	public void say() {
		System.out.println("Hello World!");
	}

	class Son1 extends Fat {
	}

	static class Son2 extends Fat {
	}

	public static void main(String[] args) {
		Fat fat = Fat.newInstance();
		Son1 son1 = fat.new Son1();
		Son2 son2 = new Fat.Son2();
		son1.say();
		son2.say();
	}
}
```

> 以上代码编译无异常,调用无异常。综上,java中如果一个父类所有构造方法都是私有的,将不可以有外部的子类,但是可以用内部类做子类。因此,如果想让一个类无法被继承,还是老老实实用`final`关键字吧


:wink:



------------
> 本文由 [叶不空](https://yebukong.com "叶不空") 创作,采用 [知识共享署名 4.0 国际许可协议](https://creativecommons.org/licenses/by/4.0/ "知识共享署名 4.0 国际许可协议")进行许可,转载请附上链接!
> 本文链接: [https://yebukong.com/article/1106017745272627202.html](https://yebukong.com/article/1106017745272627202.html "如果一个父类所有构造方法都是私有的,还可以有子类吗")
                        
(°ο°)评论插件未能完成加载!