是否可以在Java中声明一个类或另一个类的对象?

时间:2016-10-01 18:40:35

标签: java inheritance

新手在这里。我的部分工作是询问用户他们的来电所属的两个类别中的哪一个。

类CategoryA和类CategoryB都继承自我们之前作业中的PhoneCall类。

我想这样做:

    String choice = null;
    System.out.printf("Please enter a 'A' for Category A%n");
    System.out.printf("Please enter a 'B' for Category B%n");

    //[Input validation/exception handling stuff goes here]

    switch(choice){
        case "A":
            CategoryA objectName = new CategoryA();
            break;
        case "B":
            CategoryB objectName = new CategoryB();
            break;
    }

但当然这不起作用,因为

  1. 我在switch语句中声明了objectName,所以我不能在它之外使用它。
  2. 两个对象都具有相同的名称(即使只声明其中一个)。
  3. 程序的其余部分使用objectName。如果我必须有两个不同的对象名称,那么每次使用objectName时我都必须有一个if / else语句或switch语句,对吧?我甚至无法将对象传递给函数,因为它是一个类或另一个类。我在这里缺少一些解决方案吗?

2 个答案:

答案 0 :(得分:4)

是的,编程到常见的PhoneCall 界面

PhoneCall phoneCall = null;
switch(choice){
    case "A":
        phoneCall = new CategoryA();
        break;
    case "B":
        phoneCall = new CategoryB();
        break;
}
if (phoneCall != null) {
    // ...
}

但是,我认为使用简单的if-else if之类的

会更容易阅读上述内容
PhoneCall phoneCall = null;
if ("A".equals(choice)) {
    phoneCall = new CategoryA();
} else if ("B".equals(choice)) {
    phoneCall = new CategoryB();
}

答案 1 :(得分:3)

所以你想要使用的是多态性。当您声明父类(或接口)的对象,但将其初始化为子类时。

例如,如果您有一个带有子类B和C的接口A,请执行以下操作:

InterfaceA obj;
if(x){
    obj = new ClassB(parameters);
} else {
    obj = new ClassC(parameters);
}

将创建B类或C类。 因为它们列在父类下,所以只能调用父类具有的方法。换句话说,如果B类具有唯一的方法,除非您将对象转换为该类型,否则无法调用该方法:

ClassB objB = (ClassB) obj;
objB.uniqueMethod();

但是,如果obj不是ClassB,则会抛出错误,因此您首先需要检查obj是否是ClassB:

if(obj instanceOf ClassB){
    ClassB objB = (ClassB) obj;
    objB.uniqueMethod();
}

这样你就可以确保在执行之前可以将obj强制转换为ClassB。

这适用于接口或类。