public class DoYouReallyUnderstandPolymorphism {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
System.out.println(a.s); // prints "[AA]"
System.out.println(b.s); // prints "[BB]"
System.out.println(a.getS()); // prints "[AA]"
System.out.println(b.getS()); // prints "[BB]"
System.out.println("====================");
a = b; // a now refers to object b
System.out.println(a.s); // prints "[A]" <<--1-- the class A copy
System.out.println(b.s); // prints "[BB]"
System.out.println(a.getS()); // prints "[BB]"
System.out.println(b.getS()); // prints "[BB]"
System.out.println("====================");
((A)b).s = "[AA]"; // <<--2-- changes the class A copy in object b
System.out.println(a.s); // prints "[AA]" <<--3-- class A copy changed
System.out.println(b.s); // prints "[BB]"
System.out.println(a.getS()); // prints "[BB]"
System.out.println(b.getS()); // prints "[BB]"
}
}
class A {
String s = "[A]";
String getS() {
return s;
}
}
class B extends A{
String s = "";
String getS() {
return s;
}
}
解释:
直观的讲,我们很容易轻信当"a = b;"以后,变量a指向的对象是B类的b那个对象,自然a.s就应该等同于b.s,然而事实并非如此。当B继承A时,父类A的字段s并没有被B的字段s取代,而是保留了一份拷贝,所谓重写(Override),那是对方法而言的。于是,当我们new B()时,在实际创建的对象中,包含了两个版本的字段s,一个"[A]"(属于A类)一个""(属于B类)。而方法getS()只有一个版本。这就是在继承过程中字段和方法的区别。也就是说,重写的概念和字段无关。在第16行,我们通过a.s访问的是b这个对象中保留的A类的字段s;而在21行,我们改变的正是这个A类版本的s字段。
多态的精髓在于动态确定对象的行为,而对象的行为体现在方法而非字段,字段代表的更多的是对象的状态。于是只有方法的多态而没有字段的多态。从上面的代码可以看出,不管你用什么类型的变量存放对象b的引用,最终调用的方法版本都是b的真实类型那个版本,这就是多态的威力。
分享到:
相关推荐
C++实现的一个继承与多态的例子,内容详细且易懂
javascript中如何实现封装,继承和多态
构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰符和方法修饰符 继承 继承的...
学习继承与多态可用。对于继承与多态有着较清晰的理解
1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字
实验四 类的继承与多态实验1.理解软件重用性的一种形式...6.熟悉多态分类,理解静态联编和动态联编概念。 7.掌握运算符重载方法。 8.理解虚函数、纯虚函数和抽象类概念。 9.掌握用抽象类和多态性实现编程的方法。
实验目的及要求 1) 设计类之间的继承关系 2) 在子类重写从父类继承的方法 ...对某动物园的动物进行面向对象建模,需要利用面向对象中的继承和多态来设计类。 动物园包括的动物、动物类型以及他们的继承关系
可以用于继承,多态的学习,有些概念不理解可以参考。
NULL 博文链接:https://lingf.iteye.com/blog/1450831
Java课程的一道实验考试题。主要是关于IO(从键盘输入),继承,多态(动态绑定,静态绑定),集合(客户化排序)等内容。感觉对于理解多态和继承还是挺有作用的。
本ppt详细介绍有关继承、多态,访问控制方面的知识要点,对大家学习理解这块儿很有帮助。
1、理解 Java 类的继承和多态的概念 2、掌握类的继承机制的实现 3、掌握方法的重载,以及多态的实现。
鼠标画图程序 学习鼠标绘图这一章的内容,完成鼠标绘图程序。 理解继承、多态与虚拟方面的知识 鼠标API函数绘图还有窗口
用一个示例来说明C#中的继承、封装和多态,希望对于刚学C#语言的朋友们理解继承、封装和多态有一定的帮助作用吧
每个示例都展示了不同的方面,涵盖了面向对象编程、继承和多态、接口和实现、异常处理、集合框架、文件操作、多线程、输入输出、Lambda表达式和数据库连接等关键主题。 以下是每个示例的简要介绍: 1. 类和对象:...
BREW接口的继承和多态.pdf 一篇深入理解brew接口关联关系的文档 对于c语言的学习人员也非常有用
学习java的好工具,让你更加容易理解java的基本概念!
讲述c++的继承和多态,讲述中举了几个经典的实例,有助于更好的理解
主要介绍了Java面向对象编程(封装/继承/多态)实例解析的相关内容,具有一定参考价值,需要的朋友可以了解下。
本资源完全免费,可以配合小菜鸡写的文章一起配合使用,想把一些不好理解的通俗易懂的解释出来,也希望在大学几年能锻炼自己,让自己的文章和代码被更多人使用,更多人喜欢,自己的理解也可以让大家一起讨论,一起...