我正处于学习java的过程中。
我一直在完成一些练习练习,并且在使用实例变量来存储对象方面有些困惑,特别是创建那些实例的“新”实例。
一个初级练习要求我建立一个项目,以便在场地进行机票预订。我被要求设置以下内容:
i)枚举类型,用于表示在场地上演的单个事件的类型。
ii)表示事件日期的(简单)类Date。
iii)(简单)类价格代表票价。
iv)一个(简单)类Venue,带有一个公共方法getSeatingCapacity(),它返回一个场地的容量。
我特意卡在这个问题上:
接下来,实现一个类Event来表示单个事件。 i)识别并实现您需要的字段和构造函数(参见上文);
v)使用你的答案a)ii)代表事件的日期;
vi)使用你的回答a)iii)代表门票价格;
vii)使用你的答案a)iv)代表场地。
给出的答案如下:
public class Event
{
private EventType eventType;
private String eventTitle;
private int numberOfAvailableTickets;
private Date eventDate;
private Price ticketPrice;
private Venue venue;
public Event(EventType typeOfEvent, String titleOfEvent, Venue venue, Date dateOfEvent, Price priceOfTicket)
{
eventType = typeOfEvent;
eventTitle = titleOfEvent;
this.venue = venue;
eventDate = dateOfEvent;
ticketPrice = priceOfTicket;
numberOfAvailableTickets = venue.getSeatingCapacity();
}
但是,我的答案如下:
private Venue location;
private String title;
private int totalTickets;
private EventType genre;
private Date date;
private Price price;
public Event(String title, int totalTickets, EventType genre)
{
location = new Venue();
this.title = title;
this.totalTickets = totalTickets
this.genre = genre;
price = new Price(90);
date = new Date("");
}
我认为我必须在构造函数中创建每个对象的实例,使用new运算符,否则它们将如何创建?然后我可以使用set方法设置新值。但似乎这是错的?任何人都可以帮忙详细说明吗?
答案 0 :(得分:2)
基本上,您可以通过以下几种方式设置这些实例参数的值:
new Date()
从当前系统时间戳创建新日期。)Setter通常用于更改值,例如设置新日期或新价格时。一种常见的方法是将实例变量保留为空值,并使用setter来更改那些需要更改的变量。
请注意,非基本类型的变量(例如,不是int
,long
等的所有内容)都是对其他对象的引用,所以基本上在设置它们时,您引用其他地方存在的对象。使用new
创建对象的新实例只会这样做并返回对该新实例的引用,即Date date = new Date()
将首先在堆上创建Date
的新实例,然后将对该实例的引用分配给变量date
。
由于我假设您对初始化程序块不太熟悉,这就是我的意思:
class SomeClass {
private int i; //will be initialized to 0
private Date date; //will be initialized to null
private String s = "hello"; //will create a new String object with the value "hello" and assign that instance to variable s
//the following block is an instance initializer block which is called before the constructor
{
date = new Date();
}
//This is a static initializer block which is called when the class is loaded,
//but which cannot be used to initialize instances
static
{
System.out.println("class has been loaded");
}
}
答案 1 :(得分:1)
考虑多个事件可能发生在同一个Venue
中。在这种情况下,多个Event
对象可以使用相同的Venue
对象。在您的代码中,每个Event
都有一个唯一的Venue
对象。如果Venue
是Event
的唯一属性(即未被其他Event
共享),则您的方法会更合适。
因此,将Venue
对象传递给Event
的构造函数或使用setVenue
方法接受Venue
对象更有意义。< / p>
答案 2 :(得分:1)
这两个都是有效的,这是一个非常简单的示例,但是想象一下Price
类有一个更复杂的设置,需要您在{{{{{}中无法访问的信息。 1}} contructor。
然后您必须设置虚拟价格并再次使用Event
来纠正错误。这需要一个额外的步骤,可以通过将已经初始化的对象传递给setPrice()
构造函数来避免。
我认为最终的好处是保持构造函数的工作简单,并且与相关。