当前位置:文档之家› java多态

java多态

java多态
java多态

Java多态

1. Java中除了static和final方法外,其他所有的方法都是运行时绑定的。private 方法都被隐式指定为final的,因此final的方法不会在运行时绑定。当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法。

2.在派生类中,对于基类中的private方法,最好采用不同的名字。

3.包含抽象方法的类叫做抽象类。注意定义里面包含这样的意思,只要类中包含一个抽象方法,该类就是抽象类。抽象类在派生中就是作为基类的角色,为不同的子类提供通用的接口。

4.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象,因为大家都知道Java垃圾回收器。

5.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。

6.构造方法是被隐式声明为static方法。

7.用继承表达行为间的差异,用字段表达状态上的变化。

在JAVA中有两种多态是指:运行时多态和编译时多态。

关于类的多态性简介如下:

多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指”一种定义,多种实现”.例如,运算符+有多种含义,究竟执行哪种运算取决于参加运算的操作数类型:

1+2 //加法运算符

“1” + “2” //字符串连接运算,操作数是字符串

多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性.

1、类多态性表现

(1)方法重载

重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多种实现.编译时,根据方法实际参数的数据类型\个数和次序,决定究竟应该执行重载方法中的哪一个.

(2)子类重定义从父类继承来的成员

当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,使弗雷成员适应子类的新需求.子类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,子类对象引用子类成员,不会产生冲突和混乱.

子类可重定义父类的同名成员变量,称子类隐藏父类成员变量.子类也可以重定义父类的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法覆盖

(override)父类方法。覆盖父类方法时,子类方法的访问权限不能小于父类方法的权限。

由于Object类的equals()方法比较两个对象的引用是否相等而不是值是否相等,因此一个类要覆盖Object类的equals()方法,提供本类两个对象比较相等方法.

覆盖表现为父类与子类之间方法的多态性.java 寻找执行方法的原则是:从对象所属的类开始,寻找匹配的方法执行,如果当前类中没有匹配的方法,则逐层向上依次在父类或祖先类中寻找匹配方法,直到Object类.

2、super 引用

在子类的成员方法中,可以使用代词super引用父类成员.super引用的语法如下:

super([参数列表]) //在子类的构造方法体中,调用父类的构造方法

super.成员变量//当子类隐藏父类成员变量时,引用父类同名成员变量

super.成员方法([参数列表]) //当子类覆盖父类成员方法时,调用父类同名成员方法

*注意:super引用没有单独使用的语法

3、多态性有两种:

1)编译时多态性

对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性. 2)运行时多态性

如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性.

方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如:

XXXX x1 = new XXXX(参数列表); //对象获得本类实例,对象与其引用的实例类型一致

XXX xx1 = new XXX(参数列表);

x1.toString(); //编译时多态性,执行XXX类的方法.

xx1.toString(); //编译时多态性,执行XXXX类覆盖的方法.

XXXX为XXX的父类.

由于子类对象既是父类对象,父类对象与子类对象之间具有赋值相容性,父类对象能够被赋值为子类对象.例如,

XXXX x2 = new XXX(参数列表); //父类对象获得子类实例,子类对象即是父类对象

x2.toString(); //运行时多态

x2声明为父类对象却获得子类XXX的实例,那么x2.toString()究竟执行父类方法还是执行子类覆盖的方法呢?

这分为两种情况:

取决于子类是否覆盖父类方法.如果子类覆盖父类方法,则执行子类方法;

如果没有覆盖,则执行父类方法.

在编译时,仅仅依据对象所属的类,系统无法确定到底应该执行那个类的方法,只有运行时才能确定,因此这是运行时多态.

父类对象并不能执行所有的子类方法,只能执行那些父类中声明\子类覆盖的子类方法.

在这样一个体系中,多态表现出多种形式的能力。通用多态引用有相同结构类型的大量对象,他们有着共同的特征。特定的多态涉及的是小部分没有相同特征的对象。四种多态可做以下描述:

