如何在Java中修改另一个类中的另一个对象?

时间:2018-06-13 04:05:01

标签: java

我是Java的新手,在阅读其他解决方案时很困惑。在我的案例中,我可以获得一些外行人的条款吗?

我正在制作一个程序,该程序将从学生那里获取信息,并能够打印完整的报告或打印出学生的全名。

我使用BlueJ编写代码。

以下是我到目前为止接收信息的第一堂课。

import java.util.Scanner;

public class StudentData2 {
public static final Scanner input = new Scanner(System.in);
public static void main(String[] args){

    long student_id;
    String firstName;
    String lastName;
    String classification;
    String fullGender = "none";
    char gender = 'n';
    double gpa = 0.0;


    switch (fullGender.toLowerCase()) {
        case("female"): gender = 'f';
            break;
        case("male"): gender = 'm';
            break;
        default: System.out.println("That's not a selectable gender.");
    }


    boolean isPassing;

    if (gpa > 2.0) {
        isPassing = true;
    }else {
       isPassing = false;
    }

    char averageGrade;

    if (gpa == 4.0) {
        averageGrade = 'A';
    }
        if(gpa >= 3.0){
            averageGrade = 'B';
        }
            if (gpa >= 2.0){
               averageGrade = 'C'; 
            }
                if (gpa >= 1.00) {
                    averageGrade = 'D';
                }else{
                        averageGrade = 'F';}


        }
    }

现在我想创建一个名为' StudentData2Demo'的另一个类,我希望它打印出一些问题,然后输入到终端的任何内容,它将它放入到对象的值中其他课程。

这是我到目前为止所拥有的。

import java.util.Scanner;
public class StudentData2Demo{
public static void main(String[] args) {
    StudentData2 student = new StudentData2();

   System.out.println("What is your First Name?");
    student.firstName = input.next();


}
}

然而,当我尝试引用'输入'扫描仪是我在另一个类中制作的,它说它无法找到那个变量。这对于firstName也是一样的,当我在那里输入时,其余可能是相同的。

帮助?

4 个答案:

答案 0 :(得分:2)

从学生班中删除main()......它应该是以下几行。

public class StudentData2 { 

//remove the main()... you execute the main in demo, not here.

//you store your student data here
long student_id;
String firstName;
String lastName;
String classification;
String fullGender = "none";
char gender = 'n';
double gpa = 0.0;
boolean isPassing = false;
char averageGrade ='?';
//recommend to put all the fields at the top (easier to see)

//you can create methods to change the parameters in the class 
public boolean setGender(){ 

    Scanner input = new Scanner(System.in);

    System.out.println("Enter gender (male/female):");
    fullGender = input.next(); //you get the input from keyboard
    switch (fullGender.toLowerCase()) {
           case("female"): gender = 'f';
        return true;
           case("male"): gender = 'm';
        return true;
        default: System.out.println("That's not a selectable gender.");
           fullGender ="none"; //reset it back to default.
           return false;
}

//same idea for creating methods for the other  fields like grades.

public boolean setGrades(){

    Scanner input = new Scanner(System.in);

    System.out.println("Enter grades:");
    gap = input.nextDouble(); //remember to do your Exception check here !!

    isPassing = (gpa > 2.0); // no need if else loop here.
                             //anything more than 2 is true.


    if (gpa == 4.0) {
        averageGrade = 'A';
    }
    else if(gpa >= 3.0){ // we use an else if here... 
                         //if not it'll get replaced.
        averageGrade = 'B';
    }
    else if (gpa >= 2.0){
        averageGrade = 'C'; 
    }
    else if (gpa >= 1.00) {
        averageGrade = 'D';
    }else{
        averageGrade = 'F';  
    }
}//close bracket for method setGrades()
}//close bracket for class

更新演示类中的字段,只需调用

即可
 boolean isGenderValid = student.setGender(); //the idea is encapsulation 
                                              // you hide the implementation detail away from the caller.

 //you can set grades similarly
student.setGrades();

访问该字段,您可以使用

System.out.println("student's gender is " + student.fullGender);

答案 1 :(得分:1)

欢迎使用StackOverflow和Java!

  

修改:我不相信为您提供准确的代码可以帮助您解决问题,而无需再增加一百个。因为你要求   外行人的条款,我只是简单地解释你为什么会遇到问题   :)

Java(和一般的面向对象编程)之美在于一切都是分开的。这是一种祝福和诅咒。您有一个名为StudentData2的类(也称为对象),它使用Scanner对象从学生那里获取信息。

Scanner"属于"到StudentData2班。没有人可以使用它,看到它,甚至不知道它存在。因此,当您创建StudentData2Demo课程时,您基本上是刚开始的。这个新类只知道它自己文件中的变量和字段。

现在,在Java中,有很多方法可以将数据从一个类传递到另一个类,并且绝对有可能在这两个类中使用Scanner,但我强烈建议您这样做关于面向对象编程的更多研究。这些概念非常强大,因此需要一些学习才能真正理解它们。

