如果我有两个类,A和B,publicclassA{publicinttest(){return1;}}publicclassBextendsA{publicinttest(){return2;}}如果我这样做:Aa1=newB(),那么a1.test()会根据需要返回2而不是1。这只是Java的一个怪癖,还是有某种原因导致这种行为? 最佳答案 这叫做polymorphism.在运行时,将根据a1的“真实”类型调用正确的方法,在本例中为B。正如维基百科所说:Theprimaryusageofpolymorphisminindustry
当java可以隐式进行向上转换时,为什么它不能隐式进行向下转换?请用一些简单的例子解释一下? 最佳答案 重点是向上转型总是会成功,所以它是安全的——而向下转型可能会失败:Stringx=getStringFromSomewhere();Objecty=x;//Thiswill*always*work但是:Objectx=getObjectFromSomewhere();Stringy=(String)x;//Thismightfailwithanexception因为这是一个“危险”的操作,语言强制您明确地执行它-您基本上是在对编译
假设一个每个子类继承关系的表可以在下面描述(来自wikibooks.org-参见here)注意父类不是抽象的@Entity@Inheritance(strategy=InheritanceType.JOINED)publicclassProject{@Idprivatelongid;//Otherproperties}@Entity@Table(name="LARGEPROJECT")publicclassLargeProjectextendsProject{privateBigDecimalbudget;}@Entity@Table(name="SMALLPROJECT")publi
我正在使用内部类的层次结构来表示应用程序中的一些数据,但我遇到了一条我根本无法理解的错误消息。我的代码可以归结为以下最小示例:publicclassA{publicclassBextendsA{}publicclassCextendsB{}}Javac(当然还有我的IDE)无法编译代码并出现以下错误消息:A.java:3:cannotreferencethisbeforesupertypeconstructorhasbeencalledpublicclassCextendsB{}^1error我没有在任何地方写this。没有比上面提供更多的代码,所以我假设javac已经生成了一些与内部
所以我有一些“管理器”类,例如GroupManager。所有这些经理都是单例。使用此方法进行实例化:privatestaticGroupManagergroupManager=null;privateGroupManager(){}publicstaticGroupManagerInstance(){if(groupManager==null){groupManager=newGroupManager();}returngroupManager;}我想我应该开始使用一些继承,因为它们有很多复制的方法。每个Manager的Instance()方法都是相同的。所以对于继承我可以这样做(显然
这个问题在这里已经有了答案:Whyissuper.super.method();notallowedinJava?(22个答案)关闭9年前。publicclassGrandParent{publicvoidwalk(){...}}publicclassParent{publicvoidwalk(){...}}publicclassChild{publicvoidwalk(){//HereinsomecasesIwanttousewalkmethodofGrandParentclass}}现在在Child.walk()中,我只想在某些情况下使用GrandParent.walk()。我怎样
考虑以下代码片段:packagevehicle;publicabstractclassAbstractVehicle{protectedintspeedFactor(){return5;}}packagecar;importvehicle.AbstractVehicle;publicclassSedanCarextendsAbstractVehicle{publicstaticvoidmain(String[]args){SedanCarsedan=newSedanCar();sedan.speedFactor();AbstractVehiclevehicle=newSedanCar(
令我有些吃惊的是,以下代码打印了两次“Close”。通过调试器运行,似乎MyPrintStream.close()调用了super.close(),最终再次调用了MyPrintStream.close().importjava.io.*;publicclassPrintTest{staticclassMyPrintStreamextendsPrintStream{MyPrintStream(OutputStreamos){super(os);}@Overridepublicvoidclose(){System.out.println("Close");super.close();}}p
我正在尝试编写我的第一个库,但我仍然遇到一些设计问题。我的库需要大量配置,为此我创建了接口(interface)和默认Impl类,但现在我的库需要与外部调用进行大量交互。这也是通过接口(interface)完成的,但我感觉用户被迫覆盖太多只返回一些默认错误甚至null的方法。有没有更好的方法让所有这些“你可以但你不必实现”的部分更加可选? 最佳答案 即使您创建了一个接口(interface),创建一个抽象基类通常也是有意义的,您的库的用户可以扩展该基类以实现该接口(interface)。抽象基类可以提供方法的默认实现,这样您的库用户
packageP1;publicclassBase{privatevoidpri(){System.out.println("Base.pri()");}voidpac(){System.out.println("Base.pac()");}protectedvoidpro(){System.out.println("Base.pro()");}publicvoidpub(){System.out.println("Base.pub()");}publicfinalvoidshow(){pri();pac();pro();pub();}}和packageP2;importP1.Base