让我们看一下这个简单的Java代码:
public class Animal {
public void eat() {
System.out.println("Generic Animal Eating Generically");
}
}
public class Horse extends Animal {
public void eat() {
System.out.println("Horse eating hay ");
}
public void eat(String s) {
System.out.println("Horse eating " + s);
}
}
我试图找出三个eat()方法的哪个版本。现在,当我键入
Animal a = new Animal();
a.eat();
输出是“一般动物食用”,这是完全可以理解的。
当我键入以下内容时,会发生相同的事情:
Horse h = new Horse();
h.eat();
输出是“吃干草的马”,这完全是合乎逻辑的。
这就是让我感到困惑的地方。当我键入:
Animal ah = new Horse();
ah.eat();
我得到:
Horse eating hay
我希望编译器从Animal类引用而不是Horse对象引用中调用eat()方法。
所以我的问题是,当我有一个引用对象类型的通用引用变量类型时,我如何才能确定编译器将调用哪种方法(像这样:Animal horse = new
Horse();)。
我希望编译器从Animal类引用而不是Horse对象引用中调用eat()方法。
让我们先更正此语句。变量ah
是类型的引用,Animal
并且该语句new Horse()
创建类型的实例Horse
并将其分配给Animal
引用。
现在,术语已经很清楚了,这种行为是可以预期的,并被称为运行类型多态或动态方法分派。在编译时,eat()
将基于的引用类型进行解析Animal
,但是在运行时,将被调用的方法基于
实例 类型来进行解析Horse
。
当我有一个引用对象类型的泛型引用变量类型时,如何确定编译器将要调用哪种方法?
您可以按照以下简单步骤操作:
ah.eat()
正在调用方法eat
。Animal ah = new Horse()
,引用类型是Animal
父类Animal ah = new Horse()
,实例类型是Horse
子类。如果满足上述所有条件,则您正在查看运行类型多态性,并且将从子类中调用该方法。在任何其他情况下,将基于引用类型解析要调用的方法。
还需要了解子类从其父类继承方法。假设您public void eat()
从Horse
类中删除了该方法,那么您将不再 覆盖
该eat()
方法;然而,public void eat(String s)
在方法Horse
仍称 重载
继承eat
的方法Animal
。接下来,让我们在中添加一个public void eat(String s)
方法Animal
。有了这个此外,你现在 超载 的eat
在方法Animal
和 Overrding
在它Horse
的类。无论您如何更改代码,上面提到的4个步骤都将始终帮助您确定将调用哪种方法。
让我们用这个简单的Java代码: 我试图找出这三个ate()方法的哪个版本将运行。现在,当我键入 结果是“普通动物一般地吃”,这是完全可以理解的。 当我输入时也会发生同样的事情: 结果是“吃干草的马”,这也是完全合乎逻辑的。 这就是我困惑的地方。当我输入: 我得到: 我期望编译器从动物类引用调用ate()方法,而不是马对象引用。 所以我的问题是,当我有一个泛型引用变量类型引用一个对象类型时(比如:
我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式
我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?
本文向大家介绍java中重载,继承,重写和多态的区别,包括了java中重载,继承,重写和多态的区别的使用技巧和注意事项,需要的朋友参考一下 重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员。 2)重写是继承后重新实现父类的方法。 3)重载是在一个类里一系列参数不同名字相同的方法。 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护。 网上看到一个有趣的说法是:继承是子类使用父类
重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?
问题内容: 我正在努力了解为什么在Java中 需要方法重载和重写 ? 我已经阅读了一些与此相关的文章,但无法理解为什么实际上需要它? 我还访问了以下url,但在该主题中我还不清楚。 Java重载和覆盖 任何实际的例子将不胜感激。 提前致谢。 问题答案: 来自doc的 方法重载: 假设您有一个可以使用书法绘制各种类型的数据(字符串,整数等)的类,并且包含一个用于绘制每种数据类型的方法。为每个方法使用