0

我正在尝试使用变量来实例化不同的类。例如:

Object blah;
class1 ex1;
class2 ex2;

public void test(int i){
    if(i == 1){
        blah = new class1();
    } else {
        blah = new class2();
    }
} 

我将如何在java中执行此操作?

编辑1: 对不起,让我现在尝试更具体。

假设我有三个班级:A、B 和 C。

A 是我的主要位置并使用 B。B 使用 C。

问题是这样的:

public class B1{
    C instanceC;

    public B1(){
    instanceC = new C();
    //uses a method of instanceC.
    }
}
public class B2{
    C instanceC;

    public C(){
    instanceC = new C();
    //uses a method of instanceC.
    }
}

然后在A中:

public class A implements MouseListener{
    Object blah;
    B1 instanceB1;
    B2 instanceB2;

    public void test(int i){
        if(i == 1){
            blah = new B1();
        } else {
            blah = new B2();
        }
    }
//I left the other mouseListener methods blank
    public void mouseReleased(int i){
        blah.instanceC.someMethod();
    }

    public static void main(String[] args) {
        A instanceA = new A();
        A.test(1);
    }
}

编辑 2:当我尝试使用 instanceC.someMethod() 或 instanceC.someVariable 时,它​​给了我一个空指针异常。

我希望这已经足够清楚了。如果它令人困惑,请告诉我,我会看看我是否可以进一步简化它。感谢已经帮助过的人!

4

2 回答 2

5

如果blah被声明为Object,那将起作用(除了您使用new实例而不是类) - 但是在其上使用任何不在的方法或属性会很尴尬Object

通常的方法是通过接口。接口定义了 和 的共同特征class1class2然后你blah使用接口进行声明。然后,您可以轻松地使具体类成为一个或另一个,并访问共同的特征。

例如:

interface Foo {
    void someCommonMethod();
}

class Class1 implements Foo {
    void someCommonMethod() {
        // implementation
    }
}

class Class2 implements Foo {
    void someCommonMethod() {
        // implementation
    }
}

public void test(int i){
    if(i == 1){
        blah = new Class1();
    } else {
        blah = new Class2();
    }

    // ...use `someCommonMethod` on `blah`...
}
于 2013-06-09T23:24:31.230 回答
0

您的代码永远不会编译。

  • B1和B2是什么?它们里面有什么C(),签名就像一个构造函数,但名字却不是。如果它不是构造函数,那么您如何确保在andinstanceC内初始化?B1B2
  • 是什么A instanceA = new instanceA();?会A instanceA = new A();吗?然后打电话instanceA.test()

如果我的假设是正确的,那么您正在尝试访问instanceC两个不同的对象,问题是,“它是否总是命名为 instanceC?”,如果是这种情况,请使用反射,并按名称查找字段。

如果你想遍历类的所有字段并对它们做一些事情,再次使用反射和遍历字段,检查它们的类型和正确的字段类型调用方法。

于 2013-06-10T03:04:58.683 回答