强制的:一种隐式做类型转换的方法。

重载的:将一个标志符用作多个意义。

参数的:为不同类型的参数提供相同的操作。

包含的:类包含关系的抽象操作。

我将在讲述子类型多态前简单介绍一下这几种多态。

强制的多态

强制多态隐式的将参数按某种方法,转换成编译器认为正确的类型以避免错误。在以下的表达式中,编译器必须决定二元运算符…+?所应做的工作:

2.0 + 2.0

2.0 + 2

2.0 + "2"

第一个表达式将两个double的操作数相加;Java中特别声明了这种用法。

第二个表达式将double型和int相加。Java中没有明确定义这种运算。不过,编译器隐式的将第二个操作数转换为double型,并作double型的加法。做对程序员来说十分方便,否则将会抛出一个编译错误,或者强制程序员显式的将int转换为double。

第三个表达式将double与一个String相加。Java中同样没有定义这样的操作。所以,编译器将double转换成String类型,并将他们做串联。

强制多态也会发生在方法调用中。假设类Derived继承了类Base,类C有一个方法,

原型为m(Base),在下面的代码中,编译器隐式的将Derived类的对象derived转化为Base 类的对象。这种隐式的转换使m(Base)方法使用所有能转换成Base类的所有参数。

C c = new C();

Derived derived = new Derived();

c.m( derived );

并且,隐式的强制转换,可以避免类型转换的麻烦,减少编译错误。当然,编译器仍然会优先验证符合定义的对象类型。

重载的多态

重载允许用相同的运算符或方法,去表示截然不同的意义。…+?在上面的程序中有两个意思:两个double型的数相加;两个串相连。另外还有整型相加,长整型,等等。这些运算符的重载,依赖于编译器根据上下文做出的选择。以往的编译器会把操作数隐式转换为完全符合操作符的类型。虽然Java明确支持重载,但不支持用户定义的操作符重载。

Java支持用户定义的函数重载。一个类中可以有相同名字的方法,这些方法可以有不同的意义。这些重载的方法中,必须满足参数数目不同,相同位置上的参数类型不同。这些不同可以帮助编译器区分不同版本的方法。

编译器以这种唯一表示的特征来表示不同的方法,比用名字表示更为有效。据此,所有的多态行为都能编译通过。

强制和重载的多态都被分类为特定的多态,因为这些多态都是在特定的意义上的。这些被划入多态的特性给程序员带来了很大的方便。强制多态排除了麻烦的类型和编译错误。重载多态像一块糖,允许程序员用相同的名字表示不同的方法,很方便。

参数的多态

参数多态允许把许多类型抽象成单一的表示。例如,List抽象类中,描述了一组具有同样特征的对象,提供了一个通用的模板。你可以通过指定一种类型以重用这个抽象类。这些参数可以是任何用户定义的类型,大量的用户可以使用这个抽象类,因此参数多态毫无疑问的成为最强大的多态。

乍一看,上面抽象类好像是java.util.List的功能。然而,Java实际上并不支持真正的安全类型风格的参数多态,这也是java.util.List和java.util的其他集合类是用原始的https://www.doczj.com/doc/3c3967800.html,ng.Object写的原因(参考我的文章"A Primordial Interface?" 以获得更多细节)。Java 的单根继承方式解决了部分问题,但没有发挥出参数多态的全部功能。Eric Allen有一篇精彩的文章“Behold the Power of Parametric Polymorphism”,描述了Java通用类型的需求,并建议给Sun的Java规格需求#000014号文档"Add Generic Types to the Java Programming Language."(参考资源链接)

包含的多态

包含多态通过值的类型和集合的包含关系实现了多态的行为.在包括Java在内的众多面向对象语言中,包含关系是子类型的。所以,Java的包含多态是子类型的多态。

在早期,Java开发者们所提及的多态就特指子类型的多态。通过一种面向类型的观点,我们可以看到子类型多态的强大功能。以下的文章中我们将仔细探讨这个问题。为简明起见,下文中的多态均指包含多态。