<小时/> 进一步的帮助

我没有得到任何这些资源的报酬,但作为一个相当新的开发者,我确实有一些建议。

首先,我使用了一个很棒的在线课程来学习Java编程。 Tim Buchalka教授一门非常深入的Java课程,该课程从一开始就开始,但是进展到高级主题。你可以找到他的Complete Java Masterclass here

此外,BlueJ非常适合非常小的项目,但如果您计划超越基础,我建议您使用完整的Java IDE。 IntelliJ IDEA不仅是免费的,而且比EclipseNetbeans更成熟,但您可以自由选择最适合自己的人。

答案 2 :(得分:1)

这种情况正在发生,因为您尝试访问的字段不是该类的直接成员。要解决此问题,您需要在StudentData2 class中进行一些更改。不需要主方法。

import java.util.Scanner;

public class StudentData2 {
public long student_id;
public String firstName;
public String lastName;
public String classification;
public String fullGender = "none";
public char gender = 'n';
public double gpa = 0.0;
}

之后在方法中添加其余代码。确保您制作access modifier as public

现在,您可以使用第二个类中的student对象来设置属性并调用方法。

答案 3 :(得分:1)

  1. 您的StudentData2类应该是理想的模型类,并且所有逻辑都应该在处理类中。

  2. 两个主要方法表示两个不同的路径,StudentData2中不需要main方法。

  3. 要直接回答您的确切问题,请修改另一个对象,您必须引用该对象&#39;。由于您尚未在StudentData2上创建对象

  4. ,因此您无法拥有它

    你的程序应该看起来像这样。

    公共类StudentData {

    private long studentId;
    private String firstName;
    private String lastName;
    private String classification;
    private char gender;
    
    public long getStudentId() {
        return studentId;
    }
    
    
    public void setStudentId(long studentId) {
        this.studentId = studentId;
    }
    
    
    public String getFirstName() {
        return firstName;
    }
    
    
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    
    
    public String getLastName() {
        return lastName;
    }
    
    
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    
    
    public String getClassification() {
        return classification;
    }
    
    
    public void setClassification(String classification) {
        this.classification = classification;
    }
    
    
    public char getGender() {
        return gender;
    }
    
    
    public void setGender(char gender) {
        this.gender = gender;
    }
    
    
    @Override
    public String toString() {
        return "StudentData [studentId=" + studentId + ", firstName="
                + firstName + ", lastName=" + lastName + ", classification="
                + classification + ", gender=" + gender + "]";
    }    
    

    }

    Demo课程为

    import java.util.Scanner;

    公共课StudentDemo {

    public static void main(String[] args) {
    
        StudentData data = new StudentData();
        Scanner input = new Scanner(System.in); 
        boolean valid = true;
        String temp = "";
    
        while(valid){
            System.out.println("What is student ID:");          
            temp = input.nextLine();
            try {
                long id = Long.parseLong(temp);
                data.setStudentId(id);
                valid = false;
            }
            catch(NumberFormatException exception){
                System.out.println("Invalid student id.");
                continue;
            }                       
        }
    
        temp = "";      
        valid = true;
        while(valid){
            System.out.println("What is student First name:");          
            temp = input.nextLine();
            if(!temp.isEmpty()){
                data.setFirstName(temp);                
                valid = false;
            }
            else{
                System.out.println("First name cannot be empty.");
            }
        }
    
        temp = "";      
        valid = true;
        while(valid){
            System.out.println("What is student Last name:");           
            temp = input.nextLine();
            if(!temp.isEmpty()){
                data.setLastName(temp);             
                valid = false;
            }
            else{
                System.out.println("Last name cannot be empty.");
            }
        }
    
        temp = "";  
        valid = true;
        while(valid){           
            System.out.println("What is student gender:");
            temp = input.nextLine();
            switch (temp.toLowerCase()) {
                case("female"):
                case("f"):
                    data.setGender('f');
                    valid = false;
                    break;
                case("male"): 
                case("m"):
                    data.setGender('m');
                    valid = false;
                    break;
                default: 
                    System.out.println("That's not a selectable gender. Please select from f/m.");
            }
        }
    
        temp = "";  
        valid = true;
        while(valid){
            System.out.println("What is student gpa:");         
            temp = input.nextLine();
            try {
                double gpa = Double.parseDouble(temp);              
                valid = false;
    
                 if (gpa >= 4.0) {
                     data.setClassification("Passed with A");
                 }
                 else if(gpa >= 3.0){
                     data.setClassification("Passed with B");
                 }
                 else if (gpa >= 2.0){
                     data.setClassification("Passed with C");
                 }
                 else if (gpa >= 1.00) {
                     data.setClassification("Failed with D");
                 }
                 else {
                     data.setClassification("Failed with F");
                 }
            }
            catch(NumberFormatException exception){
                System.out.println("Invalid student gpa.");
                continue;
            }                       
        }       
        System.out.println("Student details you entered:"+ data.toString());
    }
    

    }