简体   繁体   English

从类中调用方法错误

[英]Calling methods from classes error

I'm a beginner at Java so sorry for the mess ups. 我是Java的初学者,为您的混乱感到抱歉。

Im creating a Library program and have 4 classes: Library, Book, BookInterface and Patron. 我正在创建一个Library程序,并有4个类:Library,Book,BookInterface和Patron。

I'm in the last couple of stages of the program however I have error messages in the Library class as I'm having trouble with instances. 我处于程序的最后两个阶段,但是由于遇到实例问题,我在Library类中遇到了错误消息。

I got the error message "Cannot make a static reference to the non-static method" in ALL of my switch statements. 我在所有switch语句中都收到错误消息“无法对非静态方法进行静态引用”。 I tried to create an instance of the Library class in case 1 but still an error message. 在情况1中,我尝试创建Library类的实例,但仍然出现错误消息。 Also I can't change those methods to static. 我也不能将这些方法更改为静态。 Any help is much appreciated! 任何帮助深表感谢! :) :)

Library class: 图书馆课:

import java.awt.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner; 
import java.util.Collections; 
public class Library 
{

public static void main(String[] args)
{
    //create new library 
    Library newLibrary = new Library();     
}

public Library()
{
    Library library = new Library(); 
    Scanner input = new Scanner(System.in);
    int choice = 0;
    System.out.println("********************Welcome to the Public Library!********************");
    System.out.println("              Please Select From The Following Options:               ");
    System.out.println("**********************************************************************");

    while(choice != 9)
    {
        System.out.println("1: Add new patron");
        System.out.println("2: Add new book");
        System.out.println("3: Edit patron");
        System.out.println("4: Edit book");
        System.out.println("5: Display all patrons");
        System.out.println("6: Display all books");
        System.out.println("7: Check out book");
        System.out.println("8: Check in book");
        System.out.println("9: Search book");
        System.out.println("10: Search Patron");
        System.out.println("11: Exit");
        choice = input.nextInt();


    switch(choice)
    {
    case 1: //Add new patron
            //ERROR: Patron cannot be resolved or is not a field
            library.Patron.newPatron(); 
            break; 

    case 2: //Add new book
            //ERROR: Cannot make a static reference to the non-static method
            Book.addBook(); 
            break; 

    case 3: //Edit patron name
            Patron.editName(); 
            break; 

    case 4: //edit book
            //ERROR: Cannot make a static reference to the non-static method
            Book.editBook(); 
            break;  

    case 5: //display all patrons   
            System.out.println(Book.UserList); 
            break; 

    case 6: //display all books 
            //System.out.println(Book.OrigBookList); 
            Book.libraryInventory();
            //Book.bookStatus()
            break; 

    case 7: //check out a book
            //ERROR: Cannot make a static reference to the non-static method
            Patron.CheckOutBook(); 
            break; 

    case 8: //check in a book
            //ERROR: Cannot make a static reference to the non-static method
            Patron.CheckInBook(); 
            break; 

    case 9: //search book
            //ERROR: Cannot make a static reference to the non-static method
            Patron.bookStatus(); 
            break; 

    case 10://search Patron
            Patron.searchPatron();
            break; 
    case 11: //exit program


        }
    }
}   

} }

Book class: 书本类:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Book implements BookInterface
{
Scanner input = new Scanner(System.in);

static ArrayList <String> UserList = new ArrayList<String>(); 
static ArrayList <String> BookList = new ArrayList <String> (); //display just titles// use when checking out books
static ArrayList <String> OrigBookList = new ArrayList <String> (); //keep track of all titles ever entered


public String title; 
public String author;
public String book;
public boolean checkIn;

private String status;
private String borrower; 

public Book(String t, String a)
{
    title = t; 
    author = a; 
}

//constructor create new book
public Book(String newTitle)
{
    title = newTitle;   
}


public String toString()
{
    return title + " " + author; 
}

public String getTitle() 
{
    return title;
}

public void setTitle(String title) 
{
    this.title = title;
}

public String getAuthor() 
{
    return author;
}

public void setAuthor(String author) 
{
    this.author = author;
}

public void addBook()
{
    Scanner input = new Scanner(System.in);
    Scanner inputread = new Scanner(System.in);
    System.out.print("Enter book title: ");

    String title1 = inputread.nextLine();

    Scanner input1 = new Scanner(System.in);
    System.out.print("Enter book author: ");
    String author1 = inputread.next(); 

    Book fullBook = new Book(title1, author1);  //create constructor w/ title & author
    Book book1 = new Book(title1);              //constructor w/ just title to be used to display all books
    //BookList.add(title1);
    OrigBookList.add(title1);
    setStatus("IN");    //false = checked in 
    System.out.println("-----------------------------------------------");
    System.out.println("-----" + title1 + " is now in the library!-----");
    System.out.println("-----------------------------------------------");
}

public void editBook()
{
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter original book title: ");
    String origTitle = inputread.nextLine(); 
    System.out.println("Enter edited book title: ");
    String editedTitle = inputread.nextLine();
    Collections.replaceAll(Book.UserList, origTitle, editedTitle);
    System.out.println("------------------------------------------------------");
    System.out.println(origTitle + " has been changed to " + editedTitle + "!");
    System.out.println("------------------------------------------------------");

}

public String getStatus(String book)
{
    return status; 
}

public void setStatus(String status)    
{
    this.status = status; 
}

public void setBorrower(String borrower)
{
    this.borrower = borrower; 
}

public String getBorrower(String checkPatron)
{
    return borrower; 
}

public String getBook(String checkPatron)
{
    return book; 
}

public void setBook(String bookCheckOut)
{
    this.book = bookCheckOut;  
}

public void libraryInventory()
{
    System.out.println("------------------ Library Inventory: ---------------");
    for(int i =0; i<= OrigBookList.size()-1; i++)
    {
        //Book Title: checked in/out
        System.out.println(OrigBookList.get(i) + ":" + getStatus(OrigBookList.get(i)));         
    }
    System.out.println("-----------------------------------------------------");
}

} }

