Tag: 多态

如何创建子类,以便参数属于Java中的子类类型

我有抽象的父类Animal: public abstract class Animal { public abstract T copyAnimal(T animal); } 然后我想创建一个子类Duck但是要覆盖copyAnimal我想使用Duck作为参数,这样: public class Duck extends Animal { @Override public Duck copyAnimal(Duck duck) { return copyOfDuck; } } 这当然给了我一个编译器错误,说明该方法没有被覆盖。 这就是说我怎么能调整这个代码,这样我就不必将Animal传递给copyAnimal()方法来保存转换等等,因为它看起来很丑,需要额外的运行时检查。 或者甚至可能吗? 如果没有,那么最优雅的解决方案是什么?

为什么我们在Java中使用接口引用类型?

我即将参加我的第一个面向对象编程课程的期末考试,我仍然不了解多态性的概念。 假设我有一个抽象类“Vehicle”,这个类有一个名为“Aircraft”的子类。 我的问题是,这两个代码有什么不同? Aircraft Jetplane = new Aircraft(); 和 Vehicle Jetplane = new Aircraft();

什么是Java中的参数多态(带示例)?

据我所知,参数多态是一种允许对各种数据(类型)进行统一操作的技术。 我的知识是否正确? 这个例子是参数多态吗? 我相信这是因为Animal.talk允许在不使用特定动物类型(猫或狗)的情况下调用谈话。 public interface Animal { public String talk(); } public class Cat implements Animal { public String talk() { return “Cat says Meow!”; } } public class Dog implements Animal { public String talk() { return “Dog says Woof! Woof!”; } } import java.util.*; public class PolymorphismExample { public static void main(String[] […]

多态性 – 重载/覆盖

我知道这个问题已经在StackOverflow上完成,并且已经有很多问题已经发布。 我可能已经阅读了它们中的每一个但是,有这个令人唠叨的疑问 :我认为我理解重载很好,并且覆盖。 让我变形的是多态性。 例如, 这个问题的接受答案用shape.Draw()解释了这一点。 我很困惑这与Overriding有什么不同(其他时候我对它与Overloading的不同之处感到困惑)。 此外 – 多态性本质上是指从抽象类派生出来的吗? (我想我几乎所有关于这个主题的答案都使用了一个抽象的动物类,让一只猫和一只狗喵喵叫/吠:) 总之 ,我的问题是: 什么是多态性wrt重载和覆盖? 有人可以在没有抽象类的情况下解释多态性 – 谢谢! 重载/覆盖不是多态的子类型,是吗? 编辑添加第3个问题并修改第2个问题。

Java多态性混乱

下面的问题来自Kathy Sierra和Bert Bates的Java SCJP5一书。 给定一个声明为的方法: public static List process(List nums) 程序员想要使用这样的方法: // INSERT DECLARATIONS HERE output = process(input); 可以在// INSERT DECLARATIONS这里放置哪一对声明以允许代码编译? (选择所有适用的选项。) 一个。 ArrayList input = null; ArrayList output = null; B. ArrayList input = null; List output = null; C。 ArrayList input = null; List output = null; D. List input = null; ArrayList […]

Javainheritance中的“this”关键字如何工作?

在下面的代码片段中,结果确实令人困惑。 public class TestInheritance { public static void main(String[] args) { new Son(); /* Father father = new Son(); System.out.println(father); //[1]I know the result is “I’m Son” here */ } } class Father { public String x = “Father”; @Override public String toString() { return “I’m Father”; } public Father() { System.out.println(this);//[2]It is called in […]

多态性与遗传

假设我有两个类:Animal和Dog。 狗是动物的子类。 我执行以下代码: Animal a = new Dog(); 现在我可以通过一个变量调用Dog类的方法。 但我的问题是:如果我可以通过Dog对象(inheritance)调用所有Animal的方法而不是为什么我应该使用多态原理? 我可以声明: Dog d = new Dog(); 有了这个声明,可以使用Animal的所有方法和Dog方法。 那么为什么要使用多态? 非常感谢您的回答。

不明确的java层次结构

我的问题是为什么下面的x.proc(z)打印57而不是打印39? class X { protected int v=0; public X() {v+=10; System.out.println(“constr X”);} public void proc(X p) {System.out.println(43);} } class Y extends X { public Y() {v+=5;System.out.println(“constr Y”);} public void proc(X p) {System.out.println(57);} public int getV() {return v;} } class Z extends Y { public Z() {v+=9;System.out.println(“constr Z”);} public void proc(Z p) {System.out.println(39);} } class Main […]

java方法重载inheritance和多态

这是我遇到的一个测试练习题,非常感谢您帮助我理解这些概念 让Hawk成为Bird的子类。 假设某些类有两个重载方法void foo(Hawk h)和void foo(Bird b)。 在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本; 这是我到目前为止的代码,有人可以向我解释为什么foo(鸟b)被执行? public class MPractice { public static void main(String args[]) { Bird x = new Hawk(); Third y = new Third(); y.foo(x); } } public class Third { void foo(Hawk h) { System.out.println(“Hawk”); } void foo(Bird b) { System.out.println(“Bird”); } }

使用java中的upcasting调用“覆盖”私有方法

public class PrivateOverride { private void f() { System.out.println(“PrivateOverride f()”); } public static void main(String[] args) { PrivateOverride po = new DerivedWithOutD(); po.d();// PrivateOverride f() PrivateOverride poD = new DerivedWithD(); poD.d();//Derived f() } public void d() { f(); } } class DerivedWithOutD extends PrivateOverride { public void f() { System.out.println(“Derived f()”); } } class DerivedWithD […]