为什么我需要转换这个方法 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')。
我现在正在学习继承和多态性,除了这个我都懂。为什么我需要转换 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')。