【问题标题】:program calling default constructor? [closed]程序调用默认构造函数? [关闭]
【发布时间】:2017-09-05 11:58:11
【问题描述】:

这里是初学者。

我无法理解为什么这段代码会在中途输出默认值。有人可以看看吗?

格式有误请见谅,第一次发帖,不正确会修正。

 public class officemanager {
    public static void main(String[] args) {

        Staffmember aStaffMember = new Staffmember("Steven", "bob");
        System.out.println(aStaffMember.toString());

        Programmer appleprg = new Programmer("Marion", "bob", "Java");
        appleprg.getLanguage();
        System.out.println(appleprg.toString());

        Doctor dr = new Doctor();
        dr.setWard(5);
        dr.setFirstName("ed");
        dr.setLastName("fall");

        System.out.println(dr.toString());

    }
}

输出

Staffmember firstName=Steven, lastName=bob
Programmer firstName=Marion , lastName=bob   language Java
default constructor
Doctor firstName=ed , lastName=fall      Ward 5

对不起,这里是默认构造函数所在的类。它是名为 Staffmember 的超类,名字、姓氏字符串都通过它传递。

package oopinheritance;

public class Staffmember {

private String firstName;
private String lastName;


// default constructor
public Staffmember() {
System.out.println("default constructor");
    }

// constructor
public Staffmember(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;

}

public String getFirstName() {
return firstName;}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;}

public void setLastName(String lastName) {
this.lastName = lastName;}



public String toString() {
return "Staffmember firstName="
+firstName+ ", lastName=" + lastName;
}
}

这里是 Doctor 类,它是 Staffmember 的子类,它有自己的 tostring 方法:

package oopinheritance;

public class Doctor extends Staffmember{
private int ward;



public int getWard() {
return ward;
}



public void setWard(int ward) {
this.ward = ward;
}



public String toString() {
return "Doctor firstName="
+this.getFirstName() + " , lastName=" + this.getLastName() + " \t          
ward"     +    this.ward;
}



}

【问题讨论】:

  • 你没有显示打印“默认构造函数”的代码,所以很难说它为什么被调用以及何时......
  • 无法用您当前的代码来判断,但Doctor 类中的默认构造函数在调用时可能会输出default constructor
  • 因为new Doctor() 调用了无参数构造函数?
  • 博士博士 = 新博士();正在调用默认构造函数,因为您没有提供任何参数
  • 欢迎来到 Stack Overflow!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example。使用“编辑”链接改进您的问题 - 不要通过 cmets 添加更多信息。谢谢!

标签: java constructor default


【解决方案1】:

由于你没有展示你的整个程序,所以很难判断错误在哪里,但它可能在医生类的默认构造函数中。

无论如何这里是您可以参考的代码。它会给出正确的输出。

这里是你可以参考的链接查看执行顺序 http://javabeginnerstutorial.com/learn-by-example-3/order-of-execution-of-blocks-in-java/

Java Constructors - Order of execution in an inheritance hierarchy

class GfG {
    public static void main(String[] args) {

        Staffmember aStaffMember = new Staffmember("Steven", "bob");
        System.out.println(aStaffMember.toString());

        Programmer appleprg = new Programmer("Marion", "bob", "Java");
        appleprg.getLanguage();
        System.out.println(appleprg.toString());

        Doctor dr = new Doctor();
        dr.setWard(5);
        dr.setFirstName("ed");
        dr.setLastName("fall");

        System.out.println(dr.toString());

    }
}

class Staffmember {
    String firstName;
    String lastname;

    public Staffmember(String firstName, String lastname) {
        super();
        this.firstName = firstName;
        this.lastname = lastname;
    }

    @Override
    public String toString() {
        return "Staff Member firstName=" + firstName + ", lastname=" + lastname;
    }

}

class Programmer {
    String firstName;
    String lastName;
    String Language;

    public String getLanguage() {
        return Language;
    }

    public void setLanguage(String language) {
        Language = language;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Programmer(String firstName, String lastname, String Language) {
        super();
        this.firstName = firstName;
        this.lastName = lastname;
        this.Language = Language;
    }

    @Override
    public String toString() {
        return "Programmer firstName=" + firstName + ", lastName=" + lastName + ", Language=" + Language;
    }

}

class Doctor {
    int ward;
    String firstName;
    String lastName;

    public void setWard(int ward) {
        this.ward = ward;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    public Doctor(int ward, String firstName, String lastName) {
        super();
        this.ward = ward;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Doctor ward=" + ward + ", firstName=" + firstName + ", lastName=" + lastName;
    }

}

【讨论】:

  • 谢谢。我正在尝试通过 Staffmember Superclass 将 Doctor 拉出来并在其上添加“ward”。所以我试图在不创建 Doctor 构造函数的情况下做到这一点。我现在已经添加了其他类,所以你可以看到。
  • 这是打印默认构造函数的行 ****// 默认构造函数 public Staffmember() { System.out.println("default constructor"); }****。当您创建子类的对象时,首先初始化父类默认构造函数,然后初始化子类构造函数。因此,即使您将医生类的构造函数设为父类,即 StaffMember 构造函数,也会被调用。看看这个链接你就明白了stackoverflow.com/questions/19407187/…
  • 好的,我可以看到 Doctor 正在调用 Staffmember 的默认构造函数。似乎先调用它,然后在下一行做正确的事情? :( :(
  • 是的,java的流程只是这样,父类构造函数在子类构造函数之前调用。可以这样看,现实生活中没有父子是不可能存在的,所以总是先调用父类的构造函数。
  • 我明白了……但是为什么我的其他类都没有像 Doctor 那样调用默认构造函数并把我的输出弄得一团糟?!
猜你喜欢
  • 2014-05-08
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2015-10-09
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多