【问题标题】:Calling a Constructor without parameters不带参数调用构造函数
【发布时间】:2014-10-23 18:13:45
【问题描述】:

我正在尝试使用构造函数、修改器和访问器构建一个类。通过阅读书籍和在线阅读,我了解到您可以调用带参数或不带参数的构造函数。但是,我下面的情况似乎不起作用。我什至无法编译没有错误。它在我使用 student jane = new student("") 时有效。我做错了什么?

Devolution.java:6: cannot find symbol
symbol  : constructor student()
location: class Governor
        student jane = new student();
                         ^
public class designers {

   public static void main(String[] args) { 

    student jane = new student();
    student smith = new student("jane", "36365355", "Nairobi", "Male");

    System.out.println("Janes's Properties: "+jane.name() + " " + jane.nationalID() + " " + jane.county()+"  "+jane.gender());
    System.out.println("Smith's Properties: "+smith.name() + " " + smith.nationalID() + " " + smith.county()+"  "+smith.gender());

   }    
 } 

其他代码如下

public class student {

   //Private fields
   private String name;
   private String nationalID;
   private String county;
   private String gender;   

   //Constructor method
   public student(String name, String nationalID, String county, String gender)
   {
     this.name = name;
     this.nationalID = nationalID;
     this.county = county;
     this.gender = gender;

   }

   //Accessor for name
   public String name()
   {
     return name;
   }

   //Accessor for nationalID
   public String nationalID()
   {
     return nationalID;
   }

   //Accessor for county
   public String county()
   {
     return county;
   }

    //Accessor for gender
   public String gender()
   {
     return gender;
   }

 }

【问题讨论】:

  • 请注意,Java 中的类名应以大写字母开头。
  • 在问题中格式化代码时,使用代码示例按钮或将代码缩进 4 个空格。 sn-ps 按钮只能用于 js、html 和/或 css。
  • 谢谢@JamesMontagne。确实很有帮助。信息量太大了。
  • 非常感谢大家。我想我喜欢 Java。那里有很多知识,很有帮助,很中肯!

标签: java


【解决方案1】:

构造函数是一种创建类实例的方法:

Student s = new Student(...);

将创建Student 类的新实例,并允许您使用s 访问它。

通常,当您创建类的实例时,您需要指定用于构建实例的某些信息。对于学生,可能是姓名、年龄等。你会有一个如下所示的构造函数:

public Student(String name, int age) {
    //...
}

但在某些情况下,您可以构建一个类的实例而无需(至少在最初)指定任何内容。因此,例如,您可能有一个这样的构造函数

public Student() {
    //...
}

这会将姓名和年龄字段留空或清零,直到您稍后使用该类的另一个方法设置它们。

你所做的关键点是你已经创建了一个需要各种参数的构造函数,但是你还没有像第二个例子那样指定一个不需要任何参数的构造函数。就目前的情况,你可以写

Student s = new Student("Bob", "ABC12345", "Surrey", "Male");

因为你有一个构造函数,它接受四个Strings 作为参数。但是你不会写

Student s = new Student();

因为您没有创建不带参数的构造函数。

其中的一个小问题是,如果你没有在你的类中指定 any 构造函数,那么 Java 会自动为你创建一个不带参数并且不带参数的构造函数。不要做任何特别的事情。因此,如果您不编写任何构造函数,您将免费获得一个,如下所示:

public Student() {
}

但那是只有如果你自己不写任何东西。由于您指定了一个确实带参数的,Java 不会免费给您一个无参数的。如果您希望能够在没有任何参数的情况下创建实例,则必须自己输入。

【讨论】:

  • 非常感谢@chiastic-security。非常精辟。你让我明白了这个概念。
【解决方案2】:

您只编写了一个构造函数——具有四个参数的构造函数。你没有没有参数的构造函数,所以不能写new student()

请注意,如果您根本不编写任何构造函数,编译器会自动为您创建一个没有参数的构造函数,但是一旦您编写了一个构造函数,就不会发生这种情况。

顺便说一句,大多数人使用大写字母作为类名(所以Student,而不是student)。这使得将它们与其他标识符的名称区分开来很容易。你最好养成这样做的习惯。

【讨论】:

    【解决方案3】:

    student 类中没有没有参数的构造函数。仅当您没有定义任何其他构造函数时,编译器才会生成这样的构造函数。

    只需添加构造函数:

       public student()
       {
           this.name = null;
           this.nationalID = null;
           this.county = null;
           this.gender = null;
       }
    

    【讨论】:

    • "" 之类的东西初始化它会不会更好,这样它就不会抛出空异常。私有变量不是已经为空了吗?
    • @JGrice 私有变量将为空,但明确地编写它并没有什么坏处。在我看来,使代码更具可读性。
    【解决方案4】:

    您需要创建另一个构造函数,如下所示:

    public Student(){
    //do things here
    }
    

    说明:

    当类中没有定义构造函数时,就会有一个默认构造函数(没有 任何参数)已经。在这种情况下,您不需要定义它。但是如果你有任何带参数的构造函数,那么你也需要定义不带参数的构造函数。

    【讨论】:

    • 解释为空白,这是 FGITW 行为的明确指示。
    • @Nabin 我没有投反对票,只是在我没有解释的情况下阅读它时发表了评论。如果人们追求最快,通常会尝试提交半篇文章,而不是尝试写一篇完美的文章。
    • 你没有做错任何事,@Nabin。只需忽略反对者。
    • 就我个人而言,我非常小心不要在完成之前点击按钮
    • @Nabin - 有人(不是我)认为它值得一票否决。那个人的意见和其他人的意见一样有效。我们不需要 10 个人一起来取消一个人的意见。
    【解决方案5】:

    它称为重载构造函数。在您的类中,再次声明一个没有参数要求的构造函数。请参阅此post 了解更多信息

    【讨论】:

      【解决方案6】:

      你没有没有参数的构造函数。只有当你没有自己写的时候才会出现这种情况。当您希望有可能创建带或不带参数的类的对象时,您需要在代码中使用两个不同的构造函数。

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多