Patron class: 赞助人类别:

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class Patron 
{

Scanner input = new Scanner(System.in);
private String fullName;
int bookCount = 0;  //amount books user has in pocket
int books = 0;


//constructor to "add new patron" by entering their name. 
public Patron(String newName)
{
    fullName = newName; 
}

public String toString()
{
    return fullName;
}

public String getName() 
{
    return fullName; 
}

public void CheckOutBook()
{
    //create and format due date (7days)
    GregorianCalendar returnDate = new GregorianCalendar(); 
    returnDate.add(GregorianCalendar.DATE, 7);
    Date d = returnDate.getTime();
    DateFormat df = DateFormat.getDateInstance();
    String dueDate = df.format(d);

    Scanner inputread = new Scanner(System.in);
    Scanner input = new Scanner(System.in);
    System.out.println("Enter full patron name: ");
    String borrower = inputread.nextLine(); 
    System.out.println("Enter book title to check out: ");
    String bookCheckOut = inputread.nextLine(); 
    Book checkOut = new Book(bookCheckOut);

    if(Book.BookList.contains(bookCheckOut)) 
    {
        Book.BookList.remove(bookCheckOut);
        checkOut.setStatus("OUT");     
        checkOut.setBorrower(borrower);
        Book.BookList.remove(bookCheckOut);

        System.out.println("----------" + bookCheckOut + " has been checked out!----------");
        System.out.println("-------------------BOOK STATUS:---------------------");
        System.out.println("Book Title: " + bookCheckOut);
        System.out.println("Book Status: Checked out");
        System.out.println("Borrower: " + borrower); 
        System.out.println("Due Date: " + dueDate);
        System.out.println("----------------------------------------------------");
    }

    else if (!(Book.UserList.contains(borrower)))
    {
        System.out.println("Patron is not a part of library system. Please enter patron in system.");
    }
    else if (!(Book.BookList.contains(bookCheckOut)))
    {
        System.out.println(bookCheckOut + " is not in the library. Please enter "
        + "a different book to be checked out");
    } 


}

public void CheckInBook()
{
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter book title to be checked in: ");
    String bookCheckIn = inputread.nextLine(); 
    Book checkOut = new Book(bookCheckIn);

    if((!Book.BookList.contains(bookCheckIn)) && Book.OrigBookList.contains(bookCheckIn))
    {
        Book.BookList.add(bookCheckIn);
        checkOut.setStatus("IN"); 
        System.out.println("------------------------------------------------------");
        System.out.println("-----" + bookCheckIn + " has been checked in!-----");
        System.out.println("------------------------------------------------------");

    }
    else 
        System.out.println(bookCheckIn + " is not part of the library system. Please enter "
        + "a different book to be checked in");
}

public boolean canBorrow()
{
    if(bookCount <= 3)
    {
        return true; 
    } 
    else 
    {
        return false; 
    }
}

public static void editName()
{
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter original patron full name: ");
    String origName = inputread.nextLine(); 
    System.out.println("Enter edited patron full name: ");
    String editedName = inputread.nextLine();
    Collections.replaceAll(Book.UserList, origName, editedName);
    System.out.println("------------------------------------------------------");
    System.out.println(origName + " has been changed to " + editedName + "!");
    System.out.println("------------------------------------------------------");       
}

public void newPatron()
{
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter patron full name: ");
    String name = inputread.nextLine();
    Book.UserList.add(name);        //add name to userList
    Patron patron1 = new Patron(name);


    System.out.println("-----------------------------------------------------------------");
    System.out.println("-----" + name + " has been added to the library system" + "-----");
    System.out.println("-----------------------------------------------------------------");


}

public void bookStatus()        //STOPS 
{
    Scanner input = new Scanner(System.in);
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter book title: ");
    String checkStatus = inputread.nextLine(); 
    Book status = new Book(checkStatus);

    if(Book.OrigBookList.contains(checkStatus) && status.getStatus(checkStatus) == "OUT")
    {
        System.out.println("Status: checked out");  
        System.out.println("Borrower: " + status.getBorrower(checkStatus));
    }
    else if(Book.OrigBookList.contains(checkStatus) && status.getStatus(checkStatus) == "IN")       
    {
        System.out.println("Status: checked in");
        System.out.println("Borrower: none");
    }
    else if(!(Book.OrigBookList.contains(checkStatus)))
        System.out.print("Book is not in library system. Please add the book first.");

}

public void searchPatron()      //WORKS!!! 
{
    Scanner inputread = new Scanner(System.in);
    System.out.println("Enter patron full name: ");
    String checkPatron = inputread.nextLine();
    Book search = new Book(checkPatron);

    if(Book.UserList.contains(checkPatron))
    {
        System.out.println("-------------------------------------------------");
        System.out.println("Books checked out: " + search.getBook(checkPatron)); 
        System.out.println("-------------------------------------------------");

    }
    else 
        System.out.println("Patron is not part of the library system. Please create new patron first.");
}

} }

