在Java中我们可以编写“SuperClassObject instanceof SubClass”吗?

时间:2017-10-24 09:09:44

标签: java instanceof

我可以编写如下代码:

 class Shape
{
}
class Circle extends Shape
{
}
public class Main
{
    public static void main(String args[])
    {
        Shape shape = new Circle();
        if (shape instanceof Circle)
        {
            Circle C = (Circle)shape;
        }
    }
}

在上面的代码中,我没有提供Shape和Circle类中的方法,因为我只想询问是否可以使用 instanceof 运算符。

我的意思是这个代码在我的计算机上运行良好,但我的怀疑在这种情况下instanceof运算符是如何工作的?

3 个答案:

答案 0 :(得分:4)

instanceof的API:

  

实施Instanceof运算符。如果Object参数(可以是表达式)是类类型的实例,则返回布尔值。
  输入1:返回对象的对象或表达式   输入2:返回类的类或表达式
  返回:一个布尔值,它是针对Class测试对象的结果。

检查您提供的对象是否属于您要检查的类。我认为令你感到困惑的是Java的协方差(你可以阅读更多内容)。您可以将变量声明为SuperClass类型,并将SubClass对象分配给该变量。 就你的例子而言,就像这样:

Shape shape = new Circle();

但是,即使将变量形状声明为SuperClass类型,此变量中存储的内容也是SubClass的对象,即Circle。因此,当instanceof方法检查变量shape的对象时,要查看它是否是(发起为)Circle的实例,它将返回true。

这就是instanceof非常有用的原因。假设您有另一个子类型:

class Square extends Shape { \*...*\  }

你有一些方法可以让你想要做一些具体的事情,如果它是一个圆圈而另外一个不同的东西,如果它是一个方形,那么你可以得到类似以下的东西:

public void doSomethingWithShape(Shape shape) {
    if (shape instanceof Cirlce) {
        // code that handles circles here
    } else if (shape instanceof Square) {
        // code that handles squares here
    }
}

注意:如果它是一个共同的方法,每个子类型应该有它(简单的例子是printValues()),那么在超类中使用该方法(在Shape的情况下) ,然后让每个子类类实现使用该子类的特定实现细节覆盖该方法,然后

Shape shape = new SomeSubTypeOfShape();
shape.printValues(); 

将要应用的方法将基于形状中的对象类型(SomeSubTypeOfShape),并将调用与子类型关联的重写方法。

示例doSomethingWithShape仅用于说明如何使用instanceof - 为其类测试特定对象。即使变量被声明为分配给变量的实际子类对象的超类,该对象仍然是子类的对象。

答案 1 :(得分:0)

  

我的意思是这段代码在我的电脑上运行良好......

代码赢了,它不会编译(因为您在没有初始化的情况下尝试使用shape)。

但总的来说,是的,您可以使用instanceof来查看对象是否是类的实例。这就是它的用途。如果您将Shape shape;行更改为

Shape shape = new Circle();

....然后代码将编译,如果你运行它,控件将传递到if块,因为对象shape引用的是Circle

请注意,它是对象,但不是变量类型。

答案 2 :(得分:0)

首先,是的,您的代码中存在编译错误,正如我在评论部分已经提到的那样 回到你的问题是,你可以使用instanceof来查看某个对象是否属于特定类型。 我会建议您关注this 现在,如果您希望shape instanceof Circle为真,则需要将shape初始化为Shape shape = new Circle();。 否则,如果您初始化Shape shape = null;,那么shape instanceof Circle将为false。