如何为不同的类使用相同的变量名称

时间:2013-06-09 23:20:12

标签: java oop

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

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时,它会给我一个空指针异常。

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

2 个答案:

答案 0 :(得分:5)

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

通常的方法是通过 interfaces 。界面定义了class1class2的共同特征,然后使用界面声明blah。然后,您可以轻松地将具体类别设置为一个或另一个,并且可以访问共同的特征。

E.g:

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`...
}

答案 1 :(得分:0)

您的代码永远不会编译。

  • 什么是B1和B2?什么是C(),签名就像一个构造函数,但名称不是。如果它不是构造函数,那么您如何确保在instanceCB1内初始化B2
  • 什么是A instanceA = new instanceA();?应该是A instanceA = new A();吗?然后拨打instanceA.test()

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

如果要遍历类的所有字段并对它们执行某些操作,请再次使用反射并迭代字段,检查其类型以及正确的字段类型调用该方法。