public class Extendc {
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
class E{}
public static void main(String[] args){
Extendc et=new Extendc();
Extendc.A a1= et.new A();
A a2 = et.new B();
B b = et.new B();
C c = et.new C();
D d = et.new D();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
如上所示例程1,输出结果如下:
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D
理解各个输出,关键理解点在继承与多态,我们知道,对一个引用变量而言,编译时,变量与其所声明的类型绑定,而运行环境中,其和实际引用类型绑定,所以上述例程中,引用变量a2编译时是和A绑定,但在运行时引用的是B的对象,依据如此理解,或许有人觉得a2.show(b)理当输出“B and B”才对,但实际输出的却是“B and A”,也就是说a2.show(b)实际上调用的是class B的show (A obj)方法,为什么不调用class B的show (B obj)方法呢,细揣摩之,如此理解,未知确否。
所谓编译时和声明类型绑定,编译器在编译a2.show(B)时,认为该方法调用的是A的show(A)方法,因为A类里只有两个方法,参数b是B的实例,B继承自A,所以理应在类A的两个方法里决定调用show(A);那么实际运行的时候,java虚拟机运行环境究竟决定怎么调用这个方法呢,这就用到了重载和重写的概念,a2实际上是B的一个实例,B从A继承了show(A)的方法,虚拟机判断B对方法show(A)进行了重写,所以就调用被重写了的show(A)方法,于是输出“B and A”。
我们对上面的程序稍作修改,进一步验证一下我们的推论。
如下例程2,更换了一行代码
public class Extendc {
class A {
public String show(D obj){
return ("A and D");
}
public String show(Object obj){
return ("O and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
public static void main(String[] args){
Extendc et=new Extendc();
Extendc.A a1= et.new A();
A a2 = et.new B();
B b = et.new B();
C c = et.new C();
D d = et.new D();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
输出:
O and A
O and A
A and D
O and A
O and A
A and D
B and B
B and B
A and D
依据上述原理,验证通过。
这里又发现一个值得注意的问题,编译器在根据参数决定调用那个方法的时候,编译器总是将和参数声明类型最相近的那一个方法作为调用方法。比如例程2的最后一个,b.show(d),在B的方法中(包含继承自父类的),四个方法均参数符合调用要求,编译器选择的是A类中的show(D d)。我们不妨称之为“就近原则”。
欢迎指正学习。
分享到:
相关推荐
压缩包中的"易语言的继承多态演示源码"文件可能包含了一个实际的程序示例,展示了如何在易语言中应用继承和多态。源码通常包括类定义、继承关系的声明、方法的重写以及可能的接口实现。通过分析源码,我们可以看到...
Java编程语言以其强大的功能和广泛的应用而闻名,其中三大特性——封装、继承和多态是其核心概念,对于理解和编写高效、可维护的代码至关重要。 **封装**是面向对象编程的基础,它涉及到将数据(属性)和操作这些...
在C#编程语言中,继承和多态是面向对象编程的两大核心概念,它们极大地增强了代码的可重用性、灵活性和扩展性。本项目旨在通过实际操作来深入理解和应用这两个概念。 首先,让我们理解“继承”。继承允许一个类...
在C++编程语言中,封装、继承和多态是面向对象编程(OOP)的三大核心概念。下面将深入解析这三个关键概念,并结合"cppgood"这个可能包含示例代码的压缩包,来阐述它们在实际编程中的应用。 **封装** 是面向对象编程...
通过这样的练习,学习者能够更好地理解如何在实际场景中应用继承、多态、集合和IO操作,加深对这些概念的理解,提高编程能力。对于初学者来说,这是一个很好的实践项目,可以帮助他们将理论知识转化为实际技能。
javascript中如何实现封装,继承和多态
在编程领域,继承和多态是面向...通过观看"2-2继承&多态"的教学视频,你可以深入理解这两个概念,并通过提供的源码进行实践操作,巩固理论知识,如有疑问还可以在线提问,这无疑将加速你的编程技能提升,避免走弯路。
在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和...通过深入理解继承和多态,开发者可以更好地设计和实现面向对象的解决方案。
根据文件名推测,这是一个关于矩形类的练习,可能包含了如何利用继承和多态的概念来设计一个图形类库。通常,我们可能会有一个抽象的`Shape`类作为基类,它包含共享的属性(如颜色)和方法(如获取面积),然后有...
通过查看和分析这些代码,你可以深入理解继承和多态的概念,并从中学习如何在实际项目中有效地运用它们。 总的来说,继承和多态是面向对象编程的关键要素,它们使得代码更加灵活、可扩展且易于维护。通过不断的实践...
Java编程语言以其面向对象特性,...实践这些概念不仅能够加深理解,还有助于编写出更加灵活、可维护的代码。对于初学者来说,这是一个很好的起点,而对于经验丰富的开发者来说,也是一个复习和巩固基础知识的好机会。
以下是关于面向对象编程、抽象方法、继承和多态的详细解释。 1. 面向对象编程(OOP): OOP是一种编程思想,它将程序设计为由相互协作的对象集合构成。每个对象都有自己的属性(数据)和行为(方法)。这种结构使...
总结来说,"C++程序设计-封装、继承多态应用示例"是一个很好的教学资源,它通过一个生动的龙与人战斗场景,帮助初学者理解并实践了面向对象编程的关键概念。通过这个示例,学习者不仅可以了解这些理论知识,还能通过...
继承与多态 继承是面向对象编程中的一种机制,它允许一个类继承另一个类的所有成员变量和成员函数,从而可以实现代码的复用和减少代码的冗余。在 C++ 中,继承是通过关键字 `class` 和 `:` 实现的,例如 `class ...
### 关于C++继承与多态的深度思考 #### 继承(Inheritance) 在C++中,继承是一种机制,允许创建一个新类(派生类)来继承另一个已存在的类(基类)的所有属性和行为。继承使得代码复用成为可能,同时也提供了面向...
理解并熟练运用继承和多态是提升软件开发效率的关键。它们使得代码结构更加清晰,模块化程度更高,同时降低了维护成本。通过学习这个“继承与多态程序演示”,你可以深入理解这两种机制,并能够在实际项目中有效地...
在C#编程中,"C#做的计算器,利用类的封装继承多态"是一个典型的面向对象编程示例。这个计算器项目展示了如何应用C#的核心概念,如类、封装、继承和多态,来构建一个实际的软件应用。下面将详细解释这些知识点。 1....
本主题将深入探讨“leijicheng.rar”压缩包中涉及的“继承多态问题”,特别是虚拟基类和虚拟函数在多继承中的应用。 首先,我们来理解“继承”。继承是一种机制,允许一个类(子类)继承另一个类(父类)的属性和...
### 面向对象编程与C++中的继承和多态 #### 1. 面向对象编程思想的诞生 面向对象编程(Object-Oriented Programming, OOP)的引入,是为了克服传统面向过程编程的一些局限性。面向过程编程,如C语言,更侧重于按...
在本实验报告中,我们将深入探讨Java编程中的两个核心概念:类的继承和多态的应用。实验主要目标是加深对抽象类和抽象方法的理解,并掌握如何在实际编码中实现类的继承以及多态性。 首先,让我们理解抽象类和抽象...