数组是否可以包含方法,类等?

时间:2014-10-04 18:45:38

标签: java arrays

我知道可以将整数,字符串等存储到数组中。但我想知道,如果还可以将类似方法,类等“更大”的东西存储到数组中,并且像Integer,String对应的那样容易访问它们。

我可以想象几次这样的事情会有用。有人有一个示例代码,其中使用了这样的方法数组?

当你还想要在给定的整数或字符串上使用这些方法时,我想特别注意这个符号。也许它看起来像这个a[i](m, n, "qwerty"),不知道。 a [i]是一种方法; m,n是整数,“qwerty”是一个字符串; 这种表示法可以很容易地编写一个for循环并一个接一个地使用几个方法,而不必再将它们全部写下来。 由于数组似乎不允许这样做,还有其他选择吗?我将检查“方法参考”的使用

5 个答案:

答案 0 :(得分:1)

在Java中,方法不是一等公民,不能被视为数据。这意味着您无法在数组中存储方法。

另一方面,可以将对象存储在数组中:

MyClass[] myArray = new MyClass[10];

这将创建一个包含10个MyClass个对象的数组。

答案 1 :(得分:1)

您可以定义一个包含任何类对象的数组。

MyClass myObjects = new MyClass[2];

然后,您可以将类的实例分配给数组中的位置:

myObjects[0] = new MyClass();

并在其上调用MyClass的任何方法:

myObjects[0].doSomething(someParameter);

答案 2 :(得分:1)

是。在Java中,您定义的类将包含方法,甚至包含其他类的变量,您可以定义类的数组。例如:

class Myclass {
    Myclass(){...}
    String data;
    void process(){
        var1.doSomething();
    }
    OtherClass var1, var2;
}

因此,如果您在此类中定义数组变量,则示例为:

Myclass[] myClasses = new Myclass[5];
myClasses[0]=new Myclass();
...
myClasses[1].process();

我的回答可能看起来很模糊,但如果你用真实的例子更新你的问题,那么它会更有意义。

答案 3 :(得分:0)

听起来你想要创建一个对象数组并访问这些对象的方法。数组+位置是存储在该位置的数组内的对象的引用,因此您只需调用该方法。

实施例

   public class Demo {

      public static void main(String[] args)
      {
          Demo[] array = new Demo[5]; // array of 5 Demo objects of class Demo.

          for (int a = 0; a < array.length; a++) // looping through the array to instantiate each object.
          {
               array[a] = new Demo(); //instantiating the object at position 'a'.
          }

          for (int a = 0; a < array.length; a++) // looping through the array to access each object.
          {
              array[a].sysOut(a); //accessing the sysOut method of the Demo object at position 'a' and passing int 'a' as a parameter.
          }
      }   

      public void sysOut(int a) // method of class Demo accepting an int parameter.
      {
          System.out.println(a + " is a Demo object.");
      }
  }

因此,类不能保存在数组中,但是可以使用该类创建的对象。将对象放在指定位置的数组内后,数组名称和位置就是对象的引用。

答案 4 :(得分:0)

您在如何引用类的答案中有一些示例,这是为了向您展示如何引用方法。这只是语法的一个示例,您必须实现更好的方法来仅检查所需的方法并更好地收集它们。您甚至可以动态检查签名,而不是像本例中那样静态参数化方法调用。

您可能只想在创建框架而不是最终解决方案时使用此类代码。在最后的灵魂中,你应该确切地知道你在呼唤什么,并准备好你期待的输入和输出。

package com.something;

import java.lang.reflect.Method;

public class Test {

public void someMethod() {
    System.out.println("This does nothing");
}

public String anotherMethod(String param) {
    return "This does something with your param: " + param;
}

public static class InnerTest {

    public double thirdMethod() {
        return Math.random();
    }

}

public static void main(String[] args) throws Exception {

    Class[] clazzArr = new Class[2];

    clazzArr[0] = Test.class;
    clazzArr[1] = Test.InnerTest.class;

    for ( Class auxClass : clazzArr ) {
        for ( Method auxMethod : auxClass.getMethods() ) {
            // inspect these to know what you must send to current parameter to be able to invoke it
            Object[] parameterTypes = auxMethod.getParameterTypes();
            // inspect this to know what type of object do you expect
            Object returnType = auxMethod.getReturnType();

            // for simplicity, I know which parameters to send in my example
            switch( auxMethod.getName() ) {
            case "someMethod":
                // I know it doesn't receive any parameters
                auxMethod.invoke(auxClass.newInstance(), new Object[0]);
                break;
            case "anotherMethod":
                // I know it does receive an string parameter and I know it doesn't print anything,
                // so I have to print it here
                System.out.println( auxMethod.invoke(auxClass.newInstance(), "My Name is Imago") );
                break;
            case "thirdMethod":
                // in the other method I just return a double with no parameters
                System.out.println( "Random number: " + auxMethod.invoke(auxClass.newInstance(), new Object[0]) );
            default:
                // even public static void main and other Object methods will be included, you must have another algorithm to include only desired ones
                break;
            }
        }
    }

}

}

您可能有兴趣阅读下一篇文章:

Java Reflection

Java Reflection: Method