对象作为实例变量 - 在哪里使用new运算符

时间:2015-01-20 11:54:05

标签: java

我正处于学习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方法设置新值。但似乎这是错的?任何人都可以帮忙详细说明吗?

3 个答案:

答案 0 :(得分:2)

基本上,您可以通过以下几种方式设置这些实例参数的值:

  • 通过将值作为参数传递给构造函数来初始化它们。
  • 通过在构造函数中创建具有默认值的新实例来初始化它们(例如new Date()从当前系统时间戳创建新日期。)
  • 在初始化程序段中或在声明期间初始化它们。

Setter通常用于更改值,例如设置新日期或新价格时。一种常见的方法是将实例变量保留为空值,并使用setter来更改那些需要更改的变量。

请注意,非基本类型的变量(例如,不是intlong等的所有内容)都是对其他对象的引用,所以基本上在设置它们时,您引用其他地方存在的对象。使用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对象。如果VenueEvent的唯一属性(即未被其他Event共享),则您的方法会更合适。

因此,将Venue对象传递给Event的构造函数或使用setVenue方法接受Venue对象更有意义。< / p>

答案 2 :(得分:1)

这两个都是有效的,这是一个非常简单的示例,但是想象一下Price类有一个更复杂的设置,需要您在{{{{{}中无法访问的信息。 1}} contructor。

然后您必须设置虚拟价格并再次使用Event来纠正错误。这需要一个额外的步骤,可以通过将已经初始化的对象传递给setPrice()构造函数来避免。

我认为最终的好处是保持构造函数的工作简单,并且相关