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

时间:2015-02-26 06:00:25

标签: java variables parameters constructor relationships

我是新来的,所以放轻松。我尝试了搜索功能但找不到太多(最接近的响应是在python和C ++中)。我对从类到类传递“变量”(或者它是参数?)有一个脆弱的理解,并想在这里发帖,看看是否有人可以帮助阐明这一点。我在网上课,我在下面发布了我的代码。我们被要求输入课程名称和教师姓名的输入并输出它,另外还有一个静态的课程和教师名称(不接受任何输入)。我无法理解courseName,name(在GradeBook和GradeBookTest中)和setCourseName之间的关系。我已经尝试重新阅读我的书中的部分(这不是最好的),观看youtube视频等,但我只是不在这里。我觉得我也非常接近理解它!

首先, GradeBookTest中的“String name”与GradeBook的构造函数中的“String name”有任何关系吗?它们是相同的“对象”吗?

另外,为什么“String name”必须在setCourseName方法的括号中?它已经在构造函数中初始化了,所以方法setCourseName应该能够在没有它的情况下引入String名称,对吗?

所以操作顺序似乎是:

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

    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
    
  6. 现在为GRADEBOOKTEST

    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
    

    谢谢!

1 个答案:

答案 0 :(得分:0)

在您的main课程中执行的第一件事是GradeBookTest方法。 你写过

String name; name = input.nextLine();

因此名称将获得价值,并将其存储在常量池中。

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

中的构造函数

GradeBook gradeBook1 = new GradeBook(name, teacher);

name&#39>的值将分配给name的构造函数的局部变量(GradeBook)。 在构造函数中,您再次调用setter方法setCourseName

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

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