无参数构造函数的目的是什么?

时间:2018-01-31 23:15:13

标签: java constructor

我理解下面的大部分代码。 我只是不理解Employee和Person的无参数构造函数的目的,因为当我删除它们时得到相同的结果。我是java的新手,所以如果这是一个愚蠢的问题,我道歉。这是我的一个类的代码片段。 任何帮助将不胜感激。

public class TestEmployee {
    public static void main(String[] args) {        
        // Define some employees
        Employee president  = new Employee("Lucy", "President", 100000);        
        System.out.println(president);  


        Employee cto  = new Employee("Vincent", "Chief Tech Officer", 70000);       
        System.out.println(cto);    
    }
}

class Employee extends Person{
    // ADD YOUR CODE HERE!!!
    // Nothing above needs to change.
    private String jobTitle="Unknown";
    private int salary = 0;

    public Employee() {

    }

    public Employee(String name, String jobTitle, int salary) {
        super(name);
        this.jobTitle = jobTitle;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return this.getName() + " is the " + jobTitle + " and makes $" + salary + " a year.\n";
    }
    // You need data fields, a constructor or two, and a to-string method
}

// IF YOU ALREADY HAVE THE PERSON CLASS IN YOUR WORKSPACE
// YOU CAN DELETE THIS. OTHERWISE YOU'LL GET AN ERROR:
// 'The type Person is already defined.'
class Person {
    private String name = "Default Name";

    // No-arg Constructor
    public Person () {
    }

    public Person (String name){
        this.name = name;
    }

    // Getter method
    public String getName() {
        return name;
    }

    // Setter method
    public void setName(String newName) {
        if (!newName.equals("")) {
            name = newName;
        }
        else
            System.out.println("Can't change name. Empty names aren't allowed!");
    }

    public String toString() {
        return "Name: " + name + "\n";
    }
}

4 个答案:

答案 0 :(得分:1)

在这种情况下是多余的。

我想指出,私有无参数,空(或非)构造函数从接口设计角度出发,以防止实例化并强制类的用户使用更多富有表现力的静态工厂方法,可以认为是好的设计。我相信这一点是在Joshua Bloch备受赞誉的“Effective Java”的第1项中提出的。

答案 1 :(得分:0)

带或不带参数的构造函数的目的是在对象中创建以访问其类中的方法。使用no参数构造函数,您可以创建对象以访问其类中的方法。此外,由于它扩展了另一个类,因此当您通过该空白构造函数创建新对象时,也可以访问该其他类中的任何方法。

答案 2 :(得分:0)

在Java中,无参构造函数是默认构造函数,如果没有在程序中明确定义。然后,Java Compiler将创建一个没有参数的默认构造函数。目的是调用超类构造函数。

答案 3 :(得分:0)

1.由于您只是Java的初学者,这是一个非常有效的问题(尽管我建议在发布问题之前对该主题进行一些研究)。

2.现在,提出问题。

(a)你所指的no-arg构造函数是"默认构造函数"的明确定义的替代。如果程序员没有明确定义构造函数,那么编译器(javac) )自动将默认构造函数定义为ClassName(){}。此构造函数在代码中不可见,但在编译完成后,它存在于java字节码中。

(b)在您的情况下,有一个显式定义的无参数构造函数。原因是您已明确定义参数化构造函数 public Employee(String name, String jobTitle, int salary) public Person (String name) 如果在程序中显式定义参数化构造函数,则Java编译器不会插入隐式默认构造函数。如果您希望在不传递任何初始值的情况下创建类的对象Employee president = new Employee();此语句将引发错误No default constructor found; nested exception is java.lang.NoSuchMethodException:。因此,no-arg构造函数有明确的定义来支持这样的对象创建,其中用户可以首先为对象分配堆空间,然后使用setter方法或其他一些机制对其进行初始化。 / p>