9-Java对象的多态性

合集下载

【Java】面向对象的四个基本特征:唯一性、分类性、继承性和多态性

【Java】面向对象的四个基本特征:唯一性、分类性、继承性和多态性

【Java】⾯向对象的四个基本特征:唯⼀性、分类性、继承性
和多态性
1.唯⼀性
唯⼀性是指每个对象都是唯⼀的,具有唯⼀标识符。

在对象的整个⽣命周期中,标识符是⼀成不变的,系统可通过该标识符,在内存中找到相应对象。

2.分类性
分类性是指将具有⼀致属性和⾏为的对象抽象成类,只保留与应⽤有关的性质,其他内容忽略。

任何类的划分都是主观的,但必须与具体应⽤有关。

3.继承性
继承性是指⼦类⾃动继承⽗类的属性和⽅法,并且可以在⽗类的基础上加⼊若⼲新内容。

例如,“⼈”这个类抽象了这个群体的基本特征,⽽“学⽣”和“⽼师”除了具备“⼈”所定义的基础特性外,各⾃⼜具有各⾃的新特性。

继承性是⾯向对象程序设计语⾔不同于其他语⾔的最重要特点。

通过类的继承,可使公共的特性能够共享,提⾼代码的可重⽤性、减少冗余,同时简化了对象、类的创建⼯作,规范了类的等级结构。

4.多态性
多态性是指不同对象,在收到同⼀消息后,可产⽣不同结果,具有不同表现⾏为。

多态性允许每个对象以⾃⾝的⽅法去响应共同消息,以此增强软件的灵活性和可重⽤性。

多态性的表现形式

多态性的表现形式

多态性的表现形式1.什么是多态⾯向对象的多态性就是将⽗类对象应⽤到⼦类对象的特征。

简单地讲,多态指的就是在应⽤程序中出现的“重名”现象。

多态性允许以统⼀的风格编写程序,以处理种类繁多的已存在的类和相关类。

这样既降低了维护的难度,⼜节省了时间。

2.在java语⾔中,多态性体现在哪些⽅⾯1. ⽅法重载:通常是指在同⼀个类中,相同的⽅法名对应着不同的⽅法实现,这些⽅法名相同的⽅法其区别在于他们需要的参数不同。

即采⽤不同的⽅法形参表,区分重载⽅法要求形参在数据类型、个数和顺序的不同。

(见实例2.1)2. ⽅法重写:⽅法重写主要⽤于⽗类和⼦类间。

⼦类重写⽗类的⽅法,只是对应的⽅法实现不同,其⽅法名和参数都相同。

(见实例2.2)3. 抽象类:在java语⾔中,⼀个类中的⽅法只给出了标准,⽽没有给出具体的实现⽅法,这样的类就是抽象类。

例如⽗类就是抽象类,它不会被实例化的类。

4. 接⼝:在多态机制中,接⼝⽐抽象类使⽤起来更加⽅便。

⽽抽象类组成的集合就是接⼝。

