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

可以在Java中声明一个类或另一个类的对象吗?,java,inheritance,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 v

我是新手。我任务的一部分是询问用户他们的来电属于哪两类

类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;
    }
但这当然行不通,因为

  • 我在switch语句中声明objectName,因此不能在它之外使用它
  • 两个对象具有相同的名称(即使只声明其中一个)

  • 程序的其余部分使用objectName。如果我必须有两个不同的对象名,那么每次我都必须使用一个If/else语句或switch语句,对吗?我甚至无法将对象传递给函数,因为它属于一个类或另一个类。这里有我缺少的解决方案吗?

    是的,编程到公共
    电话呼叫
    界面

    然而,我认为用一个简单的
    if-else-if
    like阅读上面的内容会更容易

    PhoneCall phoneCall = null;
    if ("A".equals(choice)) {
        phoneCall = new CategoryA();
    } else if ("B".equals(choice)) {
        phoneCall = new CategoryB();
    }
    

    是,编程到公共
    电话呼叫
    界面

    然而,我认为用一个简单的
    if-else-if
    like阅读上面的内容会更容易

    PhoneCall phoneCall = null;
    if ("A".equals(choice)) {
        phoneCall = new CategoryA();
    } else if ("B".equals(choice)) {
        phoneCall = new CategoryB();
    }
    

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

    例如,如果您有一个带有子类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之前可以将obj强制转换为ClassB


    这适用于接口或类。

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

    例如,如果您有一个带有子类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之前可以将obj强制转换为ClassB


    这适用于接口或类。

    当我这样做时,对于每个类特定的方法,会出现“无法解析方法”错误。我做错了什么?没有创建可以通过公共接口调用的方法。当我这样做时,对于每个类特定的方法,会出现“无法解析方法”错误。我做错了什么?没有创建可以通过公共接口调用的方法。我要补充的是,您可以(可能应该)在强制转换之前使用
    if(objB instanceof ClassB)
    。我要补充的是,您可以(可能应该)在强制转换之前使用
    if(objB instanceof ClassB)