Java 用户定义和默认构造函数?

Java 用户定义和默认构造函数?,java,constructor,Java,Constructor,好吧,我正试着把我的头绕在这上面: 编写一个应用程序,使用以下属性为student对象创建类: 学生编号、姓名、地址、电话号码和课程 编写一个测试程序,设置并获取类中的每个属性。 测试程序还应该显示类中的所有属性 使用上一个问题中的student类及其属性,编写一个包含用户定义和默认构造函数的应用程序(扩展上一个程序) 编写一个测试程序来演示这两个构造函数的使用 这是一份来自学院的工作表,用于对Java中的对象进行一些修订 困扰我的是,它要求同时具有用户定义和默认构造函数 我觉得做这件事是不可能

好吧,我正试着把我的头绕在这上面:

  • 编写一个应用程序,使用以下属性为student对象创建类: 学生编号、姓名、地址、电话号码和课程
  • 编写一个测试程序,设置并获取类中的每个属性。 测试程序还应该显示类中的所有属性

  • 使用上一个问题中的student类及其属性,编写一个包含用户定义和默认构造函数的应用程序(扩展上一个程序)
  • 编写一个测试程序来演示这两个构造函数的使用

    这是一份来自学院的工作表,用于对Java中的对象进行一些修订

    困扰我的是,它要求同时具有用户定义和默认构造函数

    我觉得做这件事是不可能的?因为如果您自己不提供构造函数,JVM将提供一个(默认构造函数?)。但是如果您定义了任何构造函数,那么默认的构造函数就不可用了


    这只是一个措词不当的任务,还是可能意味着其他什么?

    在java中,当您没有显式指定构造函数时,编译器将添加一个“默认”构造函数:构造函数不接受参数。如果指定构造函数,则编译器不会添加该构造函数

    例如,此代码可以很好地编译:

    class Student {
        String name;
        int age;
        // ...
    }
    
    // ...
    
    Student myself = new Student();
    
    但这段代码无法编译:

    class Student {
        String name;
        int age;
    
        // ...
    
        public Student(String name) {
            this.name = name;
        }
    }
    
    // ...
    
    Student myself = new Student(); // compilation error: use new Student("Jhon Smith");
    

    因为默认构造函数不再可用。

    当您不实现自己的构造函数时,Java提供默认构造函数。但是,当您创建自定义构造函数时,如果您想使用不带参数的构造函数,您还必须实现默认值。让我们假设java有
    类{}
    ,它看起来是这样的:

    public class A{
    
       public A(){//auto generated constructor
    
       }
    }
    

    但是如果你提供一个定制的构造函数,自动生成的构造函数dissapear。

    我很确定创建工作表的人的意思是“无参数构造函数”,而不是“默认构造函数”

    从技术上讲,您不能创建默认构造函数(因为这是由编译器为您完成的),但是您可以显式地创建no-arg构造函数(在功能上是相同的)


    所以,是的,任务的措辞很糟糕。

    当程序员提供任何构造函数时,都不会创建默认构造函数。但是在这里,我希望这个任务的作者理解“default”构造函数是一个没有任何参数的构造函数

    结论是,您将有两个构造器:

    public class MyClass {
    
    public MyClass () {
    }
    
    public MyClass (long studentNumber, String name, String address....) {
    }
    

    以上是正确的,但是,在OO术语中,“默认构造函数”是一个不接受任何参数的构造函数。另一种类型的构造函数是将参数引入到构造函数中以自定义内容的构造函数

    即:


    根据查拉坦和凯恩斯的说法,Java在两个学期中出版了第3版,第196页:

    构造函数就像任何方法都可以重载一样,这意味着在一个类中,我们可以有2个或多个构造函数,其中一个接受1个参数,如:
    (“studentName”)
    ,而在同一个类中,另一个构造函数可能接受2个参数
    (“studentName”,“studentId”)
    ,仍然在同一类中的另一个构造函数可能有3个参数
    (“studentName”、“studentId”、“studentPhoneNumber”)

    这是构造函数重载。下面是一个例子:

    public class student {
    
        // attributes
        private String studentName;
        private int studentID;
        private int studentPhoneNumber;
        // constructor with one argument
        public student (String studentNameIn) {
            studentName = studentNameIn;
        }
    
        // constructor with 2 arguments
        public student (String studentNameIn,  int studentIdIn) {
            studentName = studentNameIn;
            studentID = studentIdIn;
        }
    
        // constructor with 3 arguments
        public student (String studentNameIn,  int studentIdIn, int studentPhoneNumberIn) {
            studentName = studentNameIn;
            studentID = studentIdIn;
            studentPhoneNumber = studentPhoneNumberIn;
        }
    
        // default constructor REINSERTED no argument
        public student () {}
    
        // methods
    }
    
    上面是构造函数重载的一个明显例子。现在,在对象创建过程中,也就是说,当学生对象被创建时,程序员将使用他/她选择的构造函数,使用0个参数(重新插入的默认值)或再次使用1个参数,他/她可以选择包含2个参数的构造函数等。这是用户选择和要求的问题


    不需要超类或多个类,因为构造函数可以像上面演示的那样重载。

    您的印象是正确的,只是编译器提供了默认构造函数,而不是JVM。所以基本上,这项任务是不可能完成的。@galdikas您不能同时拥有自定义构造函数和默认构造函数。但是你可以写两个类。一个有一个没有。正如@SotiriosDelimanolis所建议的,您可以使用继承编写两个类:一个称为“Student”的超类,没有显式构造函数,然后是Student的子类(比如一个NamedStudent扩展Student),有显式构造函数。我的理解是,默认构造函数没有参数。但仅仅因为构造函数没有参数,并不一定意味着它是默认的?就像你的例子一样。。。学生()这会被严重视为违约吗?这是他们在学校教你的,是的。这些术语的使用有些松散。这里有一个例子,他们使用它作为任何没有参数的构造函数:根据我的经验,仅仅因为他们在学校教你一些东西,它不一定准确:)不准确,我只是想告诉你他们可能想要你做什么。此外,正如我之前所说,“默认构造函数”这个术语是一个比较松散的术语,如链接I中所示posted@stakSmashr:在Java中,术语“默认构造函数”定义得很好()。这纯粹是教授或助教的懒惰(或无能)。
    public class student {
    
        // attributes
        private String studentName;
        private int studentID;
        private int studentPhoneNumber;
        // constructor with one argument
        public student (String studentNameIn) {
            studentName = studentNameIn;
        }
    
        // constructor with 2 arguments
        public student (String studentNameIn,  int studentIdIn) {
            studentName = studentNameIn;
            studentID = studentIdIn;
        }
    
        // constructor with 3 arguments
        public student (String studentNameIn,  int studentIdIn, int studentPhoneNumberIn) {
            studentName = studentNameIn;
            studentID = studentIdIn;
            studentPhoneNumber = studentPhoneNumberIn;
        }
    
        // default constructor REINSERTED no argument
        public student () {}
    
        // methods
    }