Как получить доступ к полям, определенным в моем конструкторе? - PullRequest
1 голос
/ 02 апреля 2020

У меня есть класс сборщика, который выбирает ваш наряд для вас, в зависимости от того, почему вы выходите из дома и какой это день.

Я пытаюсь завершить sh метод выбора, который решает, какие предметы одежды назначать для каждого индекса ArrayList. Одежда - это собственный класс, который имеет бренд String, цвет String и логические формальные поля.

В методе выбора я пытаюсь сделать

outfit.add(jeans);

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

outfit.add (picker.jeans);

, и он выдает ошибку «non stati *» 1036 * поле 'джинсы' нельзя ссылать из состояния c контекста "

В этом методе использовались булевы переменные stati c, поэтому я попытался исправить его, превратив

public class picker {
static boolean formalEvent;
static boolean niceWeather;
static boolean specialDay;
static boolean workingOut;

в

public class picker {
boolean formalEvent;
boolean niceWeather;
boolean specialDay;
boolean workingOut;

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

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

import java.util.ArrayList;
import java.util.Scanner;

public class picker {
    boolean formalEvent;
    boolean niceWeather;
    boolean specialDay;
    boolean workingOut;
    ArrayList<clothing> outfit = new ArrayList<>();
    static Scanner scnr = new Scanner(System.in);
    clothing khakis;
    clothing jeans;
    clothing shorts;
    clothing sweatpants;
    clothing sweatshirt;
    clothing gymShirt;
    clothing workShirt;
    clothing designerShirt;

    /**
     * Picker constructor.
     */
    public picker() {
        clothing khakis = new clothing("Levi", "brown", true);
        clothing jeans = new clothing("Mike Amiri", "blue", false);
        clothing shorts = new clothing("Nike", "blue", false);
        clothing sweatpants = new clothing("Adidas", "black", false);
        clothing sweatshirt = new clothing("Old navy", "red", false);
        clothing gymShirt = new clothing("Nike", "grey", false);
        clothing graphicTee = new clothing("Mike's Paving Posse", "black", false);
        clothing workShirt = new clothing("Polo", "yellow", true);
        clothing designerShirt = new clothing("Supreme", "red", false);
    }

Начало моего основного метода выглядит следующим образом

public static void main(String[] args) {
        picker todaysFit = new picker();
        String response = "";
        System.out.println("Are you going to a formal event?");
        response = scnr.next();
        if (response.equalsIgnoreCase("yes")) {
            formalEvent = true;

и теперь

formalEvent = true;

получает ошибку при FormalEvent, говоря: «Нестатистическое c поле« formalEvent »нельзя ссылаться из статического c контекста». Я попытался сделать это

picker.formalEvent = true;

, чтобы исправить это, но все равно выдает ту же ошибку.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы объявили и инициализировали локальные переменные в конструкторе, который скрывает членов данных. Отбросьте объявления типов для фактической инициализации членов:

public picker() {
    khakis = new clothing("Levi", "brown", true);
    jeans = new clothing("Mike Amiri", "blue", false);
    shorts = new clothing("Nike", "blue", false);
    sweatpants = new clothing("Adidas", "black", false);
    sweatshirt = new clothing("Old navy", "red", false);
    gymShirt = new clothing("Nike", "grey", false);
    graphicTee = new clothing("Mike's Paving Posse", "black", false);
    workShirt = new clothing("Polo", "yellow", true);
    designerShirt = new clothing("Supreme", "red", false);
}
0 голосов
/ 02 апреля 2020

Вам необходимо объявить переменные как stati c в вашем конструкторе. Но, следуя хорошей практике, вы должны создать метод в своем конструкторе для изменения значения, например:

public changeShirt(clothing newShirt){
   this.shirt = newShirt
}

Вы бы вызвали этот метод для вашего объекта todaysFit

...