如何防止构造函数在java继承中过度使用派生类中试图使用私有但不起作用的类
我不希望任何人试图使用私有方法重写我的构造函数,但它给出了如何停止重写我的构造函数的错误信息如何防止构造函数在java继承中过度使用派生类中试图使用私有但不起作用的类,java,oop,constructor,Java,Oop,Constructor,我不希望任何人试图使用私有方法重写我的构造函数,但它给出了如何停止重写我的构造函数的错误信息 class bc { int a; bc() { System.out.println("hi this is construvtor "); a = 10; System.out.println("the value of a=" + a); } } class dc extends bc { int b; dc() { a = 20;
class bc {
int a;
bc() {
System.out.println("hi this is construvtor ");
a = 10;
System.out.println("the value of a=" + a);
}
}
class dc extends bc {
int b;
dc() {
a = 20;
System.out.println("derived dc");
System.out.println("derived value of a=" + a);
}
}
public class sup {
public static void main(String[] args)
{
dc s1 = new dc();
}
}
构造函数不被重写,方法被重写。
当您在子类中添加一个构造函数,该构造函数的参数与父类中的哪一个参数相同时,它不会覆盖父类中的哪一个。
它只提供了一种实例化子类的方法,与调用父类构造函数的方法相同
在父类中使用
private
构造函数只会使类不可继承,因为子类构造函数需要调用父类构造函数,而父类中的private
构造函数会阻止它。构造函数不能被重写,因为它们不是类的成员。默认情况下,子类构造函数调用超类默认构造函数。若您不希望调用它,那个么您可以在超类中创建一个参数化构造函数,并在子类构造函数中调用它
class bc {
int a;
bc() {
System.out.println("hi this is construvtor ");
a = 10;
System.out.println("the value of a=" + a);
}
bc(int i){}
}
class dc extends bc {
int b;
dc() {
super(1); // invoking super class parameterized constructor
a = 20;
System.out.println("derived dc");
System.out.println("derived value of a=" + a);
}
}
public class sup {
public static void main(String[] args)
{
dc s1 = new dc();
}
}
构造函数没有被重写是正确的。但是我想根据你的查询加上一些信息。 只有在父类上有另一个具有非私有说明符的构造函数时,才可以将父类的构造函数设为私有,在这种情况下,必须使用
super
从子类构造函数调用该非私有超类构造函数
N.B.:尽管做这样的事情没有实际的用例。只是为了查询private
构造函数
。请尝试以下代码:
您不包括错误,也不显示如何使用私有方法。构造函数不会被重写。。。所以这会很复杂。可以重载构造函数。但是在子类中,您需要再次定义构造函数,并基于您想要使用的“supe”构造函数调用
super(…)
。但这并不过分,每个类都可以有自己的构造函数,您不能禁止它。您可以做的是不允许通过向类定义添加final
来扩展类。不要忘记继承仍然需要实例化父类成员,这意味着它需要使用父类的构造函数。如果不这样做,您将如何完整地定义父类?您的每个类只有一个构造函数。子类构造函数必须调用基类构造函数,因此只有一个构造函数意味着您无法阻止它,因为如果您阻止了它,则没有人可以创建子类。如果这是您想要的,那么将类设为final,并且它不能被子类化。我想补充的是,如果我们将每个构造函数设置为private,我们可以将类设置为final,以直接通知类不能被继承。这并没有增加多少,但…@AxelH在大多数情况下,这是正确的,它让事情变得更清楚。说得好。请注意,您有一个特例:您仍然可以使类nofinal
从类本身创建它的匿名类。确实,这一点很好!即使我不喜欢这个术语,这个类也可以被视为有效的最终类(我发现它也是一个懒惰的“特性”^^)
class bc {
int a;
private bc() {
System.out.println("-----------------------");
}
private bc(int s){
System.out.println("write logic");
}
bc(int a,int b){
System.out.println("***************");
}
}
class dc extends bc {
int b;
dc(int a) {
super(8,9);
}
}
public class sup {
public static void main(String[] args)
{
new dc(9);
}
}