Java 如何将一个变量用作单个范围内不同情况下的不同对象?

Java 如何将一个变量用作单个范围内不同情况下的不同对象?,java,Java,通常,不可能使用一个变量(一个标识符)作为一个范围中的两个或多个对象。我的意思是,以下程序将不起作用: public void HashMachine() { ClassA MyObj; //Some functions on MyObj here ClassB MyObj; //Some other functions on the new MyObj here. } 但我想知道,在以下不同情况下,是否可以将单个变量用作两个不同的对象: public void

通常,不可能使用一个变量(一个标识符)作为一个范围中的两个或多个对象。我的意思是,以下程序将不起作用:

public void HashMachine() {
    ClassA MyObj;
    //Some functions on MyObj here
    ClassB MyObj;
    //Some other functions on the new MyObj here.
}
但我想知道,在以下不同情况下,是否可以将单个变量用作两个不同的对象:

public void HashMachine(int ObjType) {
    switch(ObjType){
          case 1:
              ClassA MyObj;
              //Some functions here for this MyObj
              break;
          case 2:
              ClassB MyObj;
              //some other functions for this MyObj
              break;
    }
}
不幸的是,上面的程序也是错误的,我不能运行它

所以,这是我的问题:

我可以为一个范围内的两个不同对象使用一个标识符(一个变量)吗?(每一个都适用于特定情况/条件)

我为什么要这样做?

  • 我认为这样的程序比必须使用不同变量的形式要短
  • 因为我想编写一个Java卡小程序,在Java卡中,垃圾收集器不存在,所以最好使用更少的对象和变量

在同一范围内不能两次使用同一名称。但是,您可以在case语句中创建新的作用域,以便再次使用该名称。例如:

switch(ObjType)
{
    case 1:
    {
        ClassA MyObj;
        //some code
    }
    break;
    case 2:
    {
        ClassB MyObj;
        //some code
    }
}

在这里,
ClassA MyObj
在程序到达第二个case语句时已超出范围,因此
ClassB MyObj
是合法的。

在同一范围内不能两次使用同一名称。但是,您可以在case语句中创建新的作用域,以便再次使用该名称。例如:

switch(ObjType)
{
    case 1:
    {
        ClassA MyObj;
        //some code
    }
    break;
    case 2:
    {
        ClassB MyObj;
        //some code
    }
}

在这里,
ClassA MyObj
在程序到达第二个case语句时已超出范围,因此
ClassB MyObj
是合法的。

是。你可以这样做。这是抽象的概念。你可以像下面这样做

public interface MyInterface{...}

public class ClassA implements MyInterface {...}

public class ClassB implements MyInterface {...}
然后,通过使用
MyInterface
的引用对象,可以引用类
ClassA
ClassB
的对象

MyInterface MyObj;
switch(ObjType){
          case 1:
              MyObj = new ClassA();
              //Some functions here
              break;
          case 2:
              MyObj = new ClassB();
              //some other functions
              break;
    }

Das Louis在其示例中提供了另一个选项。

是。你可以这样做。这是抽象的概念。你可以像下面这样做

public interface MyInterface{...}

public class ClassA implements MyInterface {...}

public class ClassB implements MyInterface {...}
然后,通过使用
MyInterface
的引用对象,可以引用类
ClassA
ClassB
的对象

MyInterface MyObj;
switch(ObjType){
          case 1:
              MyObj = new ClassA();
              //Some functions here
              break;
          case 2:
              MyObj = new ClassB();
              //some other functions
              break;
    }

Das Louis在他的例子中提供了另一种选择。

我认为你想要的是一个联盟。 然而,它在Java中并不存在。我可以找到这个链接,我希望对你有用

我认为这样的程序比你必须的形式要短 使用不同的变量

也许是这样,但是可读性呢

因为我想写一个Java卡小程序,在Java卡中,垃圾收集器不存在,最好有对象和变量

我不确定我是否正确理解了你的句子


总之,我强烈建议您不要在代码中添加歧义

我认为您需要的是一个联盟。 然而,它在Java中并不存在。我可以找到这个链接,我希望对你有用

我认为这样的程序比你必须的形式要短 使用不同的变量

也许是这样,但是可读性呢

因为我想写一个Java卡小程序,在Java卡中,垃圾收集器不存在,最好有对象和变量

我不确定我是否正确理解了你的句子


最后,我强烈建议您不要在代码中添加歧义

亲爱的down投票者,请告诉我这个问题出了什么问题?我也看不出有什么问题。。。这里有一个+1;-)你应该看看继承。如果您使所有对象类型都从单个“根”对象继承,那么您可以将所有对象作为该“根”对象的实例传递。亲爱的down投票者,请告诉我问题出了什么问题?我也看不出有任何问题。。。这里有一个+1;-)你应该看看继承。如果使所有对象类型都从单个“根”对象继承,那么就可以将所有对象作为该“根”对象的实例进行传递。我更正了这一部分。我的意思是,由于Java卡中没有GC,同时具有较少活动对象,程序员有利于为其程序的其他部分提供更多可用内存。我更正了这一部分。我的意思是,由于Java卡中没有GC,同时具有较少活动对象,程序员有利于为其程序的其他部分提供更多可用内存。如果可能,您甚至不需要
开关
语句。您可以使用方法重写。如果可能,您甚至不需要
开关
语句。您可以使用方法重写。