[英]How to Modify Another Object in Another Class in 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也一样,当我键入它们时,其余的可能也一样。
救命?
从您的学生班级中删除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);
欢迎使用StackOverflow和Java!
编辑:我不相信给您确切的代码会帮助您解决问题而又不会筹集更多的钱。 既然您要求外行的条款,我将简要解释您为什么遇到问题:)
Java(通常是面向对象的程序设计)的美在于,一切都是分离的。 那是一种祝福和诅咒。 您有一个名为StudentData2
类(也称为对象),该类使用Scanner
对象从学生那里获取信息。
该Scanner
“属于” StudentData2
类。 没有人可以使用,看到它甚至知道它的存在。 因此,当您创建StudentData2Demo
类时,您基本上是从头开始的。 这个新类仅了解其自己文件中的变量和字段。
现在,在Java中,有很多方法可以将数据从一个类传递到另一个类,并且绝对有可能在两个类中都使用Scanner
,但是我强烈建议您对对象进行更多研究,面向程序设计。 这些概念非常强大,因此需要一些学习才能真正理解它们。
这些资源并没有给我薪水,但是作为我自己一个相当新的开发人员,我确实有一些建议。
首先,我使用了很棒的在线课程来学习Java编程。 Tim Buchalka教授一门有关Java的非常深入的课程,该课程从一开始就开始,但逐步发展为高级主题。 您可以在这里找到他的Complete Java Masterclass 。
另外, BlueJ非常适合非常小的项目,但是如果您打算超越基础知识,我建议您使用完整的Java IDE。 IntelliJ IDEA不仅免费,而且比Eclipse或Netbeans还成熟一些,但可以自由选择最适合的方式。
发生这种情况是因为您尝试访问的字段不是该类的直接成员。 若要解决此问题,您需要在StudentData2 class
进行一些更改。不需要main方法。
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对象设置属性并调用方法。
理想情况下,StudentData2类应为模型类,并且所有逻辑都应进入处理类。
两个主要方法表示两条不同的路径,在StudentData2中不需要主要方法。
要直接回答您的确切问题,“要修改另一个对象,您必须引用该对象”。 在这里您没有它,因为您尚未在StudentData2上创建对象
您的程序应该看起来像这样。
公共课程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 + "]";
}
}
和演示类作为
导入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());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.