不理解 类 之间变量之间的关系

Not understanding relationship between variables between classes

我是新来的所以放轻松。我尝试了搜索功能,但找不到太多(最接近的响应是 python 和 C++)。我对从 class 到 class 传递 "variables"(或者它是参数?)有一个脆弱的理解,想在这里 post 看看是否有人可以帮助阐明这一点.我正在在线 class 并且我已经 post 在下面编辑了我的代码。我们被要求输入课程名称和讲师姓名并将其输出,此外还有另一个静态的课程和讲师姓名(不接受任何输入)。我无法理解 courseName、名称(在 GradeBook 和 GradeBookTest 中)和 setCourseName 之间的关系。我已经尝试重新阅读我书中的部分(这不是最好的),观看 youtube 视频等,但我只是不关注这里。我觉得我也快理解了!

首先, GradeBookTest中的"String name"和GradeBook的构造函数中的"String name"有关系吗?他们是一样的吗"objects"?

还有,为什么setCourseName方法中的"String name"一定要放在括号里?它已经在构造函数中初始化,因此方法 setCourseName 应该能够在没有它的情况下引入字符串名称,对吧?

看来操作顺序是:

  1. Class GradeBookTest 运行并初始化 "String name"。
  2. 它将用户从第一个问题输入的内容分配给名称。名称现在是用户输入内容的占位符。
  3. GradeBook 中和构造函数括号中的名称现在发生了什么变化?
  4. 似乎 "object" setCourseName 被设置为 GradeBookTest class(用户输入)
  5. 中的任何名称
  6. 我只是不确定构造函数通过下一个方法 (setCourseName) 发生了什么,就传递的字符串名称而言。有人可以解释一下这里发生了什么吗?

    public class GradeBook
    {
       private String courseName; // course name for this GradeBook
       private String instructorName; // STEP A - Name of the instructor for the course
    
       // constructor initializes courseName with String argument
       public GradeBook( String name, String teacher ) { // constructor name is class name
         setCourseName(name); // initializes courseName
          setInstructorName(teacher); // STEP C - initializes instructorName
      } // end constructor
    
    
       // method to set the course name
       public void setCourseName( String name ) {
          courseName = name; // store the course name
       } // end method setCourseName
    
    
       // method to retrieve the course name
       public String getCourseName() {
          return courseName;
       } // end method getCourseName
    
    
       // display a welcome message to the GradeBook user
       public void displayMessage() {
          // this statement calls getCourseName to get the 
          // name of the course this GradeBook represents
          System.out.printf( "Welcome to the grade book for\n%s!\n", 
             getCourseName() );
          System.out.printf( "This course is presented by:\n%s!\n",
             getInstructorName() );
       } // end method displayMessage
    
    
       // method to set instructor name
       public void setInstructorName( String teacher) {
    
         //prompt for and read instructor name
           instructorName = teacher; //stores the instructor name
       } //end method setInstructorName
    
       //method to retreive instructor name
       public String getInstructorName() { 
           return instructorName;
       } // end method getCourseName
    
    } // end class GradeBook
    

现在开始成绩册测试

import java.util.Scanner;

public class GradeBookTest
{
   // main method begins program execution
   public static void main( String[] args )
   {

      String teacher;
      String name;

      Scanner input = new Scanner(System.in); // initialize scanner for input from user
      System.out.printf("Please enter the course name: ");
      name = input.nextLine();
      System.out.printf("Please enter the instructor's name: "); // prompt for input
      teacher = input.nextLine(); // obtain user input of the instructor name  

      // create GradeBook object
      GradeBook gradeBook1 = new GradeBook(name, teacher);
      GradeBook gradeBook2 = new GradeBook(
         "CIS 254 - Intro to object-oriented programming", "Professor Green" );

      gradeBook1.displayMessage();
      System.out.println() ;
      gradeBook2.displayMessage();
      System.out.println();
      System.out.printf("Programmed by Grant Ognibene!\n");

   } // end main
} // end class GradeBookTest

谢谢!

首先执行的是 GradeBookTest class 中的 main 方法。 你写了

String name; name = input.nextLine();

因此 name 将获得值并将其存储在常量池中。

在创建对象时,您将 name 的值传递给行

中的构造函数

GradeBook gradeBook1 = new GradeBook(name, teacher);

name 的值将分配给 GradeBook 的构造函数的局部变量 (name)。 在构造函数中你再次调用 setter 方法 setCourseName.

字符串 name 是 setter 中的局部变量 method.so 值将分配给 name 变量,然后您将其分配给 instance variable courseName

我们最终只会在常量池中创建单个条目 GradeBook class。 变量将被创建多次,因为它们是局部变量,但字符串文字只会被插入常量池一次。