为什么我需要转换这个方法 Java

Why Do I Need To Cast This Method Java

我现在正在学习继承和多态性,除了这个我都懂。为什么我需要转换 three.setY() 它不应该已经可以访问它,因为我正在创建一个继承自 G class.

的 H 对象

第 8 行是语法错误。

public class WS2
{
    public static void main(String[] args)
    {
        G three = new H();
        System.out.println(three);
        three.setX(8);
        three.setY(21); // Syntax Error -> ((H) three).setY()
        System.out.println(three);
    }
}

class G
{
    private int x;
    
    public G()
    {
        x = 3;
    }
    
    public void setX(int val)
    {
        x = val;
    }
    
    public String toString()
    {
        return "" + x;
    }
}

class H extends G
{
    private int y;
    
    public H()
    {
        y = 4;
    }
    
    public void setY(int val)
    {
        y = val;
    }
    
    public String toString()
    {
        return "" + y + " " + super.toString();
    }
}

three 在编译时已知是对 G 的引用。 three 的类型并不反映引用的对象实际上可能是 H.

A G 没有方法 setY,因此您不能在 G 引用上调用 setY

您可以强制运行时检查引用的 G 是否真的是 H;如果检查成功,那么您可以调用 setY。如果检查失败,您将得到一个异常。这就是你对演员所做的。

您可能会反对“很明显”,在这种情况下,对象确实是一个 H,而且对于人类来说确实如此 reader。但是,在其他情况下,情况并非如此简单 - 语言规则适用于一般情况。

此外,如果您想像 H 一样对待它,为什么要将 three 声明为对 G 的引用?将其声明为 H。大多数其他需要 G 的上下文都会接受它。这一切都取决于程序员的意图(我看到这只是探索该语言的一个例子,所以没有什么可以继续说 'right')。