Не удалось получить метод конструктора по умолчанию для чтения моих переменных в моем классе - PullRequest
0 голосов
/ 13 марта 2019

Я не знаю, почему мой конструктор по умолчанию в моем классе Date не читает должным образом входные данные, которые были отправлены ему из класса DateTester.У меня должен быть конструктор по умолчанию, конструктор с 3 входами (день, месяц и год), а также функции мутатора и средства доступа.

Код даты моего класса:

public class Date {
    private int day, month, year;
    public String checked = "";

    public void setDay(int d) {
        day = d;
    }
    public int getDay() {
        return day;
    }

    public void setMonth(int m) {
        month = m;
    }
    public int getMonth() {
        return month;
    }

    public void setYear(int y) {
        year = y;
    }
    public int getYear() {
        return year;
    }
    public String getChecked() {
        return checked;
    }
    public Date() {
        day = getDay();
        month = getMonth();
        year = getYear();
        if ( year > 0 && month > 0 && month < 13 && day > 0 && day < 32) {  
            checked = "valid";
        }
        else {
            checked = "invalid";
        }
    }
    public Date(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;

    }
}

И мой код DateTester:

public class DateTester {

    public static void main(String[] args) {
        //Scanner scanner = new Scanner(System.in);
        Date test = new Date();
        test.setDay(29);
        test.setMonth(2);
        test.setYear(2000);


        Date test2 = new Date();
        test2.setDay(29);
        test2.setMonth(2);
        test2.setYear(2016);

        System.out.println("The date is " + test.getMonth() + "/" + test.getDay() + "/" + test.getYear() + " and it is " + test.getChecked() + "!");
        System.out.println("The date is " + test2.getMonth() + "/" + test2.getDay() + "/" + test2.getYear() + " and it is " + test2.getChecked() + "!");
    }

}

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Конструктор не по умолчанию всегда неявно вызывает конструктор по умолчанию первым (конструктор по умолчанию вызывает super() сначала), если никакой другой конструктор не вызывается вами явно.

Итак, ваша проверка на валидность уже имела место дозначения устанавливаются в конструкторе, отличном от заданного по умолчанию, так что в итоге вы устанавливаете год, месяц и день, но срок действия равен false, поскольку вы проверили по нулям.

Вы можете изменить код, чтобы он работал:

public Date() {
    this(0, 0, 0);
}

public Date(int day, int month, int year) {
    this.day = day;
    this.month = month;
    this.year = year;

    if ( year > 0 && month > 0 && month < 13 && day > 0 && day < 32) {  
        checked = "valid";
    }
    else {
        checked = "invalid";
    }
}

КСТАТИ: Ваша проверка достоверности считает, например, 30 февраля действительным.

0 голосов
/ 13 марта 2019

С помощью этого я смог получить все это в рабочем состоянии, и теперь код работает.Мой обновленный код указан ниже.

Мой код класса Date:

public class Date {
    public int day, month, year;
    public String checked = "";

    public Date() {
        this(0, 0, 0);
    }
    public Date(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;

    }
    public String isValid() {
        if ( year > 0 && month > 0 && month < 13 && day > 0 && day < 32) {  
            return "valid";
        }
        else {
            return "invalid";
        }
    }
}

И мой код DateTester:

public class DateTester {

    public static void main(String[] args) {
        //Scanner scanner = new Scanner(System.in);
        Date test = new Date();
        test.day = 29;
        test.month = 2;
        test.year = 2000;


        Date test2 = new Date();
        test2.day = 40;
        test2.month = 2;
        test2.year = 2016;

        System.out.println("The date is " + test.month + "/" + test.day + "/" + test.year + " and it is " + test.isValid() + "!");
        System.out.println("The date is " + test2.month + "/" + test2.day + "/" + test2.year + " and it is " + test2.isValid() + "!");
    }
}
0 голосов
/ 13 марта 2019

Когда вызывается конструктор Date (), содержимое полей дня, месяца и года не определено (возможно, я не могу вспомнить, обещает ли Java инициализировать переменные или нет, но, если это так, вероятно, оно равно нулю) поэтому вызовы getDay () и т. д. в этом конструкторе будут использовать неопределенные или нулевые значения при вычислении «проверено».

Другими словами, значения, которые вы передаете объекту в вызовах setDay (), setMonth () и т. Д., Сделаны ПОСЛЕ проверок, которые вы ожидаете сделать в конструкторе.

Я не совсем уверен, чего вы пытаетесь достичь, но, если он проверяет дату, вам нужно либо передать значения в конструктор, либо иметь отдельную функцию isValid (), либо иметь каждый из Функции сеттера обновляют действительность при добавлении нового поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...