【问题标题】:Struggling with default constructors, implicit super constructor undefined挣扎于默认构造函数,隐式超级构造函数未定义
【发布时间】:2013-09-07 22:10:33
【问题描述】:

我有两门课,一门叫俱乐部,一门叫约会。 - 日期扩展俱乐部

当我在下面添加这段代码时:在 Clubs 类中,它会弄乱我的 Date 类以及所有扩展 Clubs 的其他类。

public Clubs(Parcel in) { readFromParcel(in); }

这是我的约会班

public class Date extends Clubs {
    public Date(String day){
        clubName = day;
        date = "";
        eventType = "";     
    }
}

隐式超级构造函数 Clubs() 未定义必须显式调用 另一个构造函数

上面的消息是当我将鼠标悬停在public Date(String day){ 的红色下划线时出现的错误

任何帮助将不胜感激:

下面我发布了俱乐部课程

public class Clubs implements Parcelable{   
        protected String clubName;
        protected String address;
        protected String postcode;
        protected String contactName;
        protected String contactPhone;
        String date, eventType, scrutTime, startTime, eventName, week;


        public Clubs(String e){

        }

        public String getDetails() {
            return address + " " + postcode + " " + contactName + " " + contactPhone + " " + date + " " + eventType + " " + scrutTime + " ";    
        }

        public String getEvent() {          
                return date + " " + eventType; 
        }       

        public String getName(){
            return clubName;
        }

        public String getDate(){
            return date;
        }

        public String getWeek(){
            return week;
        }

        public String geteventName(){
            return eventName;
        }

        public void setEvent(String eventType, String date, String scrutTime, String startTime, String eventName, String week) {
            this.eventType = eventType;
            this.date = date; 
            this.scrutTime = scrutTime;
            this.startTime = startTime;
            this.eventName = eventName;
            this.week = week;
        }

        public void setEvent(String eventType, String date) {
            this.eventType = eventType;
            this.date = date; 
        }

【问题讨论】:

  • 重新考虑您选择 Date 作为类名。 Java 已经有 两个 Date 类,而你要做的就是迷惑自己。
  • 请记住,如果您在类中定义了一个非默认构造函数,则自动意味着该编译器不会为您生成默认构造函数。这就是构造函数 Clubs() 不存在的原因(只是为了将来;))

标签: java android


【解决方案1】:

当你编写一个子类时,编译器会自动插入对超构造器(超类的构造器)的调用作为子类构造器的第一行。但是,您的 Clubs 类没有默认构造函数(没有参数的构造函数),并且编译器不知道使用哪个 String 参数来调用存在的构造函数,因此它会报错。

要解决您的问题,您必须在 Date 构造函数的第一行添加以下内容:

super("some string that makes sense in your case");

【讨论】:

    【解决方案2】:

    当超类中没有隐式构造函数时,必须直接调用其中一个构造函数。

    本例中的 Clubs 类定义了 Clubs(Parcel in) 构造函数,这意味着,zou 要么必须创建一个不带参数的构造函数 (public Clubs() {...}),要么使用 super(args) 构造函数调用来调用它。

    public class Date extends Clubs {
        public Date(String day,Parcel in){ // argument added
            super(in);            //this line added, passing argument to super constructor
            clubName = day;
            date = "";
            eventType = "";     
        }
    }
    

    注意事项:

    • 超级构造函数调用必须是构造函数中的第一个。
    • 你还在构造函数中,对象还没有准备好!在调用超级构造函数之前,只能在类上调用静态函数!

    【讨论】:

      【解决方案3】:

      问题是子类的构造函数必须先调用父类的构造函数。如果父级具有默认构造函数(没有参数的构造函数),则调用它。在您的情况下,您有一个带有 args 的构造函数,因此没有默认构造函数,您必须显式调用构造函数:

      public class Date extends Clubs {
          public Date(String day) {
              super(null); // You can either pass null or an actual object
              /// Rest of the code
      }
      

      另一种选择是创建一个默认的Parcel 实例并传递它而不是传递null。您还可以创建一个构造函数来获取Parcel 实例:

      public class Date extends Clubs {
          public Date(Parcel p) {
              super(p);
              /// Rest of the code
      }
      

      【讨论】:

        【解决方案4】:

        当构造一个作为子类的类时(除new Object() 之外的任何东西),Java 需要从Object 构造函数开始并向下工作以确保每个类的所有内部状态都准备好供其子类使用采用。如果您没有调用super 构造函数(它必须是第一条语句),Java 将尝试使用对super() 的无参数隐式调用。您需要为 Clubs 上的某些构造函数调用具有适当参数的 super,或者向其添加无参数构造函数。

        【讨论】:

          【解决方案5】:

          类的构造函数必须始终调用其超类的构造函数(这将调用其超类的构造函数,依此类推......)。

          您可以使用super([constructor parameters]) 显式调用超类构造函数。如果不显式调用,则会自动添加对超类的默认构造函数(即不带参数的构造函数)的调用。

          当超类没有默认构造函数时会出现问题,您必须使用super([constructor parameters]) 指令指定将调用超类的哪个构造函数(以及使用哪些参数)。在你的情况下,它可能是super(day);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-14
            • 2018-06-27
            • 1970-01-01
            • 2013-09-20
            • 1970-01-01
            • 1970-01-01
            • 2013-02-24
            相关资源
            最近更新 更多