Java 添加方法链接列表

Java 添加方法链接列表,java,object,linked-list,Java,Object,Linked List,我已经创建了一个包含对象的链表。该对象称为Student,有三个参数:姓名、年龄、年级。这是我的课 链接 class Link { public Object s; public Link next; public Link(Object Student) { s=Student; next=null; } } 学生 class Student { private static String name; priv

我已经创建了一个包含对象的链表。该对象称为Student,有三个参数:姓名、年龄、年级。这是我的课

链接

class Link {
    public Object s;
    public Link next;

    public Link(Object Student) {
        s=Student;
        next=null;
    }
}
学生

class Student {
    private static String name;
    private static int age;
    private static int grade;

    public Student (String n, int a, int g) {
        setName(n);
        setGrade(g);
        setAge(a);
    }

    public static void setName(String n) {
        name=n;
    }

    public static void setGrade(int g) {
        grade=g;
    }

    public static void setAge(int a) {
        age=a;
    }

    public int getAge() {
        return age;
    }

    public int getGrade() {
        return grade; 
    }

    public static String getName() {
        return name;
    }

    public String toString() {
        return "Name: " +name+ " Age: " +age+ " Grade: " +grade; 
    }
}
import java.util.*;
class List {
    private static LinkedList<Student> ll = new LinkedList<Student>();
    private static Link first;
    public List() {
        first=null;
    }

    public static void addStudent() {
        Scanner s = new Scanner(System.in);
        System.out.println("What is the student's name;");
        String n = s.nextLine();
        System.out.println("What is the student's age;");
        int b = s.nextInt();
        System.out.println("What is the student's grade;");
        int g = s.nextInt();
        Student nStudent = new Student(n, b, g);
        Link newStudent = new Link(nStudent);
        newStudent.next=first;
        first=newStudent;
        ll.add(nStudent);
    }

    public static Link findStudent() {
        Scanner sc = new Scanner(System.in);
        System.out.println("What is the student's name?");
        String n = sc.nextLine();
        Link current = first;
        String name = Student.getName();
        while (name!= n) {
            if (current.next==null)
                return null;
            else
                current=current.next;
        }
        return current;
    }

    public static void change () {
        Scanner sc = new Scanner(System.in);
        Link h = findStudent();
        System.out.println("If you want to change his name press 1;");
        System.out.println("If you want to change his age press 2;");
        System.out.println("If you want to change his grade press 3;");
        int l = sc.nextInt();
        if (l==1) {
            System.out.println("What name do you want the student to have?");
            String newname = sc.nextLine();
            Student.setName(newname);

        } else if (l==2) {
            System.out.println("What age do you want the student to have?");
            int j = sc.nextInt();
            Student.setAge(j);
        }
        else if (l==3) {
            System.out.println("What grade do you want the student to have?");
            int e = sc.nextInt();
            Student.setGrade(e);
        }
    }

    public static void show() {
        System.out.println(ll);
    }
}
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Tom
What is the student's age;
16
What is the student's grade;
90
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Eric
What is the student's age;
16
What is the student's grade;
91
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
3
[Name: Eric Age: 16 Grade: 91, Name: Eric Age: 16 Grade: 91]
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
列表

class Student {
    private static String name;
    private static int age;
    private static int grade;

    public Student (String n, int a, int g) {
        setName(n);
        setGrade(g);
        setAge(a);
    }

    public static void setName(String n) {
        name=n;
    }

    public static void setGrade(int g) {
        grade=g;
    }

    public static void setAge(int a) {
        age=a;
    }

    public int getAge() {
        return age;
    }

    public int getGrade() {
        return grade; 
    }

    public static String getName() {
        return name;
    }

    public String toString() {
        return "Name: " +name+ " Age: " +age+ " Grade: " +grade; 
    }
}
import java.util.*;
class List {
    private static LinkedList<Student> ll = new LinkedList<Student>();
    private static Link first;
    public List() {
        first=null;
    }

    public static void addStudent() {
        Scanner s = new Scanner(System.in);
        System.out.println("What is the student's name;");
        String n = s.nextLine();
        System.out.println("What is the student's age;");
        int b = s.nextInt();
        System.out.println("What is the student's grade;");
        int g = s.nextInt();
        Student nStudent = new Student(n, b, g);
        Link newStudent = new Link(nStudent);
        newStudent.next=first;
        first=newStudent;
        ll.add(nStudent);
    }

    public static Link findStudent() {
        Scanner sc = new Scanner(System.in);
        System.out.println("What is the student's name?");
        String n = sc.nextLine();
        Link current = first;
        String name = Student.getName();
        while (name!= n) {
            if (current.next==null)
                return null;
            else
                current=current.next;
        }
        return current;
    }

    public static void change () {
        Scanner sc = new Scanner(System.in);
        Link h = findStudent();
        System.out.println("If you want to change his name press 1;");
        System.out.println("If you want to change his age press 2;");
        System.out.println("If you want to change his grade press 3;");
        int l = sc.nextInt();
        if (l==1) {
            System.out.println("What name do you want the student to have?");
            String newname = sc.nextLine();
            Student.setName(newname);

        } else if (l==2) {
            System.out.println("What age do you want the student to have?");
            int j = sc.nextInt();
            Student.setAge(j);
        }
        else if (l==3) {
            System.out.println("What grade do you want the student to have?");
            int e = sc.nextInt();
            Student.setGrade(e);
        }
    }

    public static void show() {
        System.out.println(ll);
    }
}
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Tom
What is the student's age;
16
What is the student's grade;
90
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Eric
What is the student's age;
16
What is the student's grade;
91
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
3
[Name: Eric Age: 16 Grade: 91, Name: Eric Age: 16 Grade: 91]
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
您会注意到,在课程中,我多次编写相同的代码,但这是因为我无法找到一种方法,在执行命令后,我可以返回主菜单,并且列表的内容不会丢失。 显然,我的add方法是错误的,当我执行程序时,输出如下:

输出

class Student {
    private static String name;
    private static int age;
    private static int grade;

    public Student (String n, int a, int g) {
        setName(n);
        setGrade(g);
        setAge(a);
    }

    public static void setName(String n) {
        name=n;
    }

    public static void setGrade(int g) {
        grade=g;
    }

    public static void setAge(int a) {
        age=a;
    }

    public int getAge() {
        return age;
    }

    public int getGrade() {
        return grade; 
    }

    public static String getName() {
        return name;
    }

    public String toString() {
        return "Name: " +name+ " Age: " +age+ " Grade: " +grade; 
    }
}
import java.util.*;
class List {
    private static LinkedList<Student> ll = new LinkedList<Student>();
    private static Link first;
    public List() {
        first=null;
    }

    public static void addStudent() {
        Scanner s = new Scanner(System.in);
        System.out.println("What is the student's name;");
        String n = s.nextLine();
        System.out.println("What is the student's age;");
        int b = s.nextInt();
        System.out.println("What is the student's grade;");
        int g = s.nextInt();
        Student nStudent = new Student(n, b, g);
        Link newStudent = new Link(nStudent);
        newStudent.next=first;
        first=newStudent;
        ll.add(nStudent);
    }

    public static Link findStudent() {
        Scanner sc = new Scanner(System.in);
        System.out.println("What is the student's name?");
        String n = sc.nextLine();
        Link current = first;
        String name = Student.getName();
        while (name!= n) {
            if (current.next==null)
                return null;
            else
                current=current.next;
        }
        return current;
    }

    public static void change () {
        Scanner sc = new Scanner(System.in);
        Link h = findStudent();
        System.out.println("If you want to change his name press 1;");
        System.out.println("If you want to change his age press 2;");
        System.out.println("If you want to change his grade press 3;");
        int l = sc.nextInt();
        if (l==1) {
            System.out.println("What name do you want the student to have?");
            String newname = sc.nextLine();
            Student.setName(newname);

        } else if (l==2) {
            System.out.println("What age do you want the student to have?");
            int j = sc.nextInt();
            Student.setAge(j);
        }
        else if (l==3) {
            System.out.println("What grade do you want the student to have?");
            int e = sc.nextInt();
            Student.setGrade(e);
        }
    }

    public static void show() {
        System.out.println(ll);
    }
}
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Tom
What is the student's age;
16
What is the student's grade;
90
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Eric
What is the student's age;
16
What is the student's grade;
91
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
3
[Name: Eric Age: 16 Grade: 91, Name: Eric Age: 16 Grade: 91]
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3

为什么我在类中添加一个学生时,它是重复的?

我认为你的问题是,你的Student.class是静态的

private static String name;
private static int age;
private static int grade;
这一部分告诉java,您只需要一个变量/类。因此,您的链表只存储对相同静态字段的2个引用


您需要删除static关键字。

因为您在学生课堂上使用的是静态字段

private static String name;
private static int age;
private static int grade;
静态字段不属于实例,而是属于类本身。 无论您创建了多少个学生实例(使用
new
关键字),
static
字段的值将在他们之间共享

您必须删除学生类中的
static
关键字。
请参阅官方文档:

所有问题都是由于您决定在
学生
课堂上使用
静态
变量造成的。这意味着,无论您创建了多少
Student
对象,整个类中每个变量只有一个副本

使它们非静态。这意味着您必须在
Student
类中删除
static
的getter和setter

列表
类中,可以从静态上下文访问getter,例如
Student.getName()
。您需要将对象存储在
链接中
并将其强制转换为
学生
。然后,您将能够对其调用
getName()

另一方面,
链接
类应该是一个泛型类,例如
类链接
,这样当您在
列表
类中使用它时,您可以将其用作
链接
,因此在引用它所持有的
对象时不必强制转换它(它将持有一个
t

change
中,您将需要执行类似的操作--对于
findStudent
找到的
Student
引用的
Student,调用该Student对象上的setter,而不是在静态上下文中调用它


此外,在
中查找学生
,而不是
=
==

但是如果我删除静态引用,我会有其他多个错误。不用担心,IDE正在帮助您。您还必须从setter/getter函数中删除静态限定符。例如:publicstaticvoidsetgrade这很重要,你要理解static的真正含义,慢慢来。但是如果我删除静态引用,我会出现错误,比如:非静态方法可以引用静态内容你必须从getter和setter中删除static关键字。这是因为您无法从静态方法访问非静态字段。如果您有兴趣了解更多关于static关键字的信息,可以参考以下文档:如何修复change方法中的bug?