如何在不知道对象的情况下使用对象'名称

时间:2015-05-06 04:50:00

标签: java oop object

我不太确定怎么说这个有意义,但我会尽我所能。

说我有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;
    }
}

现在,如果我想要弗雷德的年龄,我只需致电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(),随机返回bobfredjohn,然后调用getAge() }。因此,如果getPerson()返回fred,那么它与执行fred.getAge();

相同

现在,这不起作用,这是我认为对我有意义的唯一方法。

我该怎么做,所以它实际上做了我想要的?

我是Java和OOP的新手,这是我第一次真正使用不同的对象。我很抱歉,如果我使用了错误的条款并且奇怪地解释了这些内容。

4 个答案:

答案 0 :(得分:3)

更改

public static Person getPerson(){

{{1}}

您不能在Object上调用getAge,因为Object类型没有定义getAge()。

答案 1 :(得分: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对程序和计算机来说是不可靠的......你甚至可以使用p1 = Person("Joe", 42);

要按年龄结识某个人,您可以使用Map作为关键字,将人作为价值。

答案 2 :(得分: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 :(得分: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);

    }

现在这段代码不是我在生产环境中会做的,但问题听起来像是一个练习。更好的方法是在Example类中存储List中创建的人员。但是你试着回答这个问题。