2014-10-19 5 views
0

Мне недавно пришлось написать программу для моего университетского класса программирования. Через несколько часов i , наконец, закончил его, и все сработало просто отлично (так я думал). Программа должна содержать два класса, один из которых (основной) BookTest должен создать объект, а затем вызвать все методы из класса Book.The заключается в том, что атрибуты (id, title, author, dateOfPublication) не должны быть static.Is есть способ заставить его работать без атрибутов, являющихся статическими. Это два класса, где я получаю ошибки, потому что у меня нет атрибутов static.Everywhere, где мои атрибуты появляются в методах, он дает мне ошибку, не может сделать статическую ссылку на нестационарный метод methodname() из типа Book.Every help is очень ценим!Когда использовать статические атрибуты?

import java.util.Date; 
import java.util.Scanner; 
import java.text.*; 

public class Book 
{ 
private int id; 
private String title; 
private String author; 
private Date dateOfPublication; 

public static final String DATE_FORMAT = "dd.MM.yyyy"; 

//--- constructors --- 
public Book(int ID,String TITLE,String AUTHOR,Date DATEOFPUBLICATION){ 
    setId(ID); 
    setTitle(TITLE); 
    setAuthor(AUTHOR); 
    setDateOfPublication(DATEOFPUBLICATION); 
    } 
    public Book() { 
} 

    /** Returns the age of the book in days since publication */ 
    public int age(){ 
    Date date = new Date(); 
    long difference = date.getTime() - Book.getDateOfPublication().getTime(); 
    long differenceDays = difference/(1000 * 60 * 60 * 24); 
    return (int) differenceDays; //this is to avoid compiler errors, replace it! 
    } 
    /** Returns a String representation of the book */ 
    public String toString(){ 
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy"); 
    String dateAsString = simpleDateFormat.format((Book.getDateOfPublication())); 
    String Documentation; 
    Documentation = String.valueOf(Book.getId())+", " + Book.getTitle()+", " + Book.getAuthor()+",  "  + dateAsString;  
    return Documentation; //this is to avoid compiler errors, replace it! 
} 
/** Reads all book data from user input */ 
public void input(){ 
    Scanner scn = new Scanner(System.in); 
    System.out.println("Please enter id: "); 
    Book.setId(scn.nextInt()); 
    scn.nextLine(); 
    System.out.println("Please enter title: "); 
    Book.setTitle((scn.nextLine())); 
    System.out.println("Please enter author: "); 
    Book.setAuthor(scn.nextLine()); 
    System.out.println("Please enter Date of Publication: "); 
    String string_dateOfPublication = scn.nextLine(); 
    Book.setDateOfPublication(stringToDate(string_dateOfPublication)); 
    scn.close(); 
    } 
    //--- Get-/Set-methods --- 


    public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
//--- helper methods -- DO NOT CHANGE ------------------------------------ 
/** Converts the Date object d into a String object */ 
public static String dateToString(Date d) 
{ 
    SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT); 
    return fmt.format(d); 
} 

/** Converts the String object s into a Date object */ 
public static Date stringToDate(String s) 
{ 
    Date r = null; 
    try { 
     SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT); 
     r = fmt.parse(s); 
    } catch (ParseException e){ 
     System.err.println(e); 
     System.exit(1); 
    } 
    return r; 
} 
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 Date getDateOfPublication() { 
    return dateOfPublication; 
} 
public void setDateOfPublication(Date dateOfPublication) { 
    this.dateOfPublication = dateOfPublication; 
} 
} 



public class BookTest{ 

public static void main (String []args){ 

    Book Bookobj = new Book(); 
    Bookobj.input(); 
    System.out.println(Book.age()+" Tage alt."); 
    System.out.println(Bookobj.toString()); 

    } 

} 

ответ

1

Вы должны прочитать о static members. A (упрощенный) способ думать об этом заключается в том, что нестатический член (поле, метод) является тем, который предоставляется экземпляром , в то время как статическим элементом является тот, который предоставляется классом .

В вашем классе Book в каждой книге есть имя, автор и т. Д., Которые являются свойствами, принадлежащими определенной книге (экземпляру). Тогда имеет смысл, что они должны быть нестационарными. То же самое относится к методам их получения и настройки, а также ко всем другим конкретным экземплярам.

Методы преобразования строк и дат не относятся к экземпляру. Класс Book предоставляет их. Таким образом, они называются

, что имеет смысл, поскольку конвертация не является специфичной для книги функцией \ property.

В вашем main, вы создаете экземпляр Book:

Book bookObj = new Book(); // instance names should start with a lowercase 

, а затем вы хотите, чтобы пользователь вводить данные для этой конкретной книги, так что вам нужно позвонить

bookObj.input(); // Not Book.input() 

и то же самое для последующих операций.

Внутри определения класса (давайте посмотрим на input), вы вызываете не-статические методы сеттер, как будто они являются статическими:

Book.setId(...); 

В самом деле, вы хотите установить идентификатор для этого конкретного пример. Так что вам нужно, чтобы написать это

this.setId(...); 

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

setId(...); 

как вызвавший метод автоматически подразумеваются.

+0

С вашим ответом я смог понять это. Теперь я понимаю, почему мои атрибуты не должны быть статическими и как изменить другой код, чтобы он работал. Спасибо миллион! – Kisos

1

Вы вызываете свои геттеры и сеттеры по имени класса, которое вы называете статическим методом. Поскольку вы вызываете их по имени класса, компилятор ищет статический класс под названием Book OUTSIDE того класса, в котором вы находитесь. Поскольку вы вызываете их изнутри самого класса, вам не нужно делать это как компилятор уже знает, где искать эти методы. При вызове метода класса изнутри одного класса просто введите имя метода так.

getDateOfPublication()