Java多态性/铸造/方法
关于这一主题的澄清。因此,举例来说,我有:Java多态性/铸造/方法,java,casting,polymorphism,Java,Casting,Polymorphism,关于这一主题的澄清。因此,举例来说,我有: 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() {} }
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 fav = new Xbox();
控制台fav=新Xbox()play()
方法。如果我调用fav.play()
它将查看Xbox的播放方法,如果它没有播放方法,它将继续在层次结构上,直到找到该方法为止((XboxOne)fav).play()
,它会执行XboxOne的播放方法吗?如果对象在层次结构中较低,我是否也只能强制转换对象Xbox
类有getGamerscore
方法,但控制台没有,我会吗
是否能够运行fav.getGamerScore()Console fav = new Xbox();
您正在构造Xbox类型的对象,并将其分配给Console类型的变量。出于编译时检查的目的,XBox现在是一个控制台,可以传递给需要控制台的方法。请在此处查看此帖子:
你需要区分两件事
Console fav=new Xbox()
,那么fav
的静态类型将是Console
。
因此,如果您尝试调用fav.play()
,编译器将在控制台
类中查找播放
签名;如果Console
不支持此方法,那么Java甚至不会编译它
Console fav=new Xbox()
后,fav
的动态类型将是Xbox
(但静态类型仍然是Console
)
现在回答你的问题
如果所有类都定义了播放方法。如果我叫fav.play();它将查看Xbox的播放方法,如果它没有播放方法,它将继续在层次结构上,直到找到该方法
如果您所说的所有类都是指基本控制台类(至少是抽象方法),那么是的
另外,如果我做了((XboxOne)fav.play(),它将执行XboxOne的play方法?,而且如果对象在层次结构中处于较低的位置,我是否也只能强制转换该对象
您可以随时向上转换-从更具体的(Xbox
)到更通用的(控制台
);降级只有在一定程度上才有可能——如果有成功的机会的话。所以通常向下转换到动态类型应该会成功。(例如,控制台fav=新的Xbox()
+(Xbox)控制台)
如果Xbox类有一个getGamerscore方法,但控制台没有,我是否能够运行fav.getGamerscore()
没有,如前所述fav
是Console
,因此不知道您所说的getGamerScore
是什么意思。但是,您仍然可以执行((XBox)fav).getGamerScore
强制转换只是帮助解决编译问题
强制转换可能非常危险,因为您正在对变量进行假设。
如果您正在调用((XBox)fav).getGamerScore
,那么您已经知道类型必须是XBox
,并且拥有控制台fav
可能是错误的,因为您无法在其中分配任何类型的控制台
我不能直接实例化控制台,因为它是抽象的
正确的
不过,我可以将控制台实例化为xbox
Console fav = new Xbox();
正确的
如果所有类都定义了play()
方法。如果我调用fav.play()
它将查看Xbox的播放方法,如果它没有播放方法,它将继续在层次结构上,直到找到该方法为止
对。这并不是它在现实中是如何发生的(它是优化的),而是康塞普
public abstract class Console implements Gaming {
// no impl. not needed because already declared in Gaming
// just for clarity
public abstract void play();
}
Console myAnonymousConsole = new Console() {
public void play() { System.out.println("Hello there"); }
};
Console a = new XBoxOne();
XBox b = (XBox)a; // ok because a is-a Xbox
XBoxOne c = (XBoxOne)a; // ok because a is-a XBoxOne
Console a = new XBox();
XBox b = (XBox)a; // ok because a is-a Xbox
XBoxOne c = (XBoxOne)a; // ko! because a is-not-a XBoxOne
public class XBox extends Console {
public void play() { System.out.println("In XBox");
}
public class PS3 extends Console {
public void play() { System.out.println("In PS3");
}
List<Console> consoles = Arrays.asList(new XBoxOne(), new PS3());
for (Console c : consoles) {
c.play(); // polymorphism here
}
In XBox
In PS3