доступ к элементу массива объектов, Java - PullRequest
2 голосов
/ 26 ноября 2009

Я создал числовые объекты, используя оператор массива, и я могу напечатать значения, передаваемые в классе, по мере его создания, но когда я пытаюсь получить значения элемента извне класса (класса monopolygame), это не так. распознать референс - как я могу референсировать это правильно?

public class monopolygame {

    public static void main(String[] args) {

        //set up array of 18 objects    
        property properties[] = new property[18];

        //create 18 property objects and populate array
        properties[0] = new property("a","available",400,500);//create property
        properties[1] = new property("b","available",400,500);//create property 
        properties[2] = new property("c","available",200,300);//create property 
        properties[3] = new property("d","available",100,180);//create property
        properties[4] = new property("e","available",400,700);//create property
    }
}

класс недвижимости ...

public class property
{
   public static void main(String[] args)
   {
   }

   //constructor
   public property(String propertyname, String owner, double price, double rent) 
   {
        System.out.println("Property info for " + propertyname 
                           + " - Rent : £" + rent 
                           + "Price : £" + price 
                           + "owned by :" + owner);
    }   
}

Я использую этот вид ссылки в классе монополии, чтобы попытаться получить доступ к данным

if (properties[2].propertyname == "available")
{
    System.out.println("avaialble");
}
else
{
    System.out.println("sold");
}

Спасибо

Ответы [ 5 ]

3 голосов
/ 26 ноября 2009

Сначала вы должны объявить эти атрибуты в классе "property":

class property  {
    String propertyname;
    String owner;
    int    price;
    int rent;
     public Property( String somename, String owner, int price, int rent ) {
         this.propertyname = somename;
         this.owner = owner;
         this.price = price;
         this.rent = rent;
         // and so on
      }
 }

Используемый массив является локальным по отношению к методу main.

Чтобы получить доступ к нему вне области действия основного метода, вы должны объявить либо атрибут class, либо атрибут instance, например:

public class monopolygame {
    public static property properties[]; 
    public static void main(String[] args) {
    //set up array of 18 objects

    properties = new property[18];
    .....

Таким образом, вы можете получить доступ к массиву другим способом:

    public void setUp() {
         for( property p : properties ) {
             System.out.println( p.propertyname ); // etc. 

Тогда ваш код:

if (properties[2].propertyname == "available")

Будет работать.

Кстати, в Java все имена классов начинаются с прописной буквы по соглашению, поэтому оно должно быть:

Property вместо property и MonopolyGame вместо monopolygame

2 голосов
/ 26 ноября 2009

Учитывая код, который вы нам предоставили, не похоже, что вы на самом деле сохраняете значения, переданные конструктору свойств. Вот что-то немного ближе к тому, как должен выглядеть ваш класс свойств:

public class property
{
    private String propertyname;
    private String owner;
    private double price;
    private double rent;

    public String getPropertyName()
    {
        return propertyname;
    }

    public void setPropertyName(string newName)
    {
        propertyname = newName;
    }

    // more getter/setter methods here

    public property(String propertyname, String owner, double price, double rent)//constructor
    {
        this.propertyname = propertyname;
        this.owner = owner;
        this.price = price;
        this.rent = rent;

        System.out.println("Property info for " + propertyname + " - Rent : £" + rent + "Price : £" + price + "owned by :" + owner);

    }
}
1 голос
/ 26 ноября 2009

Несколько замечаний:

  • В Java для сравнения строк необходимо быть сделано с помощью метода equals(), а не ==. См. эту ссылку для объяснения того, почему использование == может работать в некоторых случаях, но этого не следует ожидать.

  • Это соглашение использовать заглавные буквы классов -> Свойство, а не свойство.

  • Избегайте смешивания и совмещения расположения кронштейнов. Используйте в конце той же строки или в начале следующей строки, но не оба одновременно. Наиболее частое использование - в конце той же строки.

0 голосов
/ 26 ноября 2009

Две проблемы сразу очевидны:

  • Вы не сохраняете аргументы, переданные конструктору property, в полях этого класса.
  • После этого вы пытаетесь сравнить строки по ссылке (или по идентификатору , через ==), а не по значению ( через String#equals(String)). Если вы не интернировали строки через String#intern(), два разных экземпляра String с одинаковым символьным содержимым не будут сравниваться как равные через ==. Это сравнение рассматривает только адреса памяти ссылок на объекты, которые, скорее всего, будут указывать на два разных String экземпляра, каждый из которых имеет свой адрес.

Поскольку этот вопрос выглядит как домашнее задание, отметьте его как таковой.

0 голосов
/ 26 ноября 2009

Вам необходимо добавить публичный метод для доступа к внутреннему классу монополии. Это основной аспект вашего вопроса.

Но в целом ваш код не является правильным способом работы в Java. Например, имена классов должны быть заглавными. Пустое главное во втором классе бессмысленно. Вам нужно больше узнать об основных вещах Java, я отвечу на ваш вопрос, потому что я думаю, что вы могли бы многому научиться здесь, но я предлагаю вам ознакомиться с учебниками, описывающими основы Учебник по Java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...