我正在尝试使用变量来实例化不同的类。 例如:
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时,它会给我一个空指针异常。
我希望这很清楚。如果它令人困惑,请告诉我,我会看看我是否可以进一步简化它。感谢已经帮助的人们!
答案 0 :(得分:5)
如果blah
被声明为Object
,那将会起作用(除了你使用new
实例而不是类) - 但使用任何方法都很尴尬或其上的属性不在Object
。
通常的方法是通过 interfaces 。界面定义了class1
和class2
的共同特征,然后使用界面声明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)
您的代码永远不会编译。
C()
,签名就像一个构造函数,但名称不是。如果它不是构造函数,那么您如何确保在instanceC
和B1
内初始化B2
?A instanceA = new instanceA();
?应该是A instanceA = new A();
吗?然后拨打instanceA.test()
?如果我的假设是正确的,那么你试图访问两个不同对象的instanceC
,问题是,“它总是命名为instanceC吗?”,如果是这种情况使用反射,并寻找字段按名称。
如果要遍历类的所有字段并对它们执行某些操作,请再次使用反射并迭代字段,检查其类型以及正确的字段类型调用该方法。