这个例子涉及到继承与多态的知识,先看看这个例子的输出是否是你的预期。
class Parent {}
class Son extends Parent {}
class Sub1 {
public void fn(Parent P) {System.out.println("Sub1");}
}
class Sub2 extends Sub1 {
public void fn(Son s) {System.out.println("Sub2");}
}
class Sub3 extends Sub2 {
public void fn(Parent p) {System.out.println("Sub3");}
}
public class MyTest {
public static void main(String[] string) {
Son s = new Son();
Parent p = s;
Sub1 sub1 = new Sub1();
sub1.fn(p); //Sub1
sub1.fn(s); //Sub1
sub1 = new Sub2();
sub1.fn(p); //Sub1
sub1.fn(s); //Sub1
sub1 = new Sub3();
sub1.fn(p); //Sub3
sub1.fn(s); //Sub3
Sub2 sub2 = new Sub2();
sub2.fn(p); //Sub1
sub2.fn(s); //Sub2
sub2 = new Sub3();
sub2.fn(p); //Sub3
sub2.fn(s); //Sub2
Sub3 sub3 = new Sub3();
sub3.fn(p); //Sub3
sub3.fn(s); //Sub2
}
}
如果是你预计的结果,那你对继承理解很透彻,可以不需要看下面的分析了。
分析:
继承后,各类的方法如下
class Sub1 {
public void fn(Parent P) {System.out.println("Sub1");}
}
class Sub2 {
public void fn(Parent P) {System.out.println("Sub1");}
public void fn(Son s) {System.out.println("Sub2");}
}
class Sub3 {
public void fn(Parent p) {System.out.println("Sub3");}
public void fn(Son s) {System.out.println("Sub2");}
}
Sub1 sub1 = new Sub2();后,sub1只有fn(Parent P)方法,所以把Son对象作为参数就会强制转换为父类Parent。
Sub1 sub1 = new Sub3();后,Sub3类重写了Sub1的fn(Parent p)方法,所以执行的是Sub3的fn(Parent p)方法。
Sub2 sub2 = new Sub3();后,sub2对象除了有Sub3从Sub2继承过来的fn(Son s)方法,还有Sub3重写了Sub2从Sub1继承过来的fn(Parent p)方法,所以用Son作参数会执行Sub2类的fn(Son s)方法;用Parent作参数会执行Sub3类的fn(Parent p)方法。
分享到:
相关推荐
在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和...通过深入理解继承和多态,开发者可以更好地设计和实现面向对象的解决方案。
C++三种继承方式总结 C++语言中有三种继承方式:public继承、protected继承和private继承。这些继承方式主要是为了改变...通过了解三种继承方式,我们可以更好地理解C++语言的继承机制,提高编程效率和代码重用性。
在农业信息系统开发中,理解并熟练运用继承可以提高代码的结构和效率。下面将深入探讨Java继承的概念、特点以及在实际应用中的作用。 首先,继承允许一个类(子类)从另一个类(父类)中获取特性,这样子类就可以...
首先,让我们理解继承的基本语法。在Java中,我们使用`extends`关键字来声明一个类是另一个类的子类。例如: ```java public class ParentClass { // 父类的属性和方法 } public class ChildClass extends ...
通过亲测验证,这些示例旨在帮助读者理解继承和组合的实际操作及其在实际项目中的应用。 总结来说,继承和组合是面向对象编程中的关键概念,它们分别代表了“is-a”和“has-a”的关系。理解并熟练掌握这两者,将有...
要充分理解继承,我们首先需要了解HTML文档结构是如何组织成一棵树状结构的,即文档树。在这个树形结构中,每一个HTML元素都是一个节点,每个节点可以有零个或多个子节点,同时也可以有一个或多个祖先节点。这里的...
为了更好地理解继承与派生的概念,可以通过实际的例子来进行学习。比如,设计一个简单的图形类层次结构:`Shape` 类作为基类,包含计算面积和周长的基本功能;然后定义具体的图形类如 `Circle`、`Rectangle` 等继承...
首先,我们要理解继承的基本语法。在C#中,子类通过使用冒号":"来声明其父类。例如,如果我们有一个名为`Animal`的父类,我们可以创建一个名为`Dog`的子类,如下所示: ```csharp public class Animal { public ...
通过运行和调试代码,初学者可以直观地理解继承的工作原理以及如何在实际项目中应用。 总结:C#中的继承是实现面向对象编程的重要手段,它提供了代码复用、类层次结构构建和多态性等功能。通过实践案例,初学者可以...
首先,我们需要理解继承的基本概念。继承允许我们定义一个基类,其中包含了一些通用的属性和方法,然后创建一个或多个派生类,这些派生类可以添加自己的特定功能,同时保留基类的所有特性。在这个例子中,描述的是将...
在C++中,类的继承性是面向对象编程的一个核心概念,它允许创建新的类(称为派生类)基于已存在的类(称为基类)。...在实际应用中,需要充分理解继承机制,合理设计类的继承关系,以避免潜在的陷阱。
在实际项目中,合理运用设计模式和理解继承的代价至关重要。通过深入理解每个模式的意图、适用场景以及潜在的问题,开发者可以编写出更加可维护、可扩展的代码,提高软件的质量和生命周期。同时,对C++语言特性的...
通过具体实例——基于点类派生出圆类来实现圆的基本功能(如计算面积和周长),学生将能够更加深刻地理解继承的不同类型(公有、私有、保护继承)及其对类成员访问权限的影响。 #### 知识点解析 1. **继承的基本...
首先,我们来理解继承的基本概念。当我们说一个类B继承自类A,我们可以表示为`class B extends A`。这意味着B类自动拥有了A类的所有非私有(public和protected)成员,包括字段(变量)和方法。这样,B类可以在保留A...
博客链接(http://write.blog.csdn.net/postlist)可能包含有关这些源代码的更详细讨论和示例,帮助理解继承的实际应用和解决特定问题的方法。通过阅读和分析这些源代码,你可以深入学习OC中的继承机制,提升你的...
在这个名为"Classproject2"的项目中,我们可能看到的是一个用Java和JavaFX编写的示例,旨在帮助开发者深入理解继承的概念。 JavaFX是一个用于构建桌面和基于浏览器的应用程序的Java库,提供了丰富的用户界面组件和...
在文件名`ljyjicheng`中,"ljyjicheng"可能是"理解继承"的拼音缩写,暗示了这个程序的目的是帮助学习者理解继承的概念。因此,这个程序可能会通过实例展示如何使用继承来组织代码,提高代码的复用性和可扩展性。 总...
这个实例非常适合初学者,因为理解继承的概念对于掌握C++的面向对象编程至关重要。 继承的主要目的是代码重用和实现类之间的层次结构。通过继承,子类可以自动获得基类的所有公共成员(包括数据成员和成员函数),...