2015-12-13 99 views
0

我是Java的初学者,所以对于混乱的ups非常抱歉。来自类的调用方法错误

我创建一个图书馆程序,并有4个类:图书馆,书籍,BookInterface和赞助人。

我在程序的最后几个阶段,但是我在库类中有错误消息,因为我遇到了实例问题。

我在我的所有switch语句中都收到错误消息“无法对非静态方法进行静态引用”。我试图在情况1中创建一个Library类的实例,但仍然是一条错误消息。此外,我不能将这些方法更改为静态。任何帮助深表感谢! :)

图书馆类:

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类:

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("-----------------------------------------------------"); 
} 

}

赞助类:

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."); 
} 

}

+1

除此之外,你必须在构造函数中你的'Library'类递归调用。每当你创建一个你创建另一个等等。通常不应该将所有的类逻辑放在构造函数中。 – ChiefTwoPencils

+1

你的班级'书'和'赞助人'在哪里?明显的解决方法只是将静态关键字添加到方法中,但Java是面向对象的,所以这是不好的做法。 while循环应该是一个while,显然'9'不应该退出。由你的'switch''11'判断应该退出。 – WalterM

+0

你可以放入'Book'和'Patron'的代码吗? –

回答

1

由于您正在调用Patron和Book的非静态方法,因此您必须让它们的对象调用这些方法。只能在Class上直接调用静态方法。检查下面的链接为静态成员

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

的事情要记住夫妇

  1. 构造函数应该用于创建对象只有你的库()构造做太多工作,尝试把它放在构造函数之外。
  2. 您的情况11没有退出循环,我在那里添加了System.exit(0)。
  3. 使用input.close()关闭扫描仪对象
  4. 在代码中尝试一些异常处理以确保安全。
  5. 在Java中,惯例是在命名非静态字段和方法时保留第一个字母很小。检查此链接https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

下面是更正后的代码

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); 
      } 
     } 
    } 
}