我知道可以将整数,字符串等存储到数组中。但我想知道,如果还可以将类似方法,类等“更大”的东西存储到数组中,并且像Integer,String对应的那样容易访问它们。
我可以想象几次这样的事情会有用。有人有一个示例代码,其中使用了这样的方法数组?
当你还想要在给定的整数或字符串上使用这些方法时,我想特别注意这个符号。也许它看起来像这个a[i](m, n, "qwerty")
,不知道。 a [i]是一种方法; m,n是整数,“qwerty”是一个字符串;
这种表示法可以很容易地编写一个for循环并一个接一个地使用几个方法,而不必再将它们全部写下来。
由于数组似乎不允许这样做,还有其他选择吗?我将检查“方法参考”的使用
答案 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;
}
}
}
}
}
您可能有兴趣阅读下一篇文章: