在使用默认构造函数时,隐式超级构造函数未定义

时间:2013-09-07 22:10:34

标签: java android

我有两个班级,一个名为Clubs,另一个名为Date。 - 日期扩展俱乐部

当我在下面添加这段代码时:在俱乐部课程中它会混淆我的日期课程以及其他所有延伸俱乐部的课程。

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; 
        }

5 个答案:

答案 0 :(得分:1)

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

此示例中的Clubs类定义了Clubs(Parcel in)构造函数,这意味着,您要么必须创建不带参数的构造函数(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 = "";     
    }
}

需要考虑的注意事项:

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

问题是子类的构造函数必须首先调用Parent的构造函数。如果父项具有默认构造函数(没有args的构造函数),则调用它。在你的情况下,你有一个带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
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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