有关此主题的说明。因此,出于示例目的,我有:
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() {}
}
Console
直接实例化,因为abstract
但是我可以将控制台实例化为xbox
控制台收藏=新Xbox();
如果所有类都有定义的play()
方法。如果我调用fav.play();
它,它将查看Xbox的play方法,如果它没有play方法,它将继续沿层次结构扩展,直到找到该方法?
同样如果我做到了,((XboxOne)fav).play()
那会做XboxOne的play方法吗?难道我只能在等级较低的情况下才能投射对象吗?
如果Xbox
该类有getGamerscore
方法,但控制台没有,我可以运行fav.getGamerScore()
吗?
一般的问题:
=左侧的类型显示了在调用方法时java将查找哪个类(最特定)?(如果无法找到该方法,它将继续进行层次结构直到找到该方法?)
右侧的类型仅代表编译类型。编译Java时,将查看并查看该方法或数据是否属于编译类型,如果一切正常,则一切正常吗?Java在运行时将不再查看其编译类型。
强制转换是否有助于解决编译问题?就像我想使用某种方法,但我的对象的编译类型就像接口,抽象类之类的东西一样,因此我强制转换,以便尝试访问运行时类型的方法时编译器不会抱怨吗?
如果我说错了什么,请纠正我,我只想弄清楚所有规则。另外,如果有人有任何有用的资源,那将是很好的。
**我意识到我没有使用游戏界面
您需要区分两件事
这在编译时是已知的,并将用于方法签名查找。所以,如果你有Console fav = new Xbox()
,那么静态类型的fav
会Console
。因此,如果尝试调用fav.play()
,则编译器将play
在Console
类中寻找签名;如果Console
不支持此方法,那么Java甚至不会对其进行编译。
这就是运行时变量的含义,因此,在启动程序后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()吗?
不,如前所述;fav
是Console
,因此不知道您的意思getGamerScore
。但是,您仍然可以这样做((XBox) fav).getGamerScore
。
强制转换是否有助于解决编译问题?
强制转换可能非常危险,因为您要对变量进行假设。如果您正在呼叫((XBox) fav).getGamerScore
,那么您已经知道类型必须是Xbox
并且具有Console fav
错误的名称,因为您不能在其中分配任何类型的控制台。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句