JAVA继承和多态实验报告

实验项目名称:继承和多态 (所属课程:Java语言程序设计) 院系:专业班级:姓名: 学号:实验地点:指导老师: 本实验项目成绩:教师签字:日期: 1.实验目的 (1)掌握类的继承机制。 (2)熟悉类中成员变量和方法的访问控制。 (3)熟悉方法或构造方法多态性。 2.实验内容 (1)模拟编写程序,理解类的继承、多态、继承和多态规则。 (2)独立编程,实现类的继承和多态。 3.实验作业 设计一个类Shape(图形)包含求面积和周长的area()方法和perimeter()方法以及设置颜色的方法SetColor(),并利用Java多态技术设计其子类Circle(圆形)类、Rectangle (矩形)类和Triangle(三角形)类,并分别实现相应的求面积和求周长的方法。每个类都要覆盖toString方法。 海伦公式:三角形的面积等于s(s-a)(s-b)(s-c)的开方,其中s=(a+b+c)/2 程序代码为: Class包 package Class; public class Shape { private String color = "while"; public Shape(String color){ this.color = color; } public void setColor(String color){ this.color = color; } public String getColor(){ return color;

} public double getArea(){ return 0; } public double getPerimeter(){ return 0; } public String toString(){ return"color:" + color; } } package Class; public class Circle extends Shape { private double radius; public Circle(String color,double radius) { super(color); this.radius = radius; } public void setRadius(double radius){ this.radius = radius; } public double getRadius(){ return radius; } public double getCircleArea(){ return 3.14*radius*radius; } public double getCirclePerimeter(){ return 3.14*2*radius; } public String toString(){

java 实验5 接口多态 实验报告

实验五接口、多态与内部类 实验目标: 1、理解接口、塑型、多态的概念并能熟练应用; 2、熟练掌握接口的定义和使用; 3、深刻理解构造方法的调用顺序,理解编写时需要注意的问题; 4、了解并学会使用内部类 实验任务: 1、继承时的多态:目测给出下面代码的执行输出结果,并简单解释每一行输出的原因。 答:首先,该程序的主函数是Vehicle v=new Vehicle();即先声明并实例化一个汽车对象,而v.test();则是调用汽车的测试方法;而test方法里,Vehicle vc=new Car();是将上面的汽车指向了一个具体的小汽车对象;Bus vb=new Bus();将公共汽车指向了一个具体的公共汽车对象;drive();调用汽车的驾驶方法;vc.drive();调用小汽车的驾驶方法;vb.drive();调用公共汽车的驾驶方法;而vc.brake();vb.brake();则是直接调用汽车的刹车方法。因而运行结

果如下: A new bus. Vehicle is driven Car is driven Bus is driven Vehicle is braked Vehicle is braked 2.针对下面的简单的类图,从面向对象的角度,将Instrument定义成接口,应怎样实现。编写能完成如图功能的程序,并再编写一个简单的应用程序进行多态性测试。(参考例子5-9;实验4该题是要求用抽象类来实现,在此要求用接口实现,还要进行多态性测试) 说明:Instrument表示乐器、Wind表示管乐器、Percussion敲击乐器、Stringed表示弦乐器、Woodwind表示木管乐器、Brass表示铜管乐器。 要求:(1)Instrument为接口,Wind为抽象类,其他为普通类。这里测试的目的是:我们知道当一个普通类实现一个接口时,必须实现该接口的全部方法,但当这个类是抽象类时,我们还需要实现该接口全部方法吗?如果不需要实现?那么是否直接不理这个方法就一,还是要将这个方法在自己类内部再标记一次为抽象方法。(听起来有点晕,测试很简单的,有时百读不如一试) (2)请编写测试代码,对实现Instrument接口的各个类进行多态测试,具体可参考课本例子。所谓多态测试就是向上自动塑型,以及向下动态绑定,而动态绑定的基本规则是实例方法“由下往上”寻找绑定,类方法和类属性成员“由上往下”寻找绑定。(对其概念不清晰的请留意课本知识与课堂讲解) 该题代码如下: package zi; interface Instrument { void play(); String what(); void adjust(); }

Java多态的综合例子

Java多态的综合例子: package Test; public interface USBInterface { void start(); void conn(); void stop(); } package Test; public class MovingDisk implements USBInterface { @Override public void start() { // TODO Auto- System.out.println("移动设备已经插入,开始使用"); } @Override public void conn() { // TODO Auto-generated method stub System.out.println("移动设备已经连接,正在使用"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("移动设备已经退出"); } } package Test; public class Mouse implements USBInterface { public void start() { System.out.println("鼠标已插入,开始使用"); } @Override public void conn() { System.out.println("鼠标已经连接,正在使用中"); } @Override public void stop() {

System.out.println("鼠标拨出"); } } package Test; public class MainBorad { public void start() { System.out.println("主板加载成功"); } public void useUsb(USBInterface u) { u.conn(); u.start(); u.stop(); } } package Test; public class KeyBoard implements USBInterface { @Override public void start() { System.out.println("键盘已经插入,开始使用"); } @Override public void conn() { // TODO Auto-generated method stub System.out.println("键盘已经连接,正在使用"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("键盘已经拨出"); } } package Test; public class Test { /** * @param args

java多态的实际应用

多态性是面向对象编程三个重要特性之一。Java中的多态性是通过综合应用继承、覆 盖,以及向上转型实现的。本章首先综合阐述面向对象编程的这些重要特征,引申到代码中的多态概念、多态带来的好处,以及多态能够解决的问题。然后通过实例详细讨论多态技术 在编程中的应用。 3:如何在程序中最有效地计算众多不同几何体的表面积comArea ()? 计算表面积的方法,如comArea,包括其 他类似方法,如comArea,print(),等等,都可应用多态来解决。因为这 些方法都可以针对不同的几何体,进行运算和操作。即:形态不一、方法相同、内容多样。 public abstract class shape { public double area(){ return 0; } public void print(){ } } public class sphere extends shape{ private double r; public sphere(double r){ this.r=r; } public void print(){ System.out.println("球的半径:"+r); } public double area(){

return Math.PI*r*r*r*4/3; } } public class comArea { public static void main(String[] args) { shape h[]; h=new shape[2]; h[0]=new sphere(10); h[1]=new square(10,10,10); Operator.areaMax(h); } } public class Operator { //将长方形和圆看做Shape类型 public static void areaMax(shape h[]){ shape max; for(int i=1;imax.area()) {max=h[i]; } max.print(); }

JAVA(面向对象【接口、多态】)v20170306

第3天面向对象 今日内容介绍 ◆接口 ◆多态 ◆笔记本案例 今日学习目标 ◆写出定义接口的格式 ◆写出实现接口的格式 ◆说出接口中成员的特点 ◆接口和抽象类的区别 ◆能够说出使用多态的前提条件 ◆理解多态的向上转型 ◆理解多态的向下转型 ◆能够完成笔记本电脑案例(方法参数为接口) 第1章接口 1.1接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”。 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。 请记住:一切事物均有功能,即一切事物均有接口。

1.2接口的定义 与定义类的class不同,接口定义时需要使用interface关键字。 定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。 定义格式: public interface 接口名 { 抽象方法1; 抽象方法2; 抽象方法3; } 使用interface代替了原来的class,其他步骤与定义类相同: ●接口中的方法均为公共访问的抽象方法 ●接口中无法定义普通的成员变量 1.3类实现接口 类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements。 其他类(实现类)实现接口后,就相当于声明:”我应该具备这个接口中的功能”。实现类仍然需要重写方法以实现具体的功能。 格式: class 类 implements 接口 { 重写接口中方法 } 在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。 ●接口中定义功能,当需要具有该功能时,可以让类实现该接口,只声明了应该具备 该方法,是功能的声明。 ●在具体实现类中重写方法,实现功能,是方法的具体实现。 于是,通过以上两个动作将功能的声明与实现便分开了。(此时请重新思考:类是现实事物的描述,接口是功能的集合。) 1.4接口中成员的特点 1、接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。后面我们会讲解static与final关键字 2、接口中可以定义方法,方法也有固定的修饰符,public abstract 3、接口不可以创建对象。 4、子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。 interface Demo { ///定义一个名称为Demo的接口。

java多态

Java多态 1. Java中除了static和final方法外,其他所有的方法都是运行时绑定的。private 方法都被隐式指定为final的,因此final的方法不会在运行时绑定。当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法。 2.在派生类中,对于基类中的private方法,最好采用不同的名字。 3.包含抽象方法的类叫做抽象类。注意定义里面包含这样的意思,只要类中包含一个抽象方法,该类就是抽象类。抽象类在派生中就是作为基类的角色,为不同的子类提供通用的接口。 4.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象,因为大家都知道Java垃圾回收器。 5.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。 6.构造方法是被隐式声明为static方法。 7.用继承表达行为间的差异,用字段表达状态上的变化。 在JAVA中有两种多态是指:运行时多态和编译时多态。 关于类的多态性简介如下: 多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指”一种定义,多种实现”.例如,运算符+有多种含义,究竟执行哪种运算取决于参加运算的操作数类型: 1+2 //加法运算符 “1” + “2” //字符串连接运算,操作数是字符串 多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性. 1、类多态性表现 (1)方法重载 重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多种实现.编译时,根据方法实际参数的数据类型\个数和次序,决定究竟应该执行重载方法中的哪一个. (2)子类重定义从父类继承来的成员 当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,使弗雷成员适应子类的新需求.子类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,子类对象引用子类成员,不会产生冲突和混乱. 子类可重定义父类的同名成员变量,称子类隐藏父类成员变量.子类也可以重定义父类的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法覆盖

Java实验报告 继承、多态、接口和异常处理

实验5 继承、多态、接口和异常处理 一、实验目的 1、掌握Java的类和对象的声明和使用方法; 2、掌握Java的类的继承和实现方法; 3、掌握多态性在类的继承中的运用; 4、掌握接口的定义与使用; 5、掌握基本异常的处理机制; 6、熟悉try语句与catch语句的搭配使用; 7、了解有异常处理与没有异常处理的差别; 8、多重catch语句的使用; 9、使用Throws声明异常和Throw抛出异常。 二、实验环境 1、PC微机; 2、DOS操作系统或 Windows 操作系统; 3、Java sdk程序开发环境、eclipse集成环境。 三、实验内容 1. 设计三个类,分别是学生类Student,本科生类UnderGraduate,研究生类 Postjgraduate,其中Student类是一个抽象类,它包含学生的基本信息如姓名、所学课程、课程成绩等,而Undergraduate类和Postgraduate类都是Student类的子类,这两个类计算课程成绩等级的方法有所不同,如下表所示。假设某班级里既有研究生又有本科生,编写程序统计出全班学生 2. 和 Mobilephone具体实现,并设计一个应用程序类来使用这些类。 3.要求设计一个GUI图形窗口程序,该程序让用户输入一个星期中的任意一天的数字1-7,然后输出该数字所对应的是星期几。 四、实验步骤 实验内容一

1.建立package experiment5_1,其最终目录结构如下: 2.建立Student类: package experiment5_1; public abstract class Student { final static int CourseNo = 3; String name; String type; int[] courses; String courseGrade; public Student(String name) { https://www.doczj.com/doc/3c3967800.html, = name; courses = new int[CourseNo]; courseGrade = "" ; } public abstract void calculateGrade(); public String getName( ) { return name; } public String getType( ) { return type ; } public String getCourseGrade( ) { return courseGrade; } public int getCourseScore(int courseNumber) { return courses[courseNumber]; } public void setName(String name) { https://www.doczj.com/doc/3c3967800.html, = name; } public void setType(String type) { this.type = type; } public void setCourseScore(int courseNumber, int courseScore) { //按课程索引号设置课程成绩 this.courses[courseNumber] = courseScore ; } }

Java多态性详解——父类引用子类对象

面向对象编程有三个特征,即封装、继承和多态。 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。 继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢? 方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。 要理解多态性,首先要知道什么是“向上转型”。 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。但当我这样定义时: Animal a = new Cat(); 这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

Java中的多态用法实例分析

Java中的多态用法实例分析 多态分两种: (1)编译时多态(设计时多态):方法重载。 (2)运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一、要有继承(包括接口的实现); 二、要有重写; 三、父类引用指向子类对象。 详细解释: 运行时多态的解释:a.运行时多态是指程序中定义的引用变量所指向的具体类型和b.通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定. 1.程序序中定义的引用变量所指向的具体类型不确定(即一个引用变量倒底会指向哪个类的实例对象)。 例子: driver类中drive方法(Vehicle类vehicle){} oneDriver.drive(newcar()) oneDriver.drive(newbus())

其中vehicle变量无法确定具体使用哪个子类实例。 1.通过该引用变量发出的方法调用在编程时并不确定(该引用 变量发出的方法调用到底是哪个类中实现的方法)。 例子:厨师,园丁,理发师的Cut方法调用.persion.cut(). 多态的好处: 1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。 3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,puteArea()以及puteVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。 4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。 5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

Java继承与多态实验报告

西安邮电大学 (计算机学院) 课内实验报告 实验名称:继承与多态 专业名称:计算机科学与技术 班级:计科1405班 学生姓名:高宏伟 学号:04141152 指导教师:刘霞林 实验日期:2016.10.13

一、实验目的 通过编程和上机实验理解Java 语言的继承和多态特性,掌握变量的隐藏、方法的覆盖、重载,掌握抽象类和接口的使用。 二、实验要求 1.编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序。 2.编写体现类的多态性(成员方法重载)的程序。 3.编写体现类的多态性(构造方法重载)的程序。 4.编写使用接口的程序。 三、实验内容 (一)类的继承 1.创建公共类Student. (1)编写程序文件Student.java,源代码如下: public class Student { protected String name; //具有保护修饰符的成员变量 protected int number; void setData(String m,int h) //设置数据的方法 { name =m; number= h; } public void print() //输出数据的方法 { System.out.println(name+", "+number); } } (2)编译Student.java,产生类文件Student.class。 2.创建继承的类Undergraduate

(1)程序功能:通过Student 类产生子类undergraduate,其不仅具有父类的成员变量name()、number(学号),还定义了新成员变量academy(学院)、department (系)。在程序中调用父类的print 方法。 (2)编写Undergraduate 程序: class Undergraduate extends Student { 【代码1】//定义成员变量academy 【代码2】//定义成员变量department public static void main(String args[]) { 【代码3】//创建一个学生对象s 【代码4】//用父类的setData方法初始化对象s 【代码5】//对象s调用print方法 【代码6】//创建一个大学生对象u 【代码7】//调用父类的成员方法setData初始化对象u 【代码8】//设置对象u的成员变量academy 【代码9】//设置对象u的成员变量department System.out.print(https://www.doczj.com/doc/3c3967800.html,+", "+u.number+", "+u.academy+", "+u.department); } } (3)编译并运行程序 注意:公共类Student 与undergraduate 类要在同一文件夹(路径)。 (二)方法的重载 (1)程序功能:对不同的数进行排序输出。在IntSort 类中定义3 个同名的方法sort。 (2)编写Sort.java 文件,源代码如下。 import java.awt.Graphics; import java.applet.Applet; class IntSort { public String sort(int a, int b) { if (a>b) return a+""+b; else return b+""+a; } public String sort(int a, int b, int c) { int swap; if (a

java多态性

Java的多态性 面向对象编程有三个特征,即封装、继承和多态。 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。 继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢? 方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。 要理解多态性,首先要知道什么是“向上转型”。 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。但当我这样定义时: Animal a = new Cat(); 这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

Java接口多态实验(修正版带实验答案)

实验9:接口、多态性 一、实验目的与要求 1、多态性的概念、技术基础 2、构造方法的调用顺序 3、总结接口的应用 二、内容概要 1、多态性概念 是指不同类型的对象可以响应相同的消息。从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的。 例如 ●Cat行为是吃鱼,Dog行为是吃骨头 ●所有的Object类的对象都响应toString()方法 2、多态性的技术基础 ●向上塑型技术:一个父类的引用变量可以指向不同的子类对象 ●动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从 而实现多态性 3、多态性的好处 应用程序不必为每一个派生类(子类)编写功能调用,只要对基类(特别是抽象基类)或接口处理即可,“以不变应万变”,大大提高程序的可复用性。 例如:下面代码Waiter类中的callPersonEat方法参数是Person 类型,所以利用向上塑性技术可以给其传参数China和USA类型。而该方法体p.eat(); ,利用动态邦定技术运行时候根据p引用的具体对象调用创建对象时所属类的eat方法 interface Person{ public void eat(); } class China implements Person{ public void eat(){ System.out.println("chinese use chopsticks"); } } class USA implements Person{ public void eat(){ System.out.println("usa use forks"); } } class Waiter{ static void callPersonEat(Person p){ p.eat(); //实例方法调用,动态绑定 } public static void main(String a[]){

Java程序设计-多态与接口

Java程序设计 实验四:继承、多态与接口 1.提交期限和方法 期限:第12周周五(2015-11-27)23:59 pm 方法:由学习委员收集所有学生的实验报告,以电子档的形式提交给任课教师(发邮箱:9867941@https://www.doczj.com/doc/3c3967800.html,)。 2.实验目的及要求 掌握Java的基本数据类型、运算符、表达式和语句。 运行环境:JDK1.7 开发环境:Eclipse 3.实验内容及题目 3.1子类的继承与方法的重写 【题1 中国人与美国人】在Eclipse 中创建名为Lab4的新项目,编写程序模拟中国人、美国人、北京人。除主类外,程序中有4个类:People、ChinaPeople、AmericanPeople 和BeijingPeople类。要求如下: (1)People类有权限是protected的double型成员变量:height和weight,以及public void speakHello( )、public void averageHeight( )和public void averageWeight( )方法。 (2)ChinaPeople类是People类的子类,新增了public void chinaGongfu( )方法。要求ChinaPeople重写父类的public void speakHello ()、public void averageHeight( )和public void averageWeight( )方法。 (3)AmericanPeople类是People的子类,新增public void americanBoxing( )方法。要求AmericanPeople重写父类的public void speakHello( )、public void averageHeight( )和public void averageWeight( )方法。 (4)BeijingPeople类是ChinaPeople的子类,新增public void beijingOpera( )方法。要求BeijingPeople重写父类的public void speakHello( )、public void averageHeight( )和public void averageWeight( )方法。 运行效果如下图。按下列代码模板要求,将【代码】部分替换为Java程序代码。

深入理解Java多态性

深入理解java多态性 (一)相关类 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{} (二)问题:以下输出结果是什么? A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = 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)); ⑨ (三)答案 ① 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 (四)分析 ①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是 "B and B”呢?!!先来回顾一下多态性。 运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Ov erloading)。Overloaded的方法是可以改变返回值的类型。方法的重写Overriding 和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overri ding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded 的方法是可以改变返回值的类型。

实验报告 继承、多态与接口

实验三继承、多态与接口 一、实验目的 1.掌握Ja v a的继承机制; 2.掌握对象引用的多态方法; 3.掌握接口的特点、结构和调用; 4.掌握接口和继承的混合使用。 二、实验要求 1.编写体现类的继承性(成员变量、成员方法、成员变量隐藏) 的程序。 2.编写体现类的多态性(成员方法重载、构造方法重载)的程 序。 3.编程使用系统接口的技术和创建自定义接口的方法。 三、实验内容 (一)类的继承性练习 1.理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。 当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类 (su pe rc la ss),这个新类称为子类。 J a va 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。 2.创建公共类S Y3_1_P 编写程序文件S Y3_1_P.ja va,源代码如下:pu bl ic c la ss SY3_1_P{ pr ote c te d St ri ng x m; //具有保护修饰符的成员变量 pr ote c te d in t xh; vo id s et da ta(S tr in g m,in t h) { //设置数据的方法 xm =m; xh = h; } pu bl i c vo id p ri nt(){//输出数据的方法 Sy st em.o ut.pr i nt ln(x m+", "+xh); } }

java重载与多态

多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性。在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度;今天我们再次深入Java核心,一起学习Java中多态性的实现。 “polymorphism(多态)”一词来自希腊语,意为“多种形式”。多数Java程序员把多态看作对象的一种能力,使其能调用正确的方法版本。尽管如此,这种面向实现的观点导致了多态的神奇功能,胜于仅仅把多态看成纯粹的概念。 Java中的多态总是子类型的多态。几乎是机械式产生了一些多态的行为,使我们不去考虑其中涉及的类型问题。本文研究了一种面向类型的对象观点,分析了如何将对象能够表现的行为和对象即将表现的行为分离开来。抛开Java中的多态都是来自继承的概念,我们仍然可以感到,Java中的接口是一组没有公共代码的对象共享实现。 多态的分类 多态在面向对象语言中是个很普遍的概念.虽然我们经常把多态混为一谈,但实际上有四种不同类型的多态。在开始正式的子类型多态的细节讨论前,然我们先来看看普通面向对象中的多态。 Luca Cardelli和Peter Wegner("On Understanding Types, Data Abstraction, and Polymorphism"一文的作者,文章参考资源链接)把多态分为两大类----特定的和通用的----四小类:强制的,重载的,参数的和包含的。他们的结构如下: 在这样一个体系中,多态表现出多种形式的能力。通用多态引用有相同结构类型的大量对象,他们有着共同的特征。特定的多态涉及的是小部分没有相同特征的对象。四种多态可做以下描述:

java多态基础入门

1 多态概述 ●多态概述 ?某一个事物,在不同时刻表现出来的不同状态。 ?举例: ?猫可以是猫的类型。猫 m = new 猫(); ?同时猫也是动物的一种,也可以把猫称为动物。 ?动物 d = new 猫(); ?在举一个例子:水在不同时刻的状态 ●多态前提和体现 ?有继承关系 ?有方法重写 ?有父类引用指向子类对象 ●1:通过猫这个小动物,说猫可以被称为猫,也可以被称为动物。在不同时刻, 猫表现出的不同状态,来说明多态。 多态案例及成员访问特点 ●多态案例 ?按照前提写一个多态的案例 ?成员访问特点 ●成员变量 ●编译看左边,运行看左边 ●成员方法 ●编译看左边,运行看右边 ●静态方法 ●编译看左边,运行看左边

所以前面我说静态方法不能算方法的重写 面试题: 1:看程序写结果(先判断有没有问题,如果没有,写出结果)class Fu { public void show() { System.out.println("fu show"); } } class Zi extends Fu { public void show() { System.out.println("zi show"); } public void method() { System.out.println("zi method"); } } class Test { public static void main(String[] args) { Fu f = new Zi(); f.method(); } }

2:看程序写结果(先判断有没有问题,如果没有,写出结果)class A { public void show() { show2(); } public void show2() { System.out.println("我"); } } class B extends A { public void show2() { System.out.println("爱"); } } class C extends B { public void show() { super.show(); } public void show2() {

相关主题
文本预览
相关文档 最新文档