草庐IT

polymorphism

全部标签

java - 父类(super class)不调用重写的方法吗?

我有以下类(class):classfoo{publicvoida(){print("a");}publicvoidb(){a();}}classbarextendsfoo{publicvoida(){print("overwrittena");}}当我现在调用bar.b()时,我希望它调用foo中重写的方法a()。但是,它确实会打印“a”。 最佳答案 你的两个类在不同的包中吗?你的foo类方法是声明为public、protected、private还是packagelocal?显然,如果他们是私有(private)的,这将行不通。

java - 为什么 java.lang.Thread 在启动时不调用其显式 java.lang.Runnable 的 run() 方法?

Javadocs说明如果我们在创建新线程时提供一个Runnabletarget,该线程的.start()将运行run()方法提供的可运行。如果是这样的话,这个测试代码不应该打印“a”(而不是打印“b”)吗?publicclasstest{publicstaticvoidmain(String[]args){Runnabler=newRunnable(){@Overridepublicvoidrun(){System.out.println("a");}};Threadt=newThread(r){@Overridepublicvoidrun(){System.out.println("

java - 有没有一种特定的方法可以将父类(super class)的某些功能赋予某个子类?

问题我正在尝试创建一个应用程序,其中的对象类可以实现一些来自可用操作总池的操作。最终目标是没有任何代码重复,并尽可能遵守OOP法则。更详细地说,我正在尝试使用Lucene制作一个搜索引擎。卢森使用许多索引。我已经实现了一个简单的结构,其中不同的索引对象继承父类的方法。问题是,无论在该父类中实现什么方法,它都会自动可供所有子类使用。我想为用户提供选项,以确定他是否想进行短语搜索、术语搜索或任何其他可用于that特定索引的内容。问题是,例如,某些索引不应提供进行短语搜索的选项。最初的想法我想过实现一些接近复合模式的东西,正如GoF所描述的那样。我会将搜索操作(例如术语搜索、短语搜索)实现为

java - JAXB:泛型的多态性

我正在尝试使用JAXB(在Jersey内部)通过泛型实现多态性:@XmlRootElementpublicclassPerformance{@XmlAnyElementprivateListmeasurement;}@XmlJavaTypeAdapter(MeasurementAbstract.Adapter.class)publicinterfaceIMeasurementextendsSerializable{DgetDate();voidsetDate(Ddate);VgetValue();voidsetValue(Vvalue);}@XmlTransient@XmlAccess

Java高阶多态函数

我非常熟悉Scheme和Haskell等函数式语言。我正在尝试解决Java中的一个问题并陷入困境,可能是因为我仍然处于函数式思维模式中。我想写:publicvoiddoQueryAndStoreData(Stringquery,storeIn){/*makeajdbcquery,getResultSet*/ResultSetrset=...;ProcessResultSetproc=newProcessResultSet();proc.process(rset,storeIn);/*cleanup*/}界面如下:privateinterfaceIProcessResultSet{pub

java - 动态绑定(bind) == 是否在 Java 中进行后期绑定(bind)?

在不同的来源中,我阅读了关于该主题的不同内容。例如维基百科说:Latebindingisoftenconfusedwithdynamicdispatch,buttherearesignificantdifferences.但几行之后itispopulartousethetermlatebindinginJavaprogrammingasasynonymfordynamicdispatch.Specifically,thisreferstoJava'ssingledispatchmechanismusedwithvirtualmethods.那么真相在哪里,这个“显着差异”是什么?

java - 继承中的方法签名

在下面的代码中classA{publicvoidv(int...vals){System.out.println("Super");}}classBextendsA{@Overridepublicvoidv(int[]vals){System.out.println("Sub");}}然后我可以调用newB().v(1,2,3);//printSub而不是Super,这很荒谬,但效果很好。如果我将B更改为classB{publicvoidv(int[]vals){System.out.println("NotextendingA");}}对newB().v(1,2,3);的调用将无效。

java - 跨不同类加载器覆盖默认访问器方法会破坏多态性

我在尝试使用默认访问器(例如:voidrun())覆盖方法时遇到了一个奇怪的行为。根据Java规范,如果类属于同一个包,则类可以使用或覆盖基类的默认成员。当所有类都从同一个类加载器加载时,一切正常。但是,如果我尝试从单独的类加载器加载子类,那么多态性就不起作用。这是示例:应用程序.java:importjava.net.*;importjava.lang.reflect.Method;publicclassApp{publicstaticclassBase{voidrun(){System.out.println("error");}}publicstaticclassInsideex

java - C中使用虚方法表的动态调度

我希望找到在C中实现动态调度的提示(最好是好的示例)。我正在学习C,作为练习,我想使用动态分派(dispatch)虚拟方法表从Java转换为C。例如我有一个java代码:abstractclassFoo{publicabstractintval();publicabstractBooleanerror();}classFailextendsFoo{publicintval(){return0;}publicBooleanerror(){returntrue;}}classIntFooextendsFoo{intv;publicIntFoo(intvalue){this.value=v;

java - 创建对象和多态性

我想避免使用标记类和大的if-elseblock或switch语句,而是使用具有类层次结构的多态性,我认为这是更好的做法。例如,如下所示,执行方法的选择仅依赖于Actor类型对象的一个​​字段。switch(actor.getTagField()){case1:actor.act1();break;case2:actor.act2();break;[...]}会变成actor.act();并且act方法将在Actor的子类中被覆盖。但是,在运行时决定实例化哪个子类的最明显方法看起来与原始类非常相似:ActornewActor(inttype){switch(type){case1:re