在一个类中,我可以使用不同的参数类型拥有尽可能多的构造函数。我将所有构造函数设置为私有,它没有给出任何错误,因为我的隐式默认构造函数是public但是当我将隐式默认构造函数声明为private时,它在扩展类时显示错误。的 WHY吗
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);
}
}
答案 0 :(得分:3)
如果超类中的任何构造函数都是可访问的,则可以对其进行子类化,只需在子类的构造函数中使用super(..)调用可访问的超级构造函数。
我可以像这样继承你的第二个例子:
super("A string");
答案 1 :(得分:3)
如果我将其默认构造函数声明为私有
,则无法将类子类化
子类中的构造函数必须调用超级构造函数(可以是隐式或显式),以便完全构造对象。超级构造函数调用链一直持续到Object
类,即Java中所有类的超类。
如果任何超级构造函数对子类不可见,那么就无法完全构造then对象。
解决这个问题的一种方法是在超类protected
中创建构造函数。这样,超级构造函数只对子类可见。
答案 2 :(得分:1)
一些额外的信息,对于默认构造函数,始终存在对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);
}
}