有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何强制定义构造函数

我有一个接口I,它是由基类B实现的。基类由一群类(a、C、D)扩展,这些类必须初始化基类B中声明的一些受保护的变量。我想在子类(a、C、D)中强制声明构造函数,阻止用户依赖B中声明的默认构造函数。但是我希望B的默认构造函数自动执行,因为B本身也可以使用。我怎样才能做到这一点

谢谢


共 (3) 个答案

  1. # 1 楼答案

    如果B类将有自己的默认构造函数,那么您想要的是不可能的。当您从一个类派生时,您告诉编译器它应该为派生类的每个实例中的基类对象分配内存。没有办法告诉java编译器在每次继承某个基类时,都会突然删除它的一些功能

    还要注意,构造函数和静态工厂方法不能是抽象的,所以即使B可以是抽象类,也必须执行以下操作:

    public class B {
    
         B() {
              initialize();
         }
         protected abstract void initialize();
    }
    

    。。。同时确保派生类实现调用super()的默认构造函数

  2. # 2 楼答案

    将抽象超类B与私有构造函数一起使用:

    public abstract class BSuper {
    
        private BSuper() {
            // initialize stuff
        }
    
        protected BSuper(some params) {
            this():
            // other init with parms
        }
    }
    
    
    public class B extends BSuper {
    
         public B(some other params) {
             super(some params);
         }
    }
    
    
    public class A extends B {
    
         public A() {
             super(some other params);
         }
    }
    

    或类似

  3. # 3 楼答案

    将B的默认构造函数设为私有,并调用this();从参数化构造函数中

    public class B {
        private B() {
            super();
        }
        public B( Foo foo ) {
            this();
        }
        public static B createInstance() {
            return new B();
        }
    }
    

    编辑:错过阅读问题,从类声明中删除抽象关键字。还添加了用于创建B类的公共静态工厂方法。它调用B的默认构造函数