[英]why a class can not be subclassed if i declare its default constructor as private
在一个类中,我可以使用任意数量的构造函数来使用不同的参数类型。 我将所有构造函数都设为私有,但未给出任何错误,因为我的隐式默认构造函数是public,但是当我将隐式默认构造函数声明为private时,在扩展类时显示错误。 为什么?
public class Demo4 {
private String name;
private int age;
private double sal;
private Demo4(String name, int age) {
this.name=name;
this.age=age;
}
Demo4(String name) {
this.name=name;
}
Demo4() {
this("unknown", 20);
this.sal=2000;
}
void show(){
System.out.println("name"+name);
System.out.println("age: "+age);
}
}
public class Demo4 {
private String name;
private int age;
private double sal;
private Demo4(String name, int age) {
this.name=name;
this.age=age;
}
Demo4(String name) {
this.name=name;
}
private Demo4() {
this("unknown", 20);
this.sal=2000;
}
void show() {
System.out.println("name"+name);
System.out.println("age: "+age);
}
}
如果超类中的任何构造函数都是可访问的,则可以对其进行子类化,只需在子类的构造函数中使用super(..)调用可访问的超级构造函数。
我可以像这样子化您的第二个示例:
super("A string");
为什么如果我将其默认构造函数声明为private,则无法将其子类化
子类中的构造函数必须调用一个超级构造函数(可以是隐式的也可以是显式的),以便完全构造该对象。 超级构造函数调用链一直持续到Object
类,即Java中所有类的超类。
如果子类不可见任何超级构造函数,则无法完全构造对象。
解决此问题的一种方法是使超类中的构造函数protected
。 这样,超级构造函数仅对子类可见。
一些额外的信息,对于默认的构造函数,总会隐式调用super()
。 相反,对于非默认构造函数,应该显式调用(如果父类中没有可访问的构造函数)可访问的父类的构造函数或同一类的构造函数。 例如
package com.test;
class A {
private A() {
//implicit call to java.lang.Object.super()
}
public A(String a) {
//implicit call to java.lang.Object.super()
}
}
public class B extends A {
public B(String a, String b) {
this(a);
}
public B(String a) {
super(a);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.