我可以编写如下代码:
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运算符是如何工作的?
答案 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。