多态的运行:
实例方法:动态绑定,即引用的变量实际引用的类型是哪一个,则运行哪一个实例方法。在运行时由java虚拟机动态决定。
静态方法:静态绑定,即引用的变量所声明的类型是哪一个,则运行哪一个静态方法。在编译阶段就已经做出了决定。
成员变量(包括静态变量和实例变量):静态绑定,即引用变量所声明的类型是哪一个,则运行哪个成员变量。在编译阶段就已经做出了决定。
Base who = new Sub();
System.out.println("who.var=" + who.var);
who:引用的变量;
Base: 引用变量所声明的类型;
Sub:引用变量实际引用的类型,
package test1;
public class Base {
String var = "baseVar";
static String staticvar = "staticBasevar";
void method() {
System.out.println("Base method!");
}
static void staticMethod() {
System.out.println("static Base method!");
}
public static void main(String[] args) {
Base who = new Sub();
System.out.println("who.var=" + who.var);
System.out.println("who.static =" + who.staticvar);
who.method();
who.staticMethod();
}
}
class Sub extends Base {
String var = "SubVar";
static String staticvar = "staticSubvar";
void method() {
System.out.println("Sub method!");
}
static void staticMethod() {
System.out.println("static Sub method!");
}
String subvar = "sssssssssss";
void submethod() {
System.out.println("Sub method!wwwwwwwwwww");
}
}
运行结果:
who.var=baseVar
who.static =staticBasevar
Sub method!
static Base method!
分享到:
相关推荐
在运行时,实际调用的是哪个实现类的方法,取决于引用变量实际指向的对象。 以下是一个简单的例子: ```java // 定义接口InterA interface InterA { void fun(); } // 实现接口InterA的类B class B implements ...
而向下转型在编译时没有问题,但在运行时会进行检查,确保对象的真正类型是子类。 - **安全与效率**:向上转型是安全的,不会引发异常,但可能隐藏了子类特有的方法或属性。向下转型需要开发者确保类型正确,否则会...
在运行时,如果一个父类引用指向了子类对象,并调用了这个被重写的方法,那么实际执行的是子类的方法,这就是运行时多态。 3. **接口实现**:接口也是实现多态的一种方式。一个类可以实现多个接口,每个接口代表一...
题目中提到的蓝色字体句子:“当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。...
当基类指针或引用指向派生类对象并调用虚函数时,将根据实际的对象类型而非指针或引用的类型来决定调用哪个版本的函数。这样,我们就可以编写通用代码,处理不同类型的对象,而无需知道它们的具体类型。 2. 纯虚...
* (2)多态引用:左边的变量是父类类型,右边的对象是子类的对象 * * 多态的表现出来的特征:编译类型与运行时类型不一致 * 编译的时候,按照父类的类型进行编译的 * 执行的方法,按照子类进行运行,是...
2. **接口**:接口提供了一种多态的机制,通过实现同一接口的不同类,可以在运行时根据对象的实际类型来决定调用哪个实现。 #### 四、实例解析 在Java中,我们可以通过一个简单的例子来理解多态的工作原理: 假设...
此外,父类引用指向子类对象也是实现多态的关键,这在Java中表现为父类类型的引用变量实际存储子类对象的引用。 方法重载是静态多态的一种形式,它指的是在同一个类中定义多个同名方法,但是方法的参数列表不同。在...
综合以上,这份资料可能包含了一篇关于如何使用Java实现空对象模式、利用虚函数实现运行时多态、以及策略模式的文章,还可能附带了源码示例、运行结果、UML类图和详细的分析文档。这些内容可以帮助读者深入理解并...
在Java中,多态主要体现在两个方面:**编译时类型与运行时类型的不同**以及**对象的向上转型和向下转型**。 #### 编译时类型与运行时类型 在Java中,每个引用变量都有两种类型:**编译时类型**和**运行时类型**。...
运行时多态则基于方法的重写(Overriding),子类可以重写父类的方法,当使用父类引用指向子类对象时,如果调用了被重写的方法,那么在运行时会根据实际的对象类型来执行子类的方法,这就是动态绑定。 理解多态的...
当基类指针或引用指向派生类的对象时,调用虚函数会根据实际的对象类型来执行相应的函数实现,这就是动态绑定或运行时多态。在Java中,多态则是通过接口和继承来实现的,由于所有方法都是虚拟的,所以多态性在Java中...
- **多态**:多态是面向对象的另一大特性,允许使用父类引用指向子类对象,使得同一个方法可以有不同的行为。"第五章 多态.pdf"会讨论多态的概念,包括方法重写(Override)、向上转型和接口的多态性。 5. **接口*...
这种特性使得我们可以在设计时不必知道具体是哪个子类对象,而是在运行时根据对象的实际类型自动选择正确的方法。 6. **向上转型与向下转型**:多态中的向上转型是指将子类对象赋值给父类引用,允许我们使用父类的...
而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于对象的实例化类型而非声明类型。 1. **方法重载(Overloading)**:在同一类中,可以有多个同名的方法,只要它们的参数列表不同(参数个数、...
多态的体现是指父类的引用指向了自己的子类对象。这意味着,我们可以使用父类的引用来指向子类的对象,从而实现多态。例如,在上面的示例代码中,我们使用了父类`Animal`的引用来指向子类`Cat`、`Dog`和`Pig`的对象...
运行时类型识别(RTTI)通过`instanceof`关键字和`getClass()`方法提供了一种检查对象实际类型的方式,从而安全地执行向下类型转换。 #### 八、多态的陷阱:置换私有方法 在多态的场景下,私有方法不参与多态机制,...
多态有两种类型:静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现,而动态多态则依赖于虚函数和抽象类。 虚函数是C++中实现动态多态的关键。在基类中声明虚函数,可以...
- 动态多态(Dynamic Polymorphism):主要通过方法重写(Overriding)实现,子类继承父类并覆盖其方法,运行时根据实际对象类型调用相应的方法。 3. 实现多态的条件: - 继承:至少有一个父类和一个或多个子类。...
- 当调用`animal.sound()`时,JVM会根据animal的引用找到堆中对应的Dog对象,并根据对象的实际类型(而非引用类型)找到sound()方法的实现。这就是动态绑定。 动态绑定使得我们可以在不关心对象具体类型的情况下...