Java构造函数 - 为什么年龄返回为零?

时间:2015-11-05 13:14:59

标签: java constructor

第一次创建自己的构造函数。

import java.util.Scanner;

public class Person {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter your name");
        PersonDetails a = new PersonDetails(input.nextLine());
        System.out.println("Enter your age");
        PersonDetails b = new PersonDetails(input.nextInt());

        System.out.println("So your name is" + " " + a.getName() + " and you are" + " " + a.getAge());

    }
}

PersonDetails类

public class PersonDetails {
    private String name;
    private int age;

    public PersonDetails(String initialName) {
        if(initialName.equals("Stephen")) {
            name = initialName;
        }
        else{
            System.out.println("Access denied");
            System.exit(0);
        }
    }
    public String getName() {
        return name;
    }

    public PersonDetails(int initialAge) { 
        if(initialAge >= 18) {
            age = initialAge;
        }
        else{
            System.out.println("You are a child");
            System.exit(0);
        }
    }

    public int getAge() {
        return age;
    }
}

输出结果为:

请输入您的姓名

斯蒂芬

输入您的年龄

19

所以你的名字是斯蒂芬,你是0

当我输入斯蒂芬然后输入数字19.为什么它为零?

2 个答案:

答案 0 :(得分:3)

您创建了2个PersonDetails个实例。 a实例仅设置名称,b实例仅设置年龄。

您可以创建一个新的构造函数,将名称和年龄作为参数:

  public PersonDetails(String initialName, int initialAge) {
    if (initialName.equals("Stephen")) {
      name = initialName;
    }
    else {
      System.out.println("Access denied");
      System.exit(0);
    }

    if (initialAge >= 18) {
      age = initialAge;
    }
    else {
      System.out.println("You are a child");
      System.exit(0);
    }
  }

然后,按如下方式使用您的课程:

Scanner input = new Scanner(System.in);
System.out.println("Please enter your name");
String name = input.nextLine();
System.out.println("Enter your age");
Int age = input.nextInt();
PersonDetails a = new PersonDetails(name, age);

System.out.println("So your name is" + " " + a.getName() + " and you are" + " " + a.getAge());

我也不建议在类的构造函数中使用System.exit(0);。在这种情况下抛出异常会更好,可能在构造函数之外(所以在其他地方进行验证)。

答案 1 :(得分:1)

因为您要创建两个不同的对象,所以必须使用b.getAge()

private int age;

此处age初始化为零,这就是为什么当您致电a.getAge()时得到0

来自javaDoc

  

声明但未初始化的字段将设置为a   编译器合理默认。一般来说,这是默认的   将为零或null,具体取决于数据类型。依靠这样的   但是,默认值通常被认为是错误的编程   风格。

更好的解决方案:

创建采用名称和年龄的构造函数

public PersonDetails(String name, int age) {
        if (name.equals("Stephen")) {
              this.name = initialName;
        }
        else {
              System.out.println("Access denied");
              System.exit(0);
        }

        if (age >= 18) {
              this.age = age;
        }
        else {
              System.out.println("You are a child");
              System.exit(0);
        }
}

创建一个对象而不是两个