Ссылка на список не статических массивов в статической среде? - PullRequest
0 голосов
/ 19 февраля 2019

Я только начал изучать Java месяц назад или около того, и теперь у меня возникла проблема с «на нестатическую переменную studentList нельзя ссылаться из статического контекста».Я пытаюсь использовать отдельный метод от main для заполнения списка учеников вместо того, чтобы копировать вставку из addStudent для каждого ученика;но я не могу получить методы для записи в ArrayList.(Ошибка: (14, 27) java: на нестатическую переменную studentList нельзя ссылаться из статического контекста).Я понимаю, что массив не является статичным, потому что он имеет неопределенный размер, но как я могу заставить его работать как есть?Есть ли лучший подход?Могу ли я сделать массив частью основного метода, а затем передать его в addStudent, если да, то как?

import java.util.ArrayList;

public class Main {
    ArrayList<Student> studentList = new ArrayList<>();

    public static void main(String []args) {
        addStudent("Adam", "Goldsmith", 70, 50);
        addStudent("John", "Smith", 20, 40);
        addStudent("Lewis", "Peterson", 90, 85);

        for (Student obj: studentList){
            System.out.println("Name: " + obj.studentForename + " "+ obj.studentSurname);
        }
    }

    public static void addStudent(String forename, String surname, int coursework, int test) {
        Student newStudent = new Student(forename, surname);
        newStudent.setForename(forename);
        newStudent.setSurname(surname);
        newStudent.averageMark(70, 65);

        studentList.add(newStudent);
    }

}

и мой "Студенческий" класс:

public class Student {
    String studentForename;
    String studentSurname;

    public Student(String studentForename, String studentSurname) {
        setForename(studentForename);
        setSurname(studentSurname);
    }

    // Set forename.
    public void setForename(String newForename) {studentForename = newForename;}

    // Set surname.
    public void setSurname(String newSurname) {studentSurname = newSurname;}

    //
    public double averageMark(int courseworkMark, int testMark){
        return (courseworkMark+testMark)/2;
    }

    // Grab the forename
    public String grabForename(){
        return studentForename;
    }

    // Grab the surname
    public String grabSurname(){
        return studentSurname;
    }

    // Grab the full name
    public String grabFullName(){
        return studentForename + "" + studentSurname;
    }
}

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Разница между статическим (глобальный, уровень класса) и нестатическим (экземпляр этого класса, объект) важна.

СозданиеОбъект new Main() позволяет работать с этим объектом и его полями.

static void main(String[]) является единственной точкой входа в приложение.

Внутри основногоу вас есть доступ только к статическим полям и статическим методам.Так что это громоздко.

package srivastava.arpit; // In a directory path srivastava/arpit/

import java.util.ArrayList;

public class Main {

    private ArrayList studentList = new ArrayList<>();

    public static void main(String []args) {
        Main main = new Main();
        main.execute();
    }

    private void execute() {
        addStudent("Adam", "Goldsmith", 70, 50);
        addStudent("John", "Smith", 20, 40);
        addStudent("Lewis", "Peterson", 90, 85);

        for (Student obj: studentList){
            System.out.println("Name: " + obj.studentForename + " "+ obj.studentSurname);
        }
    }

    public void addStudent(String forename, String surname, int coursework, int test) {
        Student newStudent = new Student(forename, surname);
        newStudent.setForename(forename);
        newStudent.setSurname(surname);
        newStudent.averageMark(70, 65);

        studentList.add(newStudent);
    }
}
0 голосов
/ 19 февраля 2019

думал, что приведенный выше ответ отвечает на ваш вопрос, но несколько слов о статических и нестатических модификаторах в java

Характеристики статических методов

  • Статический методвызывается с использованием класса (className.methodName), а не ссылки на экземпляр (новый instanceOfClass = class; instanceOfClass.methodName.)
  • Статические методы не могут использовать нестатические переменные экземпляра: статический метод можетне ссылаться на какие-либо переменные экземпляра класса.Статический метод не знает, какое значение переменной экземпляра использовать.
  • Статические методы не могут вызывать нестатические методы: нестатические методы обычно используют состояние переменной экземпляра, чтобы влиять на их поведение.Статические методы не могут видеть состояние переменной экземпляра, поэтому, если вы попытаетесь вызвать нестатический метод из статического метода, компилятор будет жаловаться независимо от того, использует ли нестатический метод переменную экземпляра.

Нестатические методы

  • Нестатический метод не имеет ключевого слова static перед именем метода.

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

  • Нестатические методы могут обращаться к любому статическомуметод и любую статическую переменную без создания экземпляра класса.

Так что вам лучше подумать, нужно ли вам определить studentList как статическое или нет, и соответственно изменить код.

PS Выше написано взято из здесь

0 голосов
/ 19 февраля 2019

Ваш код должен выглядеть следующим образом, особенно ваш класс Student с использованием java инкапсуляции

public class Student {

   private String studentForename;
   private String studentSurname;
   private int courseworkMark;
   private int testMark;

    public Student(String studentForename, String studentSurname, int courseworkMark, int testMark) {
        this.studentForename = studentForename;
        this.studentSurname = studentSurname;
        this.courseworkMark = courseworkMark;
        this.testMark = testMark;
    }   
    public void setStudentForename(String studentForename) {
        this.studentForename = studentForename;
    }
    public String getStudentSurname() {
        return studentSurname;
    }
    public void setStudentSurname(String studentSurname) {
        this.studentSurname = studentSurname;
    }
    public String getStudentForename() {
        return studentForename;
    }  
    public double averageMark(){
        return (this.courseworkMark + this.testMark)/2;
    }
    public String grabFullName(){
        return studentForename + " " + studentSurname;
    }
}

А затем тестирование через основной класс:

public class Main {    
    public static void main(String []args) {
        ArrayList<Student> studentList = new ArrayList<>();
        studentList.add(new Student("Adam", "Goldsmith", 70, 50));
        studentList.add(new Student("John", "Smith", 20, 40));
        studentList.add(new Student("Lewis", "Peterson", 90, 85));

        for (Student obj: studentList){
            System.out.println("Name: " + obj.getStudentForename() + " "+ obj.getStudentSurname());
        }
    }
}
0 голосов
/ 19 февраля 2019
import java.util.ArrayList;

public class Main {
    static ArrayList<Student> studentList = new ArrayList<>();

    public static void main(String []args) {
        addStudent("Adam", "Goldsmith", 70, 50);
        addStudent("John", "Smith", 20, 40);
        addStudent("Lewis", "Peterson", 90, 85);

        for (Student obj: studentList){
            System.out.println("Name: " + obj.studentForename + " "+ obj.studentSurname);
        }
    }

    public static void addStudent(String forename, String surname, int coursework, int test) {
        Student newStudent = new Student(forename, surname);
        newStudent.setForename(forename);
        newStudent.setSurname(surname);
        newStudent.averageMark(70, 65);

        studentList.add(newStudent);
    }

}

Это произошло не из-за неопределенного размера, а потому, что вы пытались получить к нему доступ, не создавая объект из статического метода.
Так что просто напишите статическое перед ним, и оно будет работать.

...