实例2.1 该类中声明了两个show⽅法,但是两个⽅法的形式参数是不同,所以说第⼆个show⽅法重载了第⼀个show⽅法1/* 定义类TestPolymorphisml*/2public class TestPolymorphisml {34 String s="这是⽅法重载的实例";5 String ss="这是⼀个TestPolymorphisml类";6public void show(){7 System.out.println("我是show⽅法"+ss);8 }9public void show( String str){ //这个⽅法就是对上⼀个show⽅法的重载,⽅法名相同,只是他们需要的形参不⼀样10 System.out.println("我重载了show⽅法"+str);11 }12public static void main(String[] args) {13 TestPolymorphisml test = new TestPolymorphisml();14 test.show(); //对象调⽤第⼀个show⽅法15 test.show(test.s); //调⽤重载的show⽅法16 }17 }运⾏结果:实例2.2 先新建⼀个A类,再建⼀个类继承A类,在⼦类中对⽗类的属性和⽅法进⾏重写1/*定义A类*/2public class A {3 String a="我是A类";4public void showA(){5 System.out.println(a);6 }7 }1/*定义类TestPolymorphism2 让它继承A类*/2public class TestPolymorphism2 extends A{3 String b="我是重写⽅法"; //这是对⽗类的a属性的重写4public void showA(){ //这是对⽗类showA⽅法的重写5super.showA(); //使⽤关键字super调⽤⽗类的showA⽅法6 System.out.println(b);7 }8public static void main(String[] args) {9 TestPolymorphism2 n = new TestPolymorphism2(); //创建对象n10 n.showA();11 }12 }运⾏结果:在实验中我们可以很清晰的看出多态性在java语⾔编程中占着多么重要的地位。

Java基本概念:多态

Java基本概念:多态

Java基本概念:多态⼀、简介描述:多态性是⾯向对象编程中的⼀个重要特性,主要是⽤来实现动态联编的。

换句话说,就是程序的最终状态只有在执⾏过程中才被决定,⽽⾮在编译期间就决定了。

这对于⼤型系统来说能提⾼系统的灵活性和扩展性。

多态允许相同类域的不同对象对同⼀消息做出响应。

即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式。

多态可以让我们不⽤关⼼某个对象到底是什么具体类型,就可以使⽤该对象的某些⽅法,从⽽实现更加灵活的编程,提⾼系统的可扩展性。

如果对象的编译时类型和运⾏时类型不⼀致,就会造成多态。

存在条件:1. 类之间有继承关系。

2. ⼦类重写⽗类⽅法。

3. ⽗类引⽤指向⼦类对象。

注意:多态是⽅法的多态,属性没有多态性。

⼀个对象的实际类型是确定的,但是可以指向这个对象的引⽤的类型,却是可以是这对象实际类型的任意⽗类型。

⼦类继承⽗类,调⽤⽅法,如果该⽅法在⼦类中没有重写,那么就是调⽤的是⼦类继承⽗类的⽅法,如果重写了,那么调⽤的就是重写之后的⽅法。

'protected'修饰的⽗类⽅法可以被⼦类见到,也可以被⼦类重写,但是它是⽆法被外部所引⽤的,所以没有多态性。

通过⼀个变量调⽤其引⽤的对象的⼀个⽅法,编译器是否能让其编译通过,主要是看该变量类型的类中有没有定义该⽅法,如果有则编译通过,如果没有则编译报错。

⽽不是看这个变量所引⽤的对象中有没有该⽅法。

Java中的⽅法调⽤,是运⾏时动态和对象绑定的,不到运⾏的时候,是不知道到底哪个⽅法被调⽤的。

编写程序时,如果想调⽤运⾏时类型的⽅法,只能进⾏类型转换,不然通不过编译器的检查。

但是如果两个没有关联的类进⾏强制转换,会报类型转换异常:ClassCastException。

⽰例:public class Test {public static void main(String[] args) {/* 编译看左,运⾏看右 */Student student = new Student();/* 变量person是可以指向Person类型或其⼦类型的对象,所以可以指向Student类型对象 */Person person = new Student();/* 变量student能调⽤的⽅法是Student类中有的⽅法(包括继承过来的) */student.say();//Student/* 变量person能调⽤的⽅法是Person类中有的⽅法 */person.say();//Student}}class Person {public void say() {System.out.println("Person");}}class Student extends Person {public void say() {System.out.println("Student");}}⼆、重写、重载、多态的关系1. 重载是编译时多态调⽤重载的⽅法,在编译期间就要确定调⽤的⽅法是谁,如果不能确定则编译报错。

java面向对象总结(一)

java面向对象总结(一)

java⾯向对象总结(⼀)1. 对象的概念及⾯向对象的三个基本特征⾯向对象的三⼤核⼼特性⾯向对象开发模式更有利于⼈们开拓思维,在具体的开发过程中便于程序的划分,⽅便程序员分⼯合作,提⾼开发效率。

⾯向对象程序设计有以下优点。

1. 可重⽤性:它是⾯向对象软件开发的核⼼思路,提⾼了开发效率。

⾯向对象程序设计的抽象、继承、封装和多态四⼤特点都围绕这个核⼼。

2. 可扩展性:它使⾯向对象设计脱离了基于模块的设计,便于软件的修改。

3. 可管理性:能够将功能与数据结合,⽅便管理。

该开发模式之所以使程序设计更加完善和强⼤,主要是因为⾯向对象具有继承、封装和多态 3 个核⼼特性。

继承性如同⽣活中的⼦⼥继承⽗母拥有的所有财产,程序中的继承性是指⼦类拥有⽗类数据结构的⽅法和机制,这是类之间的⼀种关系;继承只能是单继承。

例如定义⼀个语⽂⽼师类和数学⽼师类,如果不采⽤继承⽅式,那么两个类中需要定义的属性和⽅法.语⽂⽼师类和数学⽼师类中的许多属性和⽅法相同,这些相同的属性和⽅法可以提取出来放在⼀个⽗类中,这个⽗类⽤于被语⽂⽼师类和数学⽼师类继承。

当然⽗类还可以继承别的类,学校主要⼈员是⼀个⼤的类别,⽼师和学⽣是学校主要⼈员的两个⼦类,⽽⽼师⼜可以分为语⽂⽼师和数学⽼师两个⼦类,学⽣也可以分为班长和组长两个⼦类。

使⽤这种层次形的分类⽅式,是为了将多个类的通⽤属性和⽅法提取出来,放在它们的⽗类中,然后只需要在⼦类中各⾃定义⾃⼰独有的属性和⽅法,并以继承的形式在⽗类中获取它们的通⽤属性和⽅法即可。

封装性封装是将代码及其处理的数据绑定在⼀起的⼀种编程机制,该机制保证了程序和数据都不受外部⼲扰且不被误⽤。

封装的⽬的在于保护信息,使⽤它的主要优点如下。

保护类中的信息,它可以阻⽌在外部定义的代码随意访问内部代码和数据。

隐藏细节信息,⼀些不需要程序员修改和使⽤的信息,⽐如取款机中的键盘,⽤户只需要知道按哪个键实现什么操作就可以,⾄于它内部是如何运⾏的,⽤户不需要知道。

JAVA多态性 ppt课件

JAVA多态性  ppt课件

a.fun1();
// 此方法被子类覆写过
}
}
PPT课件
6
对象的向下转型
class A{ public void fun1(){
// 定义类A // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
} public void fun2(){
PPT课件
5
对象的向上转型
class A{ public void fun1(){
// 定义类A // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
} public void fun2(){
// 定义fun2()方法
this.fun1() ;
A a = new B() ;
// 发生了向上转型的关系,子类 --> 父类
B b = (B)a ;
// 此时发生了向下转型关系
b.fun1() ;
// 调用方法被覆写的方法
b.fun2() ;
// 调用父类的方法
b.fun3() ;
// 调用子类自己定义的方法
}
}
PPT课件
7
多态禁忌
•千万不要出现这样的操作:就是将父类对象转换成为子类是类型 – Animal a=new Animal(); – Dog d4=(Dog)a;//类造型异常
}
}; class B extends A{
public void fun1(){
// 子类通过extends继承父类 // 覆写父类中的fun1()方法

[Java面试题目与答案]台积电面试题目与答案

[Java面试题目与答案]台积电面试题目与答案

[Java面试题目与答案]台积电面试题目与答案1、面向对象的特征有哪些方面答:面向对象的特征主要有以下几个方面:-抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。

抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

-继承:继承是从已有类得到继承信息创建新类的过程。

提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。

继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。

-封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。

面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。

我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。

可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。

-多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。

简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。

多态性分为编译时的多态性和运行时的多态性。

如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。

方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

2013JAVA期末复习

2013JAVA期末复习
但是对象的引用与内存地址无关,不能计算。利用 this 可以调用当前对象的方法或使用当前对象的域。 7. super:代表是直接父类,通过它来引用父类的成员。 8. 多态:指一个程序中同名的不同方法共存的情况。可以表现为子类对父类方法的覆盖,也可以表现为一个类中
方法的重载,还可以将子类的对象作为父类的对象实现对象的多态。 9. 对象引用的多态:即对象的引用型变量具有多态性。因为子类对象可以作为父类对象来使用,但是父类对象不
4. Java是区分大小写的语言,关键字的大小写不能搞错,如果把类class写成Class或者CLASS,都是错误的。 ()T
5. Java源程序编写好之后,以文件的形式保存在硬盘或U盘上,源文件的名字可以随便取的,它不一定与程序 的主类名一致。()F
6. 在JDK命令行开发工具中,用编译程序javac.Exe编译生成的文件是二进制可执行文件。()F
}
第4章
通过_______运算符就能实现对对象成员变量的访问和对象方法的调用。(圆点) 类的构造方法的名称必须与_______名相同。(类)
简述题
1. 什么是类?什么是对象?类和对象有何联系? 1. 答:在面向对象程序设计里,类是定义一个对象的属性和方法的蓝本。对象就是一组变量和相关方法的集
合,其中变量表明对象的状态,方法表明对象所具有的行为。类是对象的模板,对象是类的实例,可以从一个类中 创建许多对象。
简述题 1. 方法的重载和方法的覆盖有什么不同?
答:方法重载,指的是在类中创建多个具有相同名称,但使用不同参数的方法,Java虚拟机根据传递给方法的参数 个数和类型决定调用哪个重载方法。方法的覆盖指在子类中重新定义父类中已有的方法,对于重写的方法,运行时 系统根据调用该方法的实例的类型来决定选择哪个方法调用。

java面向对象试题及答案(二)

java面向对象试题及答案(二)

java面向对象试题及答案(二)1. 什么是面向对象编程?- 面向对象编程(Object-Oriented Programming,OOP)是一种编程思想,它将现实中的事物抽象成对象,并通过对象之间的交互来完成程序的设计和实现。

2. 面向对象编程的特点有哪些?- 封装性:将数据和方法封装在一起,对外部隐藏实现细节,只提供公共接口。

- 继承性:通过继承可以实现代码复用,减少重复编写代码的工作量。

- 多态性:同一种方法可以有不同的实现方式,提高程序的灵活性和可扩展性。

3. 什么是类和对象?- 类是一种抽象的数据类型,它描述了一类事物的属性和行为。

- 对象是类的一个实例,具有该类所描述的属性和行为。

4. 什么是继承?- 继承是一种机制,它允许新的类在已有类的基础上进行扩展,从而实现代码的复用和扩展性的提高。

5. 什么是多态?- 多态是指同一个方法可以有不同的实现方式,具体的实现方式由调用该方法的对象决定。

6. 什么是重载和重写?- 重载是指在同一个类中定义多个同名方法,但参数列表不同,可以根据参数列表的不同来调用不同的方法。

- 重写是指在子类中重新定义父类中已有的方法,使得子类对象调用该方法时执行子类中的实现。

7. 什么是抽象类和接口?- 抽象类是一种不能被实例化的类,它只能被继承,用于定义一些抽象的方法和属性,子类必须实现这些抽象方法和属性才能被实例化。

- 接口是一种只包含抽象方法和常量的抽象类型,它定义了一些规范,子类必须实现这些抽象方法才能被实例化。

8. 什么是异常?- 异常是指程序在运行过程中出现的错误或意外情况,它会导致程序的中断或崩溃。

Java提供了异常处理机制,可以捕获和处理异常,保证程序的正常运行。

9. 什么是泛型?- 泛型是一种抽象的数据类型,它可以用来定义一种通用的类型,使得代码可以更加灵活和可扩展。

泛型可以在编译时检查类型安全,减少运行时错误。

10. 什么是反射?- 反射是指在程序运行时动态地获取类的信息,包括类的属性、方法和构造器等,可以在运行时动态地创建对象、调用方法和访问属性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

抽象类 如果某个类中包含有抽象方法,那么该类就必须 定义成抽象类; 定义抽象类同样使用关键字abstract,一般语法: [访问权限] abstract class 类名 { 成员列表 } 如: public abstract class Shapes { public abstract void draw(); }
public class TeacherManager { public void judge(JavaTeacher t){ t.introduce(); t.teach(); } public void judge(DotNetTeacher t){ t.introduce(); t.teach(); } public static void main(String[] args) { TeacherManager tmq = new TeacherManager (); tmq.judge(new JavaTeacher("李明", 25, 3)); tmq.judge(new DotNetTeacher("张明", 27, 5)); } }
多态概述
多态是指具有表现多种形态的能力 同一个实现接口,使用不同的实例而执行 不同操作
打印机
打印 彩色打印机
打印 黑白打印机
打印效果:彩色
打印效果:黑白
1、子类重写父类的方法 2、编写方法时,使用父类定义的方法 3、运行时,JVM会根据实际创建的对象类型动 态决定使用哪个方法
可以接收子类类型
public class TMQ { public void judge(Teacher t){ t.sayHi(); t.lesson(); } public static void main(String[] args) { TMQ tmq = new TMQ(); tmq.judge(new JavaTeacher("李明",25,3)); tmq.judge(new DotNetTeacher("张明",27,5)); tmq.judge(new DBTeacher(“李岚",26,3)); } }
开发任务
龙与地下城怪物设计
(4)死亡判定规则为:血量小于等于0 (5)设置两种怪物:独眼巨人,树怪 (6)独眼巨人特有的属性有:武器(狼牙棒或钉 锤);独眼巨人具有的攻击方法是:使用武器(狼 牙棒或钉锤)攻击 (7)树怪特有的属性:高度;树怪的攻击方式是使 用树枝缠绕攻击
开发任务
龙与地下城怪物设计
抽象类 (模板)
覆写抽 象方法
具体类 (实现)
实例—实况足球
任意 球
跑动
点球
射门
铲球
球员
C罗
梅西
皮尔洛
内马尔
开发任务
龙与地下城怪物设计
开发需求 (1)英雄具有的属性包括:姓名、职业、等级、血 量、攻击力和防御力,具有的方法包括:显示属性、 判定是否死亡、攻击 (2)怪物共有的属性包括:名称、血量、攻击力、 防御力;共有的方法包括:显示属性、判定是否死亡、 和攻击 (3)攻击的伤害值计算公式为:攻击者攻击力-被攻 击者防御力,被攻击者的血量会要扣减调伤害值
(8)创建2只独眼巨人、1只树怪和1个英雄,英雄 与3只怪物轮流攻击对方:英雄攻击时,随机选取1 只怪物作为攻击对象;怪物攻击时,随机选取1只怪 物攻击英雄 (9)当怪物全部死亡时,提示“英雄获胜!”;当 英雄死亡时,提示“英雄阵亡!”
开发任务
开发任务
public class DBTeacher extends Teacher { public void teach(){ System.out.println("启动 SqlServer"); super.teach(); } }
public class Test { public static void main(String[ ] args) { TMQ hq = new TMQ(); hq.judge(new DBTeacher()); } }
根据实际创建的对象类 型调用相应方法
public class Teacher { public void teach(){ System.out.println("知识点讲解"); System.out.println("总结提问"); } }
public class TMQ { public void judge(Teacher t) { t.teach(); } }
抽象方法 在某些情况下,基类无法(或者没有必要)提供 被覆盖方法的具体实现,那么就可以将此方法声 明成抽象方法; 使用关键字abstract声明抽象方法,一般语法: [访问权限] abstract 返回值类型 方法名称(参 数列表); 如: public abstract void draw();
给定如下Java代码,编译运行后,输出结果是什么?
public class Teacher { 1 public void giveLesson(){ System.out.println("知识点讲解"); } } public class DBTeacher extends Teacher { public void giveLesson(){ System.out.println("启动 SqlServer"); } } public class Test {
模板设计模式
冲泡模板
把水煮沸 用开水冲泡 倒进杯子 加调味品
速溶咖啡冲泡方案
把水煮沸 用开水冲泡 咖啡 把咖啡倒进 杯子 加糖和牛奶
绿茶冲泡方案
把水煮沸 用开水冲泡 茶叶 把茶倒进杯 需要开发抽象类和具体子类的 设计师之间的协作 一个设计师负责给出一个算法的轮廓和骨架, 另一些设计师则负责给出这个算法的各个逻 辑步骤
抽象类的注意事项
抽象类不可以直接实例化,只可以用来继承 抽象类的派生子类应该提供对其所有抽象方 法的具体实现(覆写所有抽象方法) 可以这么认为,抽象方法实际上就是由抽象 基类强制要求其派生子类必须实现的方法原 型
抽象类的注意事项
如果抽象类的派生子类没有实现其中的所有 抽象方法,那么该派生子类仍然是抽象类, 只能用于继承,而不能实例化 抽象类中也可以包含有非抽象的方法 构造方法和静态方法不可以修饰为abstract


现在,升级教员类,增加一种新类型:DBTeacher, 该类型的教员专门负责教授数据库,要求如下: 属性:姓名、年龄、教学年限 方法:授课(启动Sql Server、实施理论课授 课)、自我介绍 同时,教学管理中心也负责对这类教员进行评估

如果在前述方案的基础上去解决,我们需要如 下两个步骤: 建立DBTeacher类 修改教学管理中心类,增加方法: judge(DBTeacher t) 这种方法有什么不好的地方? 每增加一种新的教员类型,都要修改教学管理 中心类,增加相应的judge(评估)方法,代码 的可扩展性及可维护性差
编程练习


请编码实现如下需求: 乐器(Instrument)分为:钢琴(Piano)、小提 琴(Violin) 各种乐器的弹奏( play )方法各不相同。 编写一个测试类InstrumentTest,要求: 编写方法playTest,对各种乐器进行弹奏测试。 要依据乐器的不同,进行相应的弹奏。 在main方法中进行测试
2
}
public static void main(String[] args) { Teacher t = new DBTeacher (); t.giveLesson(); } 控制台输出 启动 SqlServer
模板设计模式
模板设计模式是最为常见的设计模式之一 它是指搭建一个算法或方案的框架,而实现 方式可以依据具体情况的不同而不同 所有遵循同一模板的类,都有相同或部分相 同的结构 模版方法模式是基于继承的代码复用的基本 技术,模版方法模式的结构和用法也是面向 对象设计的核心
Java编程精要
— Java对象的多态性
福建 厦门 2016年6月
本章相关词汇




Override method 方法重写 Convert 转换 abstract 抽像的
本章目标
对象的多态性 抽像方法
多态性概述



创建教员基类(Teacher), 在教员基类的基础上,再创建两个子类:JAVA教 员(JavaTeacher)和.NET教员(DotNetTeacher), 开发一个类代表教学管理中心,负责对各教员进 行评估,评估内容包括: 1、教员的自我介绍 2、教员的授课
相关文档
最新文档