jjzjj

polymorphism

全部标签

java - 多态调用

我是java新手,在代码中看到很多地方都是前辈声明的ListmyList=newArrayList();(选项1)代替ArrayListmyList=newArrayList();(选项2)你能告诉我为什么人们使用Option1,有什么好处吗?如果我们使用选项2,我们会错过任何优势或功能吗? 最佳答案 选项1被认为是针对接口(interface)进行编程,而选项2是针对实现进行编程。后者有时是必需的,但前者通过确保您不依赖于特定实现提供的方法,使您能够轻松切换实现。此外,如果您创建的方法只需要接口(interface)提供的功能,则

java - 从类定义中删除 final 会破坏向后兼容性吗?

我目前正在阅读JoshuaBloch的《EffectiveJava》,第17条是“为继承设计和记录,否则禁止继承”。作者建议默认禁止继承。在默认情况下将类声明为final是否安全,如果需要扩展类,在以后的版本中删除final关键字是否安全?它会破坏对使用先前版本编译的代码的向后兼容性吗?如果是这样,似乎更安全的做法是将所有类设为最终类,并且仅在有良好支持需求的情况下在未来的版本中将其删除。 最佳答案 它既不破坏二进制也不破坏源兼容性。这就是将类(class)设置为final是个好主意的原因之一;改变主意总是可以的。TheJavaLa

java - 在此代码中如何选择一种方法而不是另一种方法?

这是另一个SCJP问题。下面的代码打印出Alpha:fooBeta:fooBeta:barBeta:bar,我不明白为什么第一个foo调用选择了Alpha的foo而不是Beta的。如果将Alpha.foo参数更改为String而不是String...,则输出为Beta:fooBeta:fooBeta:barBeta:bar,这是有道理的。我的理解是,当您说Alphaa=newBeta();时,编译器会检查Alpha.foo,但JVM实际上会运行Beta.foo。一方面,Beta确实有一个foo方法,其签名与调用相匹配。另一方面,我认为可变参数方法仅在没有其他方法与调用匹配时才运行。所以

java - 实现接口(interface)的方法是否在java中被覆盖

我知道这可能很疯狂,但今天我的一位friend困惑地问,当我们在java中实现接口(interface)时,它是否被视为方法重写。我告诉他这不是覆盖,因为我们在实现任何接口(interface)时第一次提供方法的工作(定义)。java要支持多继承,提供接口(interface),他不服气,争论不休。请阐明这个话题。 最佳答案 术语“重写”适用于存在该方法的现有实现时。对于接口(interface)和其他抽象声明,正确的术语是“实现”。@Override标签用于这两种情况-它在以下情况下使用:Themethoddoesoverride

java - 泛型编程是多态性的一个例子吗?

我正在做一项家庭作业(一个项目),其中一个标准是我必须以一种能显着提高我的代码的整体质量或功能的方式使用多态性。我制作了一个如下所示的哈希表:publicclassHashTable{...}其中Hashable是我创建的具有hash()函数的接口(interface)。我知道以这种方式使用泛型可以提高我的代码质量,因为现在HashTable几乎可以处理我想要的任何类型(例如,不仅仅是整数或字符串)。但我不确定它是否展示了多态性。我认为是的,因为E可以是实现Hashable的任何类型。换句话说,HashTable是一个可以处理(实际上)任何类型的类。但我不太确定-是多态性吗?或许我可以

java - 将 Map<String, String> 传递给需要 Map<String, Object> 的方法

我有一个具有以下签名的方法publicstaticActionDefinitionreverse(Stringaction,Mapargs)我有返回以下内容的方法:publicstaticMaptoMap(Stringvalue)有什么方法可以将toMap的输出转换为反向使用,例如:ActionDefinitionad=reverse("Action.method",toMap("param1=value1,param2=value2"));我需要做类似的事情(Map)toMap("param1=value1,param2=value2");但是我找不到方法去做我也试过下面的方法pub

java - 如何从静态 main() 方法调用内部类的方法

尝试在父类中创建1个接口(interface)和2个具体类。这将使封闭类成为内部类。publicclassTest2{interfaceA{publicvoidcall();}classBimplementsA{publicvoidcall(){System.out.println("insideclassB");}}classCextendsBimplementsA{publicvoidcall(){super.call();}}publicstaticvoidmain(String[]args){Aa=newC();a.call();}}现在我不太确定如何在静态main()方法中创

c# - Java 增强的 for 循环 VS .NET foreach 循环

我有一个问题,我还没有找到答案。假设我们在java或c#中有以下代码:classCar{/*carstuff*/}然后在Java中classTruckextendsCar{/*truckstuff*/}和C#classTruck:Car{/*truckstuffagain*/}在C#中,以下工作正常:ListcarList=newList();//addsomeobjectstothecollectionforeach(TrucktincarList)//dostuffwithonlytheTruckobjectsinthecarListcollection之所以可行,是因为Truck

Java - 避免静态函数的 switch 语句

检查这段代码-switch(kind){case"green":GreenKind.doSomething();//Staticfunctionbreak;case"white":WhiteKind.doSomething();//Staticfunctionbreak;case"blue":BlueKind.doSomething();//Staticfunctionbreak;case"yellow":YellowKind.doSomething();//Staticfunctionbreak;}有办法避免switch语句吗?因为它闻起来很糟糕。也许是这样的?-kinds.get(

java - 什么是java中的多态方法?

在Java的上下文中,请解释什么是“多态方法”。 最佳答案 “多态”意味着“多种形状”。在Java中,您可以拥有一个父类(superclass),它的子类使用相同的名称做不同的事情。传统示例是父类(superclass)Shape,具有子类Circle、Square和Rectangle,以及方法area()。所以,例如//notecodeisabbreviated,thisisjustforexplanationclassShape{publicintarea();//noimplementation,thisisabstract}