何时使用静态属性?

时间:2014-10-19 23:24:54

标签: java reference static attributes

我最近不得不为我的大学编程课程编写程序。几个小时后我 终于完成了它,一切工作都很好(所以我想)。程序实际上应该包含两个类中的一个(主要)BookTest应该创建一个对象,然后调用Book类中的所有方法。问题是属性( id,title,author,dateOfPublication)不应该是static.Is有一种方法可以让它在没有静态属性的情况下工作。这是我得到错误的两个类,因为我没有属性static.Everywhere我的属性出现在方法中它给我的错误不能对类型Book中的非静态方法methodname()进行静态引用非常感谢非常感谢!

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

    }

 }

2 个答案:

答案 0 :(得分:1)

您正在通过类名调用getter和setter,这就是调用静态方法的方法。因为你是通过类的名称来调用它们的,所以编译器正在寻找一个名为Book OUTSIDE的静态类。由于你是从类本身内部调用它们的,所以你不需要像编译器已经知道在哪里寻找这些方法。从同一个类中调用类方法时,只需键入方法名称即可。

getDateOfPublication()

答案 1 :(得分:1)

您应该阅读static members。一种(简化的)思考方式是非静态成员(字段,方法)是由实例提供的成员,而静态成员是由提供的成员。 >类

在您的Book班级案例中,每本书都有一个名称,作者等,这些属于特定书籍(实例)的属性。那么它们应该是非静态的。其getter和setter方法以及所有其他特定于实例的方法也是如此。

转换字符串和日期的方法并非特定于实例。班级Book提供他们。因此,它们被称为

Book.stringToDate(...);

这是有道理的,因为转换不是图书专用的功能\。

main中,您创建了Book的实例:

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

然后您希望用户输入此特定图书的数据,因此您需要致电

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

以及之后的操作相同。

在类定义中(让我们看一下input),你正在调用非静态setter方法,就好像它们是静态的一样:

Book.setId(...);

实际上,您要为此特定实例设置ID。所以你需要写的是

this.setId(...);

其中关键字this提供对您所在班级的当前实例的引用(在本例中为Book)。请注意,您可以删除关键字this并写入

setId(...);

因为该方法的调用者是自动隐含的。