【问题标题】:Java - Extending ClassesJava - 扩展类
【发布时间】:2013-10-30 08:46:02
【问题描述】:

我有一个会议类,我想创建一个扩展会议的 BusinessMeeting 类。

这是我的会议课:

public class Meeting {

private String name;
private String location;
private int start, stop;

public Meeting(String name, String location, int start, int stop) {

    this.name = name;

    this.location = location;

    this.start = start;

    this.stop = stop;

}

这是我的商务会议课程:

public class BusinessMeeting extends Meeting {

    public BusinessMeeting() {

        super();

    }

}

在我的 BusinessMeeting 课程中,我收到错误:

类会议中的构造函数会议不能应用于给定类型; 必需:字符串、字符串、整数、整数 发现:没有参数

我不确定为什么会收到该错误消息。 BusinessMeeting 类不应该继承我的 Meeting 类的所有变量吗?

【问题讨论】:

标签: java inheritance


【解决方案1】:

您创建的构造函数接受 4 个参数,并且您在没有任何参数的情况下调用它。 如果您还希望它在没有参数的情况下进行初始化 - 将一个空构造函数添加到 Meeting:

 public Meeting(){}

【讨论】:

  • 如果定义了构造函数,则不会创建默认构造函数。
  • 当他将 super(); 调用到缺少 0 参数构造函数的超类时,将空构造函数添加到 BusinessMeeting 将无济于事。
【解决方案2】:

通过声明构造函数,您的 Meeting 类没有 0 参数构造函数,这是您尝试使用 super(); 调用的构造函数。您需要调用一个与您的超类中可用的构造函数匹配的超级构造函数。

要解决此问题,请将 0 参数构造函数添加到 Meeting 类,或调用您已有的 4 参数构造函数。

【讨论】:

    【解决方案3】:

    正如 alfasin 所说,您已经创建了一个构造函数。 standard 声明如果没有定义其他构造函数,则创建此构造函数。如果你想调用 super(),你必须自己创建一个无参数的构造函数

    【讨论】:

      【解决方案4】:

      您应该在会议类中添加带有空参数的构造函数,或者您可以在 BussinessMeeting 类中调用 super(name,location,start,stop) 而不是 super()

      【讨论】:

        【解决方案5】:

        您正在使用空参数调用超类构造函数:

        public BusinessMeeting() {
                super();   
            }
        

        但是你的超类有构造函数:Meeting(String, String, int, int)

        使用 super(),调用超类 no-argument 构造函数(如果存在)。使用super(parameter list),调用具有匹配参数列表的超类构造函数。因此,要么您必须向 Meeting 添加一个带空参数的构造函数,例如 public Meeting(){},要么您需要调用 super(String, String, int, int)

        public class Meeting {
        // your variable declaration
           public Meeting(String name, String location, int start, int stop) {
            // your assignment 
           }
           public Meeting(){}
        }
        
        public class BusinessMeeting extends Meeting {
            public BusinessMeeting()
            {
              // super(); un-comment if you need to check by commenting below
               super("name", "loc", 1, -1);
            }
        }
        

        查看:Using the Keyword super

        【讨论】:

          【解决方案6】:
          public class Meeting {
              public Meeting(String name, String location, int start, int stop) {
          
                  this.name = name;
          
                  this.location = location;
          
                  this.start = start;
          
                  this.stop = stop;
          
              }
          }
          

          现在假设您想用businessId 扩展您的BusinessMeeting 类。

          public class BusinessMeeting {
              private Integer businessId;
          
              public BusinessMeeting(String name, String location, int start, int stop, int business) {
                  // because super calls one of the super class constructors(you can overload constructors), you need to pass the parameters required.
                  super(name, location, start, stop);
                  businessId = business;
              }
          }
          

          【讨论】:

            【解决方案7】:

            是和不是。这取决于您如何声明变量。

            子类无法访问超类中的私有变量。通常您将受保护的 getter 和 setter-Methods 添加到超类中。这些方法可以在子类中用于访问变量。 (有时草率的方法是将变量本身声明为受保护的)

            子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。 Java Inheritance Webpage

            但是关于你提到的错误: 你打电话给super()。这意味着您正在调用超类的默认构造函数。由于您在超类中编写了自己的构造函数,因此没有默认构造函数。后者仅在您未定义构造函数时创建。

            因此,当调用超类的构造函数时——在你的例子中它接受四个参数——你必须像这样通过super() 传递这些参数:

            super("a name", "a location", 0, 1)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-01-15
              • 2014-06-12
              • 2013-01-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多