Since you're calling non static methods of Patron and Book you have to make their objects to call these methods. 由于要调用Patron和Book的非静态方法,因此必须使其对象成为对象来调用这些方法。 Only static methods can be called directly on the Class. 只能在类上直接调用静态方法。 Check links below for details on static members 检查以下链接以获取有关静态成员的详细信息

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Couple of things to keep in mind 要记住的几件事

  1. Constructors should be used to create objects only your Library() constructor is doing too much work, try to put it outside constructor. 仅当Library()构造函数执行过多工作时,才应使用构造函数创建对象,请尝试将其放在构造函数之外。
  2. Your case 11 was not exiting from the loop, I have added System.exit(0) there. 您的案例11并未退出循环,我在那里添加了System.exit(0)。
  3. Close the Scanner object using input.close() 使用input.close()关闭Scanner对象
  4. Try some exception handling in the code to be safe. 为了安全起见,请尝试一些代码中的异常处理。
  5. In Java it's convention to keep first letter small in naming non static fields and methods. 在Java中,约定在命名非静态字段和方法时应尽量减少首字母。 Check this link https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html 检查此链接https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

Here's the corrected code 这是更正的代码

import java.awt.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.Collections;

public class Library {

    public static void main(String[] args) {
        // create new library
        Library newLibrary = new Library();
    }

    public Library() {
        Scanner input = new Scanner(System.in);
        int choice = 0;
        System.out
                .println("********************Welcome to the Public Library!********************");
        System.out
                .println("              Please Select From The Following Options:               ");
        System.out
                .println("**********************************************************************");

        while (choice != 9) {
            System.out.println("1: Add new patron");
            System.out.println("2: Add new book");
            System.out.println("3: Edit patron");
            System.out.println("4: Edit book");
            System.out.println("5: Display all patrons");
            System.out.println("6: Display all books");
            System.out.println("7: Check out book");
            System.out.println("8: Check in book");
            System.out.println("9: Search book");
            System.out.println("10: Search Patron");
            System.out.println("11: Exit");
            choice = input.nextInt();

            //creating Patron and Book objects
            Patron patron = new Patron();
            Book book = new Book();
            switch (choice) {
            case 1: // Add new patron
                    // ERROR: Patron cannot be resolved or is not a field
                patron.newPatron();
                break;

            case 2: // Add new book
                    // ERROR: Cannot make a static reference to the non-static
                    // method
                book.addBook();
                break;

            case 3: // Edit patron name
                patron.editName();
                break;

            case 4: // edit book
                    // ERROR: Cannot make a static reference to the non-static
                    // method
                book.editBook();
                break;

            case 5: // display all patrons
                System.out.println(Book.UserList);
                break;

            case 6: // display all books
                    // System.out.println(Book.OrigBookList);
                Book.libraryInventory();
                // Book.bookStatus()
                break;

            case 7: // check out a book
                    // ERROR: Cannot make a static reference to the non-static
                    // method
                patron.CheckOutBook();
                break;

            case 8: // check in a book
                    // ERROR: Cannot make a static reference to the non-static
                    // method
                patron.CheckInBook();
                break;

            case 9: // search book
                    // ERROR: Cannot make a static reference to the non-static
                    // method
                patron.bookStatus();
                break;

            case 10:// search Patron
                patron.searchPatron();
                break;
            case 11: // exit program
                //added exit(0)
                System.exit(0);
            }
        }
    }
}

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

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