【问题标题】:Changing property type of a class in JAVA OOP - Implicit and Explicit casting在 JAVA OOP 中更改类的属性类型 - 隐式和显式转换
【发布时间】:2020-11-26 15:52:55
【问题描述】:

我一直在研究 Java 中的显式和隐式转换。
我创建了一个 Customer 类,它有两个子类,如 RetailCustomerCorporateCustomer。另外,我创建了一个具有 Customer 属性的 Bill 类。

我想根据用户的选择创建一个 Bill 对象。如果用户选择“1”,则为零售客户创建 Bill 对象,如果用户选择“2”,则为企业客户创建 Bill 对象。

我很困惑。如何使用显式和隐式转换?

public class Customer {
    
    private int CustomerID;
    private String CustomerName;
    private String CustomerLastName;
}
    
public class RetailCostumer extends Customer {
    
    private int CitizenShipID;
    private int CustomerNo
}
    
public class CorporateCustomer extends Customer {
    
    private int TaxNumber;
    private int CustomerNo
}
    
    
public class Bill {
    
    private int BillID;
    private Customer customer;
}
    
public class BillManagement {

    public static void main(String[] args) {

    }
}

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

    在创建子类并将其分配给超类时,您不必显式强制转换。

    例如:

    // You can assign RetailCustomer(subclass) instance to a Customer(superclass), 
    // Because RetailCustomer is Customer.
    Customer customer = new RetailCustomer();
    

    但是,当你想访问子类变量如CitizenShipIDTaxNumber时,你需要使用显式类型转换。

    例如:

    Customer customer = new RetailCustomer();
    
    // Customer could not be RetailCustomer (e,g. could be CorporateCustomer) , 
    // so, you have to inform that 'customer is actually RetailCustomer'
    RetailCustomer retailCustomer = (RetailCustomer) customer;
    
    retailCustomer.CitizenShipID;
    

    在实践中,实际的客户实例不可能是RetailCustomer 实例(可以是CorporateCustomer),那么就会出现ClassCastingException

    因此,最好在转换之前通过instanceof 检查实际实例类型,如下所示。

    Customer customer = new RetailCustomer();
    
    RetailCustomer retailCustomer;
    
    if (customer instanceof RetailCustomer) {
      retailCustomer = (RetailCustomer) customer;
    } else {
     // handle otherwise
    }
    
    retailCustomer.CitizenShipID;
    

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多