简体   繁体   English

从单独的类中调用mutator方法

[英]Call a mutator method from a separate class

I have a constructor class as so: 我有一个构造函数类如下:

public class Student
{
    // Declare variables
    public int studentID;
    public String courseName;
    public int courseScore;
    public char courseGrade;

    // Default constructor
    public Student()
    {
       studentID = 1;
       courseName = "CIS 2085";
       courseScore = 89;
    }


    //========================================

    // Constructor with parameters
    public Student(int id, String course, int score)
    {
       setStud(id, course, score);
    }


    //========================================

    public String toString()
    {
       return (studentID + " " + courseName + " " + courseScore);
    }


    //========================================

    public void setStud(int id, String course, int score)
    {
       studentID = id;
       courseName = course;
       courseScore = score;
    }


     //========================================

    public int getStudentID()
    {
       return studentID;
    }


    //========================================

    public String getCourseName()
    {
       return courseName;
    }


    //========================================

    public int getCourseScore()
    {
       return courseScore;
    }


    //========================================

    public char getCourseGrade()
    {
       return courseGrade;
    }


    //========================================

    public static char calculateGrade(int courseScore)
    {
       if (courseScore >= 94)
           courseGrade = 'A';

       else if ((courseScore >= 85) && (courseScore <= 93))
           courseGrade = 'B';

       else if ((courseScore >= 75) && (courseScore <= 84))
           courseGrade = 'C';

       else if ((courseScore >= 65) && (courseScore <= 74))
           courseGrade = 'D';

       else
           courseGrade = 'F';

       return courseGrade;
    }

    //========================================

}

And I have my implementation class so far, like this: 到目前为止,我有我的实现类,如下所示:

import java.util.*;

public class StudentImplementation
{
    // Sllow 'console' to receive input from the user
    static Scanner console = new Scanner(System.in);

    // Method main
    public static void main(String[] args)
    {
        // Declare variables

        // Object 1: first. Uses the default constructor.
        Student first = new Student();

        //System.out.println(first);

        // Object 2: second.
        Student second = new Student(3, "Advanced Java Programming", 83);

        //System.out.println(second);

        // Use calculateGrade method to receive grade for object 1

        char grade = Student.calculateGrade(first.getCourseScore);
        System.out.println(grade);
    }
}

So I am trying to use my calculateGrade method to output the appropriate grade based on my objects courseScore. 因此,我尝试使用我的calculateGrade方法根据我的对象courseScore输出相应的等级。

The Student class is in a separate file from my implementation class. Student类与我的实现类位于一个单独的文件中。

When I run this program I receive the error: 当我运行此程序时,我收到错误:

Exception in thread "main" java.lang.NoSuchMethodError: Student.calculateGrade(I)C
    at StudentImplementation.main(StudentImplementation.java:27)

Change your calculateGrade method to: 将calculateGrade方法更改为:

public char calculateGrade() {
    courseScore = this.getCourseScore(); // This refers to the student
                                         // from whom you called the
                                         // calculaGrade() method -->
                                         // first.calculateGrade()
    if (courseScore >= 94) {
        courseGrade = 'A';
    } else if ((courseScore >= 85) && (courseScore <= 93)) {
        courseGrade = 'B';
    } else if ((courseScore >= 75) && (courseScore <= 84)) {
        courseGrade = 'C';
    } else if ((courseScore >= 65) && (courseScore <= 74)) {
        courseGrade = 'D';
    } else {
        courseGrade = 'F';
    }
    return courseGrade;
}

Then just use first.calculateGrade(). 然后只需使用first.calculateGrade()。 And print the result: 并打印结果:

Student first = new Student();
char firstStudentGrade = first.calculateGrade();
System.out.println(firstStudentGrade);

PS: method names do not start with capital letters ;) PS:方法名称不以大写字母开头;)

Here's a cleaner version of your Student class that does what you want it to do. 这是您的Student课程的更干净版本,可以完成您希望它做的事情。 I've taken out the unnecessary variables and methods, and cleaned it up a bit. 我已经取出了不必要的变量和方法,并将其清理了一下。

The reason I did this is because right now, your code contains a lot of things that don't make sense (eg. adding a parameter to a method so you can set the parameters value in the method itself and then return it, using a setter method in your constructor). 我这样做的原因是因为现在,你的代码包含很多没有意义的东西(例如,在方法中添加一个参数,这样你就可以在方法本身设置参数值然后返回它,使用一个构造函数中的setter方法)。

public class Student {
    public int studentID;
    public String courseName;
    public int courseScore;

    public Student() {
        this(1, "CIS 2085", 89);
    }

    public Student(int id, String course, int score) {
        this.studentID = id;
        this.courseName = course;
        this.courseScore = score;
    }

    @Override
    public String toString() {
        return studentID + " " + courseName + " " + courseScore;
    }

    public int getStudentID() {
        return studentID;
    }

    public String getCourseName() {
        return courseName;
    }

    public int getCourseScore() {
        return courseScore;
    }


    public char getCourseGrade() {
        if (courseScore >= 94) {
            return 'A';
        } else if (courseScore >= 85 && courseScore <= 93) {
            return 'B';
        } else if (courseScore >= 75 && courseScore <= 84) {
            return 'C';
        } else if (courseScore >= 65 && courseScore <= 74) {
            return 'D';
        }
        return 'E';
    }

}

Here's an example implementation to go along with that: 以下是一个示例实现:

public class StudentImplementation {

    public static void main(String[] args) {
        Student first = new Student(); //default constructor
        System.out.println(first.getCourseGrade());
        Student second = new Student(3, "Advanced JAVA Programming", 83);
        System.out.println(second.getCourseGrade());
    }

}

Use: 使用:

public char CalculateGrade()
{
    if (this.courseScore >= 94)
        courseGrade = 'A';

    else if ((this.courseScore >= 85) && (this.courseScore <= 93))
        courseGrade = 'B';

    else if ((this.courseScore >= 75) && (this.courseScore <= 84))
        courseGrade = 'C';

    else if ((this.courseScore >= 65) && (this.courseScore <= 74))
        courseGrade = 'D';

    else
        courseGrade = 'F';

    g = courseGrade;

    return g;
}

And call it as: 称之为:

System.out.println(first.CalculateGrade());

After creating your Student object, simply call your method... 创建Student对象后,只需调用您的方法......

Student first = new Student();
first.CalculateGrade();

And remove the g parameter from CalculateGrade(char gg) . 并从CalculateGrade(char gg)删除g参数。 You don't need it. 你不需要它。

Change the statement 更改声明

char grade = Student.calculateGrade(first.getCourseScore);

to

char grade = Student.calculateGrade(first.getCourseScore());

You missed the () during the method call. 你在方法调用期间错过了()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM