我最近不得不为我的大学编程课程编写程序。几个小时后我
终于完成了它,一切工作都很好(所以我想)。程序实际上应该包含两个类中的一个(主要)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());
}
}
答案 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(...);
因为该方法的调用者是自动隐含的。