Java多态性/铸造/方法

约瑟夫·胡珀

有关此主题的说明。因此,出于示例目的,我有:

public interface Gaming {
   void play;
}

public abstract class Console implements Gaming {
   void play() {}
}

public class Xbox extends Console {
   void play() {}
}

public class XboxOne extends Xbox {
   void play() {}
}
  1. 我永远无法Console直接实例化,因为abstract
  2. 但是我可以将控制台实例化为xbox

    控制台收藏=新Xbox();

  3. 如果所有类都有定义的play()方法。如果我调用fav.play();它,它将查看Xbox的play方法,如果它没有play方法,它将继续沿层次结构扩展,直到找到该方法?

  4. 同样如果我做到了,((XboxOne)fav).play()那会做XboxOne的play方法吗?难道我只能在等级较低的情况下才能投射对象吗?

  5. 如果Xbox该类有getGamerscore方法,但控制台没有,我可以运行fav.getGamerScore()吗?

一般的问题:

=左侧的类型显示了在调用方法时java将查找哪个类(最特定)?(如果无法找到该方法,它将继续进行层次结构直到找到该方法?)

右侧的类型仅代表编译类型。编译Java时,将查看并查看该方法或数据是否属于编译类型,如果一切正常,则一切正常吗?Java在运行时将不再查看其编译类型。

强制转换是否有助于解决编译问题?就像我想使用某种方法,但我的对象的编译类型就像接口,抽象类之类的东西一样,因此我强制转换,以便尝试访问运行时类型的方法时编译器不会抱怨吗?

如果我说错了什么,请纠正我,我只想弄清楚所有规则。另外,如果有人有任何有用的资源,那将是很好的。

**我意识到我没有使用游戏界面

彼得·乌纳克

您需要区分两件事

  1. 静态型

这在编译时是已知的,并将用于方法签名查找。所以,如果你有Console fav = new Xbox(),那么静态类型的favConsole因此,如果尝试调用fav.play(),则编译器将playConsole类中寻找签名如果Console不支持此方法,那么Java甚至不会对其进行编译。

  1. 动态类型

这就是运行时变量的含义,因此,在启动程序后Console fav = new Xbox(),的动态类型fav将为Xbox(但静态类型仍为Console)。

现在您的问题

如果所有类都有定义的play方法。如果我调用fav.play(); 它会查看Xbox的play方法,如果它没有play方法,它将继续沿层次结构扩展,直到找到该方法为止?

如果所有类同时也是基Console类(至少是抽象方法),则为是。

同样如果我做了((XboxOne)fav).play()它会做XboxOne的play方法吗?难道我只能在对象等级较低时才能投射对象吗?

您可以随时进行修改-从更具体的(Xbox)转换为更通用的(Console);只能在一定程度上进行向下转换-如果有机会成功的话。因此通常向下转换为动态类型应该成功。(例如Console fav = new Xbox()+ (Xbox)console)

如果Xbox类具有getGamerscore方法,但控制台没有,我可以运行fav.getGamerScore()吗?

不,如前所述;favConsole,因此不知道您的意思getGamerScore但是,您仍然可以这样做((XBox) fav).getGamerScore

强制转换是否有助于解决编译问题?

强制转换可能非常危险,因为您要对变量进行假设。如果您正在呼叫((XBox) fav).getGamerScore,那么您已经知道类型必须是Xbox并且具有Console fav错误的名称,因为您不能在其中分配任何类型的控制台。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章