Java:如果这是某个对象的实例,是否显示一个只属于某个对象的变量?

Java:如果这是某个对象的实例,是否显示一个只属于某个对象的变量?,java,inheritance,instance-variables,extends,instanceof,Java,Inheritance,Instance Variables,Extends,Instanceof,这里的一切都被重新命名和简化 我有一个父类(normalThing)和一个方法,该方法显示有关实例的一些数据,还有一个类(specialThing)扩展父类以包含另一个实例变量(addedPrice) 我希望我的display方法说明该实例是否为specialThing,如果是,则显示addedPrice。但是因为addedPrice只属于特殊功能,我不知道如何编写它 void displayInfo(){ StringBuilder d = new StringBuilder("Am

这里的一切都被重新命名和简化

我有一个父类(normalThing)和一个方法,该方法显示有关实例的一些数据,还有一个类(specialThing)扩展父类以包含另一个实例变量(addedPrice)

我希望我的display方法说明该实例是否为specialThing,如果是,则显示addedPrice。但是因为addedPrice只属于特殊功能,我不知道如何编写它

void displayInfo(){
    StringBuilder d = new StringBuilder("Am I special? ");

    if(this instanceof specialThing){
        d.append("Yes, so I cost an extra " + this.addedPrice);
        //No, I didn't expect that to work, but I had hope
    }
    else d.append("Nope.");
    JOptionPane.showMessageDialog(null, d);
}

有什么方法可以做到这一点,而不必在normalThing类中创建一个“canbeaddedPrice”变量?

您可以通过在子类中适当地重写
displayInfo
来实现这一点。这是一种更好的方法,因为父类不应该试图知道它的子类是什么,因为子类的数量和它们的名称不在父类的控制之下。人们可以以意外/不可预测和不受控制的方式扩展父类。如果您定义
displayInfo
contract并强制子类来实现它,那么它将很好地工作。子类的数量并不重要。只要
displayInfo
是按照合同实现的,OOP就会处理剩下的:-)

不要让父类依赖于子类。永远不会。@SotiriosDelimanolis,除非它是通过我信任的抽象(或重写)方法实现的@ElliottFrisch所说的依赖性,我的意思是在父级源代码中专门使用子类型。使用
abstract
方法,您不会这样做,所以这很好。