2013-07-24 2 views
0

Я пытаюсь создать пакет Java mylib с классами Library {} и Book {}.Java: проблемы с ключевым словом this this

Вот код для класса библиотеки {}:

/* 
Create collection of books 
List books and status 
User input: 
    'B' - Borrow a book 
    'R' - Reserve a book 
    'I' - Return a book 
    'X' - Exit program 
*/ 

package mylib; 

public class Library { 

    public static void main(String[] args) { 
     Book[] MyBooks = new Book[3]; 
     Book x; 

     MyBooks[0] = new Book("The Lover's Dictionary", "Levithan, D.", 211); 
     MyBooks[1] = new Book("White Tiger", "Adiga, A.", 304); 
     MyBooks[2] = new Book("Thirteen R3asons Why", "Asher, J.", 336); 

     for (int i = 0; i < MyBooks.length; i++) { 
      x = MyBooks[i]; 
      System.out.println((i + 1) + " " + x.sTitle); 
     } 
    } 
} 

Вот код для класса Book {}:

package mylib; 

class Book { 
    // Declare fields 
    byte iStatus; 
    int iPages; 
    String sTitle, sAuthor; 
    String sBorrowedBy, sReservedBy; 
    String sDueDate, sReturnDate; 

    public static final byte BORROWED = 0, AVAILABLE = 1, RESERVED = 2; 

    // Constructor 
    public Book(String Title, String Author, int Pages) { 
     this.sTitle = Title; 
     this.sAuthor = Author; 
     this.iPages = Pages; 
     this.iStatus = this.AVAILABLE; 
    } 

    // Borrow method 
    static void borrowBook(String Borrower, String Due) { 
     if (this.iStatus == this.AVAILABLE) { 
      this.sBorrowedBy = Borrower; 
      this.sDueDate = Due; 
      this.iStatus = this.BORROWED; 
     } else if (this.iStatus == this.RESERVED 
       && this.sReservedBy == Borrower) { 
      this.sBorrowedBy = Borrower; 
      this.sDueDate = Due; 
      this.sReservedBy = ""; 
      this.iStatus = this.BORROWED; 
     } 
    } 

    /* 
    * static int reserveBook(String Borrower) { 
    * 
    * } 
    * 
    * static void returnBook(String Return) { 
    * 
    * } 
    */ 
} 

Частичные коды выше, даны профессором. Я прокомментировал пустые методы и протестировал программу, чтобы увидеть, будет ли она компилироваться.

У меня 14 ошибок с этим ключевым словам. Любая помощь?

+0

Пожалуйста, не начинайте имена переменных с большой буквы. См. Http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367 –

+0

Переменные от профессора, я изменю это как можно скорее. –

ответ

1

Поскольку вы используете это в статическом контексте он дает вам сообщение об ошибке. Попробуйте использовать следующий код:

package myLib; 

class Book { 
// Declare fields 
byte iStatus; 
int iPages; 
String sTitle, sAuthor; 
String sBorrowedBy, sReservedBy; 
String sDueDate, sReturnDate; 

public static final byte BORROWED = 0, AVAILABLE = 1, RESERVED = 2; 

// Constructor 
public Book(String Title, String Author, int Pages) { 
    this.sTitle = Title; 
    this.sAuthor = Author; 
    this.iPages = Pages; 
    this.iStatus = Book.AVAILABLE; 
} 

// Borrow method 
//Remove the static keyword 
//Refer to the remaining static variables like AVAILABLE OR BORROWED using Book and not this keyword. 
void borrowBook(String Borrower, String Due) { 
    if(this.iStatus == Book.AVAILABLE) { 
     this.sBorrowedBy = Borrower; 
     this.sDueDate = Due; 
     this.iStatus = Book.BORROWED; 
    } 
    else if(this.iStatus == Book.RESERVED && this.sReservedBy == Borrower) { 
     this.sBorrowedBy = Borrower; 
     this.sDueDate = Due; 
     this.sReservedBy = ""; 
     this.iStatus = Book.BORROWED; 
    } 

    } 
} 
+0

Спасибо, программа скомпилирована. Почему я должен использовать книгу вместо этого? –

+0

В вашей программе переменные AVAILABLE, RESERVED и BORROWED являются статичными по своей природе. Переменные можно напрямую передать, используя имя класса. Они связаны с классом, а не с объектом класса. Более того, они носят окончательный характер. Это означает, что объект не может быть изменен объектом класса, и для всех объектов доступна только одна копия переменной. Следовательно, вместо «этого» используйте «Книгу». Пожалуйста, обратитесь к ссылке, отправленной @Suresh Atta для дальнейшего понимания. – user2339071

2

Вы не можете использовать this в статическом контексте, например static методов. Почему вы делаете свой метод borrowBook() как static. Он должен быть методом экземпляра без ключевого слова static.

static методы принадлежат классу и разделяются всеми его экземплярами. Вы можете вызывать их напрямую, используя имя класса, например Book.borrowBook(....), если это произойдет, время выполнения не имеет понятия, к какому объекту this относится в этом контексте.

Read JLS.3 15.8

Ключевое слово это может быть использовано только в теле метода экземпляра, например инициализатора, или конструктора, или в инициализатор переменной экземпляра класса. Если он появляется где-то еще, возникает ошибка времени компиляции.


В вашем случае лучше сделать метод экземпляра метод borrowBook() как он изменяет состояние объекта, т.е. вызывающем модифицирует его attributes.Just изменить объявление метода и удаления static:

void borrowBook(String Borrower, String Due) {....... } 
0

это ключевое слово используется для ссылки на нестатические переменные из нестатических методов. Вы имеете в виду нестатические переменные из статического метода.

2

в этом методе

static void borrowBook(String Borrower, String Due) { 

Вы не можете использовать this в static контексте

Как я вижу, нет никакой необходимости в принятии этого метода static.

Предпочитает читать Understanding Instance and Class Members

+0

Спасибо, я рассмотрю эту статью. –

1

Я предлагаю вам использовать IDE для кодирования, так как этот вопрос будет понимать свой собственный. потому что здесь используется ошибка this в блоке static.

+0

+1 за предложение IDE :). Пропущен этот момент. –

0

просто изменить эту строку:

static void borrowBook(String Borrower, String Due) { 

к

public void borrowBook(String Borrower, String Due) { 
+0

Должен ли я также сделать это в общественном классе? –

Смежные вопросы