Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止构造函数在java继承中过度使用派生类中试图使用私有但不起作用的类_Java_Oop_Constructor - Fatal编程技术网

如何防止构造函数在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在大多数情况下,这是正确的,它让事情变得更清楚。说得好。请注意,您有一个特例:您仍然可以使类no
final
从类本身创建它的匿名类。确实,这一点很好!即使我不喜欢这个术语,这个类也可以被视为有效的最终类(我发现它也是一个懒惰的“特性”^^)
    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);
    }

}