下面是一个关于多态的示例,下面将主要针对这个例子进行分析:
package javaDemo.unit8; import java.io.ObjectInputStream.GetField; class Glyph{ int field1 = 1; static int field2 =2; public String getField(){ return "Glyph: field1 = " + field1 + ", field2 = " + field2; } void draw(){ System.out.println("Glyph.draw()"); } static void info(){ System.out.println("Glyph.static info()"); } Glyph(){ System.out.println("Glyph() before info()"); info(); System.out.println("Glyph() after info()"); System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); } } class RoundGlyph extends Glyph{ int field1 = 3; static int field2 = 4; private int radius = 1; public String getField(){ return "RoundGlyph: field1 = " + field1 + ", filed2 = " + field2; } public String getSuperField(){ return "SuperFiled: field1 = " + super.field1 + ", filed2 = " + field2; } public RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw(){ System.out.println("RoundGlyph.draw(), radius = " + radius); } static void info(){ System.out.println("RoundGlyph.info()"); } } public class PolyConstructors { public static void main(String[] args) { Glyph g = new RoundGlyph(7); g.draw(); g.info(); System.out.println("g.field1 = " + g.field1 + ", g.field2 = " + g.field2); System.out.println(g.getField()); } }
输出如下:
Glyph() before info()
Glyph.static info()
Glyph() after info()
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 7
RoundGlyph.draw(), radius = 7
Glyph.static info()
g.field1 = 1, g.field2 = 2
RoundGlyph: field1 = 3, filed2 = 4
通过以前对多态学习,很容易分析出最下的输出:
①RoundGlyph: field1 = 3, filed2 = 4
这是由于Java中除了static方法和final方法(private方法也属于final方法)之外,其他所有的方法都是动态绑定的。
绑定:将一个方法调用同一个方法主体关联起来。
绑定分为:前期绑定和动态绑定(后期绑定,运行时绑定)
前期绑定:在程序执行前进行绑定
后期绑定:运行时根据对象的类型进行绑定。
而对于输出
②g.field1 = 1, g.field2 = 2
这是由于对于filed的访问操作,是由编译器进行解析的,不是多态的。所以输出直接为父类的field的值。
在实际的开发过程中,我们通常将filed设置为private,然后通过get方法获取到值,所以获取的为子类的field的值。这又一次提醒我们,不要为子类和基类中的field设置相同的名字。
③可以看出在进行初始化时,基类的构造器会首先被调用。
这是由于导出类一般只能访问自己的成员,不能访问基类的成员,只有基类的构造器能够适当的完成对自己元素的初始化。而且子类可以访问基类中的为public和protected成员,来完成子类的初始化,所以必须让所有的构造器都得到调用,才能构造出完整的对象,才能保证子类对象从所有直接或间接父类中继承的实例变量都被正确的初始化。
④
Glyph() before info()
Glyph.static info()
Glyph() after info()
info(),为static方法前期绑定,所以调用的为基类的方法。
⑤
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 7
可以看出在子类初始化时,执行父类构造方法时,构造方法内的方法仍然为动态绑定。
我们来分析一下初始化的顺序:
1)最初,将分配给对象的存储空间初始化为二进制的零。
2)如果初始化的类存在父类,则调用父类的构造方法,构造方法内的方法调用遵循动态调用的规则(此时初始化类的构造方法还未被调用,所以radius的值为0)。
3)按照声明的顺序调用成员的初始化方法。
4)调用初始化类的构造方法。
这也提醒我们:我们应当使用尽可能简单的方法使对象进入正常的状态;尽量避免调用其他方法。在构造方法内能够安全调用的方法是基类的final方法(或private方法)。
相关推荐
Java基础之多态课程PPT适用于基础学习者使用,很好的课程资源
在Java编程语言中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许我们使用一个接口来代表多种不同的类,这使得代码更加灵活,易于扩展。它主要体现在方法的多态和对象的...
Java 多态详解 Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 ...
内含Java基础多态知识点笔记,及部分对应练习题。
非常好的Java基础视频,帮助你掌握Java基础知识 视频很清晰
Java中的多态是面向对象编程的关键特性之一,它允许一个接口或者抽象方法被多个不同的类实现,从而使得代码更加灵活且可扩展。多态的概念基于一个接口可以有多种不同的实现方式,增强了程序的多样性和适应性。 在...
Java编程语言是面向对象的,其中继承和多态是核心概念。这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承...
本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...
### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...
Java基础多态PPT教学课件.pptx
### Java零基础-多态 #### 内容概要 本文旨在深入浅出地介绍Java中的多态(Polymorphism)这一核心概念及其具体应用。读者不仅能够理解多态的基本含义,还能掌握如何在实际编程中运用多态,提高代码的灵活性和可...
### 详解Java接口、继承和多态 ...综上所述,Java中的接口、继承和多态是面向对象编程中非常重要的概念,它们为构建灵活、可扩展的系统提供了基础。理解和熟练掌握这些概念对于成为一名优秀的Java开发者至关重要。
在Java中,一个类只能单继承一个父类,但可以实现多个接口,这就是多态的基础。继承的多态性体现在父类引用指向子类对象时,调用的方法可以是子类重写过的,这样就表现出不同的行为。 2. 抽象类与接口:抽象类是不...
多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态主要通过两种方式体现:**向上转型**和**方法重写...
本PPT对java继承的基本概念,语法及应用进行了讲解。在继承的基础上进一步讲解了由继承引出的方法重写及上塑造性,最后引出多态的概念以及相关代码实例
Java 继承和多态是面向对象...综上所述,Java的继承和多态机制以及封装原则是构建面向对象软件的基础,它们使得代码更加模块化、易于维护和扩展。通过学习和熟练运用这些概念,开发者可以设计出高效、可复用的代码。
在这个实例中,我们将探讨四个关键概念:封装、继承、多态以及文件流操作,这些都是Java中的核心特性,也是理解OOP(面向对象编程)的基础。 首先,**封装**是面向对象编程的核心理念之一,它涉及将数据和方法捆绑...
//练习: //1.做一个教师类Teacher,有属性:1.教师号,2教师姓名, //3教师工资(基本工资,课时费,课时数)。 //有方法:1.输出教师所有信息,2.... //2....//(1)该类有以下属性:学校编号:schId, ...
这样,子类的对象就可以被当作父类的对象使用,这就是多态的基础。 2. 抽象:抽象类或者接口定义了一组公共的方法,子类必须实现这些方法,但具体的实现由子类自己决定。这样,我们可以通过抽象类或接口的引用调用...
在Java编程语言中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许我们使用一个通用的接口来处理不同类型的对象,使得代码更具灵活性和可扩展性。理解并熟练运用多态,能够...