2015-05-06 3 views
0

Я не слишком уверен, как это сказать, поэтому имеет смысл, но я постараюсь изо всех сил.Как использовать объект, не зная имя объекта

Скажем, у меня есть 2 класса. Мой основной класс и класс Person.

Мой главный класс будет создавать некоторые объекты из Person класса как этот

public class Example { 

    static Person bob = new Person(23);//Age 
    static Person fred = new Person(34); 
    static Person John = new Person(28); 
    //..and so on 

    public static void main(String args[]){ 

     ..    

    } 
} 

и в моем классе Person ..

public class Person{ 

    private int age; 

    public Person(int age){ 
     this.age = age; 
    } 
    public int getAge(){ 
     return this.age; 
    } 
} 

Теперь, если бы я хотел возраста Фреда, я d просто позвоните Fred.getAge();. Но, в моей программе, я не знаю, какого человека я получаю. Он случайным образом выбирает один, и мне нужно получить имя без прямого вызова объекта. Например, я бы что-то подобное в моем классе Person:

public static Object getPerson(){ 

    //Some code to get a random integer value and store it it Var 
    switch(Var){ 
    case 1: 
     return bob; 
    case 2: 
     return fred; 
    case 3: 
     return john; 
    } 
} 

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

public static void main(String args[]){ 

     System.out.println(Person.getPerson().getAge()); 

} 

То, что я думал это было бы первым вызовом getPerson(), который случайным образом возвращает bob, fred, или john, а затем он будет звонить getAge(). Так что, если getPerson() вернулся fred, то это было бы то же самое, как делают fred.getAge();

Теперь это не работает, и это был единственный способ, которым я думал, что имеет смысл для меня.

Как это сделать, чтобы он действительно делал то, что я хочу?

Я очень новичок в Java и OOP, и это мой первый опыт работы с разными объектами. Так что извините, если я использую неправильные условия и объясняю вещи странно.

+0

«Теперь это не работает, и это был единственный способ, которым я думал, что это имело смысл для меня». - Что именно означает «не работает» здесь? Имеет ли какое-либо исключение? – Smutje

+0

как вы случайно получаете человека? –

+0

Пожалуйста, объясните, что вы пытаетесь выполнить. Обычно у вас будет запрос, в котором говорится: «Получите возраст fred», таким образом, вы будете перебирать массив «Person» и находить «Fred» и печатать возраст (таким образом, вам нужно иметь объект getName()). Или вы может просто создать массив «Личности» и перебрать их и напечатать их возрасты. –

ответ

3

Изменить

public static Object getPerson(){ 

в

public static Person getPerson(){ 

Вы не можете назвать СеЬАд на объекте, так как тип объекта не имеет СеЬАда() определены.

+0

Я не понимаю почему кто-то отказался от этого ответа ... Это решает проблему ... –

1

Это может быть так, что это недоразумение, но как я интерпретировать этот вопрос заключается в следующем:

  • Вам нужно (лучше) место для хранения всех ваших Person объектов, вместо того, их как static переменных.
  • Вам нужен способ случайного выбора из того места, где вы храните эти объекты.

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

Способ сделать это через эту декларацию:

Person[] people = new Person[] {new Person(23), new Person(34), new Person(28)}; 

Основной вопрос Теперь является то, что вы не имеете никакого способа сослаться на чей возраст человека принадлежит к кому, так как вы не прилагается name поле в любой из этих экземпляров. Вы могли сделать это легко:

public class Person { 

    private String name; 
    private String age; 

    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    // getters for name and age 
} 

... то вы можете создать экземпляр Person с два значения.

new Person("Bob", 23); 

Теперь, когда мы обратились одна заботы (что было где хранить человек в первой очереди), теперь нам нужен способ, чтобы случайно доступа к ним.

Для этого мы можем использовать Random#nextInt().

Random rand = new Random(); 
System.out.println("Person's age - " + people[rand.nextInt(people.length)]); 

Это будет случайным образом вытащить Person из массива и напечатать их возраст.

3

Почему бы не указать имя как свойство класса Person?

class Person { 
    // ... your existing code for age... 
    private String name; 

    String getName() { return name; } 

    // add name to constructor... 
    public Person(String name, int age) { 
     // set them up here... 
    } 
} 

Я так понимаю, что name для вас как человека, но переменные john являются irrelivant к программе и компьютера .... Вы можете даже использовать p1 = Person("Joe", 42);

Чтобы получить человек по возрасту, вы можете использовать Map с возрастом в качестве ключа, а человек - как ценность.

0

Если вы хотите, чтобы получить случайные человек в классе человека вы могли бы хранить ссылку на каждый человек, созданный, а затем выбрать случайный образом из этого списка

public class Person { 
    // A List of every Person Created. 
    private static final List<Person> allPeople = new ArrayList<People>(); 

    // A source of random numbers 
    private static final Random rand = new Random(); 
    ... 
    public Person(int age) { 
     ... 
     // Every time we create a new Person, store a reference to that person. 
     addPerson(this); 
    } 

    // synchronized as ArrayLists are not thread safe. 
    private static synchronized addPerson(Person person) { 
     allPeople.add(person); 
    } 

    ... 
    public static Person getRandomPerson() { 
     // Get a random number between zero and the size of the list. 
     int random = rand.nextInt(allPeople.size() -1); 

     return allPeople.get(random); 

    } 

Сейчас этот код не то, что я хотел бы сделать в производственная среда, но вопрос звучит как упражнение. Лучше всего было бы сохранить людей, созданных в List в вашем классе Example. Но пытаюсь ответить на вопрос, как вы его просили.

Смежные вопросы