Java(第8章面向对象(多态性for reading)
面向对象知识点总结

⾯向对象知识点总结1、⾯向对象三⼤特征封装:封装就是隐藏对象的属性和实现细节,仅对外公开接⼝,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和⾏为(或功能)相结合,形成⼀个有机的整体。
继承:继承就是⼦类继承⽗类的特征和⾏为,使得⼦类对象(实例)具有⽗类的实例域和⽅法,或⼦类从⽗类继承⽅法,使得⼦类具有⽗类相同的⾏为。
多态:多态指同⼀个⾏为具有多个不同表现形式或形态的能⼒,是指⼀个类实例(对象)的相同⽅法在不同情形有不同表现形式,使具有不同内部结构的对象可以共享相同的外部接⼝。
2、类与对象对象:对象是类的⼀个实例,有状态和⾏为。
类:类是⼀个模板,它描述⼀类对象的⾏为和状态。
⼀个类可以包含以下类型变量:(1)局部变量:在⽅法、构造⽅法或者语句块中定义的变量被称为局部变量。
变量声明和初始化都是在⽅法中,⽅法结束后,变量就会⾃动销毁。
(2)成员变量:成员变量是定义在类中,⽅法体之外的变量。
这种变量在创建对象的时候实例化。
成员变量可以被类中⽅法、构造⽅法和特定类的语句块访问。
(3)类变量:类变量也声明在类中,⽅法体之外,但必须声明为 static 类型。
3、构造⽅法每个类都有构造⽅法。
如果没有显式地为类定义构造⽅法,Java 编译器将会为该类提供⼀个默认构造⽅法。
在创建⼀个对象的时候,⾄少要调⽤⼀个构造⽅法。
构造⽅法的名称必须与类同名,⼀个类可以有多个构造⽅法。
4、封装封装是指⼀种将抽象性函式接⼝的实现细节部分包装、隐藏起来的⽅法。
封装可以被认为是⼀个保护屏障,防⽌该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接⼝控制。
修改属性的可见性来限制对属性的访问(⼀般限制为private),可通过getter和setter⽅法访问和操作类中私有成员变量。
如下代码:class BookClass{private String title;private int pageNum;BookClass(){};// 设置名称public void setTille(String title) {this.title = title;}public String getTitle() {return title;}// 设置页数public void setPageNum(int pageNum) {if (pageNum>=200) {this.pageNum = pageNum;} else {System.out.println("页数输⼊错误,图书页数不能⼩于200页,设置为默认值200");this.pageNum = 200;}}public int getPageNum() {return pageNum;}// 显⽰图书信息public void detail() {System.out.println("图书名称为:"+title+",页数为:"+pageNum);}}5、继承在 Java 中通过 extends 关键字可以申明⼀个类是从另外⼀个类继承⽽来的。
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语言程序设计(第3版)(2018年清华大学出版社出版

作者简介
沈泽刚,1964年生,男,汉族,渤海大学信息科学与技术学院副教授、硕士生导师,研究方向为计算机应用 技术。
谢谢观看
2018年4月1ห้องสมุดไป่ตู้,该教材由清华大学出版社出版。
内容简介
全书共18章,主要内容如下:
第1章介绍Java语言的起源和发展、Java开发环境的构建、简单Java程序的开发和运行、程序设计风格与文 档以及集成开发环境Eclipse的使用。
第2章介绍数据类型、常用运算符、表达式以及数据类型的转换等。
第3章介绍程序的流程控制结构,包括选择结构和循环结构。重点介绍if结构、switch结构、while循环、 do-while循环以及for循环结构。
Java语言程序设计(第3版)(2018 年清华大学出版社出版
2018年清华大学出版社出版的图书
01 成书过程
03 教材目录 05 教材特色
目录
02 内容简介 04 教学资源 06 作者简介
《Java语言程序设计(第3版)》是由沈泽刚主编,2018年清华大学出版社出版的21世纪高等学校计算机类 课程创新规划教材。该教材可作为高等院校计算机专业或相关专业的“Java程序设计”或“面向对象程序设计” 课程的教材,也可作为Java认证考试及编程爱好者的参考资料。
第7章介绍类的继承与多态,其中包括继承性、封装性、多态性以及对象转换等。
第8章介绍Java常用核心类,包括Object类、Math类、基本数据类型包装类等,另外介绍了Java8新增的日 期-时间API相关的类。
教材目录
(注:目录排版顺序为从左列至右列 )
教学资源
该教材有配套教材——《Java语言程序设计(第3版)学习指导与习题解析》,书中提供了学习指导、实训 任务及编程练习的参考答案。
08面向对象导论

第8章面向对象方法学导论哈尔滨理工大学荣成学院李胜利•结构化软件开发曾经给软件产业带来了巨大进步,部分地缓解了软件危机。
使用这种方法开发的许多中、小型软件项目大都获得了成功。
但是,把它应用于大型软件产品的开发时,却很少取得成功。
•在20世纪60年代后期出现了类和对象的概念;80年代中期起,逐步形成了面向对象方法学。
90年代,面向对象成为人们开发软件的首选方法。
总体上说,面向对象技术是当前最好的软件开发技术•面向对象方法学概述•面向对象方法学的主要优点•面向对象的概念•面向对象建模1. 面向对象方法学概述•面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能一致。
•面向对象方法的要点:(1)客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。
面向对象方法使用对象分解取代了传统方法的功能分解。
(2)把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。
数据表示对象的静态属性,是对象的状态信息。
类中定义的方法,是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。
(3)按照子类(派生类)与父类(基类)的关系,把若干个对象类组成一个层次结构的系统(类等级)。
在这种层次结构中,通常下层的派生类继承上层基类的特性(数据和方法),但如果在派生类中对某些特性做了重新描述,则以新描述为准。
即低层的特性将屏蔽高层的同名特性。
(4)对象彼此之间仅能通过传递消息互相通信。
对象与传统的数据有本质的区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须发送消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。
也就是说,一切局部于该对象的私有信息,都被封装在对象的定义内,外界看不见,也不能直接操作。
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()方法
面向对象编程中的多态性

面向对象编程中的多态性近年来,随着计算机技术的飞速发展,在软件工程中,面向对象编程(Object-Oriented Programming,OOP)逐渐成为了一种主流的编程思想,也是一种被广泛使用的编程范式。
面向对象编程在软件工程中的应用已经越来越广泛,目前已经成为了大多数编程语言中最基本的组成部分。
在面向对象编程中,多态性(polymorphism)是一种非常重要的概念,是面向对象编程语言的主要特性之一。
一、多态性的概念多态性是面向对象编程的核心概念之一,代表一种对象多态化的能力。
面向对象编程中的多态性是指对于同一类型的不同对象的同一操作,在运行时可以有不同的行为,即同一方法的不同实现方式。
换句话说,多态性是一种变化的表现形式,可以在不改变程序的前提下,动态地改变对象的类型,实现灵活和高效的程序设计。
多态性需要满足三个条件:继承、重写和向上转型。
继承是面向对象编程语言所具备的一种特性,即子类可以继承父类的属性和方法。
重写是指在一个子类中重写父类的某个方法。
向上转型是指将一个子类对象作为父类对象进行处理,从而实现对多态性的应用。
这三个条件的结合,使得类的设计更加灵活,可以有效地实现代码重用。
二、多态性的实现方式在面向对象编程中,多态性可以通过以下几种方式来实现:1、方法重载方法重载是指在一个类中定义了多个同名的方法,但是它们有不同的参数列表。
在调用这些方法时,根据不同的参数列表来匹配具体的方法。
方法重载是一种静态的多态性,即在编译时就能确定具体的方法。
2、方法重写方法重写是指子类可以重新定义父类中的某个方法。
在调用这个方法时,会根据实际对象的类型来调用相应的方法。
方法重写是一种动态的多态性,即在运行时才能确定具体的方法。
3、抽象类与接口抽象类和接口都可以用来实现多态性。
抽象类是一种特殊的类,不能被实例化,只能被继承。
在抽象类中定义抽象方法,具体的实现交给子类去完成。
接口是一种纯抽象的类,其中只定义了方法的签名,而没有具体的实现。
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类型的对象的。
那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
JavaEEDay8_面向对象继承2多态

1:ASM项目改动View.java如果输入1 开信用账号如果输入2 开储蓄账号2.某公司的雇员分为以下若干类:Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。
方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。
SalariedEmployee:Employee的子类,拿固定工资的员工。
属性:月薪HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。
属性:每小时的工资、每月工作的小时数 200 SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。
属性:月销售额、提成率BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
属性:底薪。
写一个程序,把若干各种类型的员工放在一个Employee数组里,写一个函数,打印出某月每个员工的工资数额。
注意:要求把每个类都做成完全封装,不允许非私有化属性。
问题1:B extends A 创建B类对象的时候会先创建A类对象问题2:构造方法知道其编写格式,但就是不会应用构造方法是给对象赋初始值的,构造方法是可以重载(方法名相同,参数表不同)的public void add(int a,int b) //Apublic void add(int b,int a) //Bpublic void add(int a,int b,int c) //Cpublic void add(char c,char b);//DA和C构成重载A和D C和D也是重载举例:需求1:创建一个account对象,要求使用构造方法给该对象的id赋初始值需求2:创建一个account对象,要求使用构造方法给该对象完成全部初始值的赋值工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PrivateOverride.java StaticPolymorphism.java
Java编程基础
Downward Cast
向下转型Downward Cast
父类对象子类对象 必须明确地指明要转型的子类类型
子类 子类对象=(子类)父类实例
向下转型的前提条件
必须是曾经做过向上转型的对象,才能再向下转 型
Java编程基础
抽象类与接口
抽象类的实际应用——模板设计
Person Student Worker
19
package ch08.abstract2; abstract class Person{ private String name; private int age; public Person(String name,int age){ =name; this.age=age; } public String getName() { return name;} public int getAge() {return age;} public abstract String getContent(); public void say(){ System.out.println(this.getContent()); } }
package ch08.abstract2; class Worker extends Person{ private float salary; public Worker(String name,int age,float salary){ super(name,age); this. salary = salary; } public String getContent(){ return "工人信息:姓名"+super.getName()+ "年龄:"+super.getAge()+ "工资:"+this. salary; } }
子类对象父类对象 程序会自动完成 向上转型损失了子类新扩展的属性和方法, 仅剩下父类中声明过的属性和方法 如果对象发生了向上转型关系后,所调用的 方法一定是被子类覆盖过的方法
4
Java编程基础
Upcasting上溯造型
Upcastingtest.java
5
Java编程基础
“overriding” private methods
package ch08.abstract2; public class AbstractDemo3 { public static void main(String[] args){ Person per1=new Student("张三",20,98); Person per2=new Worker("李四",33,3000); per1.say(); per2.say(); } }
30
Java编程基础
接口
31
Java编程基础
接口
Fields in interfaces、
接口中所有变量默认为public static final Fields defined in interfaces cannot be "blank finals," but they can be initialized with non-constant expressions
PolDemo2.java
7
Java编程基础
instanceof操作符
instanceof操作符
判断一个对象到底是哪个类的实例 返回boolean类型
对象 instanceof 类
PolDemo3.java
8
Java编程基础
instanceof操作符
在进行对象的向下转型关系前,最好先 判断后再进行相应的转换操作
“overriding” private methods—— private 方法能否被重写
private method is hidden from the derived class only non-private methods may be overridden overriding private methods, which generates no compiler warnings
15
Java编程基础
package ch08.abstract1; public class AbstractDemo1 { public static void main(String[] args){ B b=new B(); b.print(); } }
16
Java编程基础
抽象类
思考
29
Java编程基础
接口
public interface Flyer { public void takeOff(); public void land(); public void fly(); } public class Airplane implements Flyer { public void takeOff() {……...} public void land() {……..} public void fly() {……..} }
public void doSomething(Employee e) { if (e instanceof Manager) { // Process a Manager } else if (e instanceof Engineer) { // Process an Engineer } else {// Process any other type of Employee} }
抽象类
包含抽象方法方法的类必须是抽象类 抽象类必须被继承,子类必须覆写override抽 象类中的全部抽象方法
14
package ch08.abstract1; Java编程基础 abstract class A{ public static final String FLAG="China"; private String name="yangwei"; public String getName() {return name;} public void setName(String name) { = name; } public abstract void print(); } package ch08.abstract1; public class B extends A { public void print() { System.out.println("FLAG="+FLAG); System.out.println("姓名="+super.getName()); } }
通过对象的多态为抽象类实例化
Java编程基础
Java编程基础
——接口
杨巍
yangwei@
Java编程基础
接口Interfaces
接口Interfaces
特殊的类 由全局常量和公共的抽象方法所组成
接口定义
interface 接口名称{ 全局常量; public abstract 返回值类型 方法名称(参数); }
9
Java编程基础
Covariant return types
Method Override
重写方法必须和被重写方法具有相同方法名 称、参数列表和返回类型 an overridden method in a derived class can return a type derived from the type returned by the base-class method
Java编程基础
Java编程基础
——对象的多态
杨巍
yangwei@
Java编程基础
多态性
多态性
方法的重载overload与覆写override 对象的多态性
具有继承关系的引用类型变量才能相互转换 子类对象父类对象 父类对象子类对象
2
向上转型Upcasting
package ch08.abstract2; class Student extends Person{ private float score; public Student(String name,int age,float score){ super(name,age); this.score=score; } public String getContent(){ return "学生信息:姓名"+super.getName()+ "年龄:"+super.getAge()+ "成绩:"+this.score; } }
25
Java编程基础
接口
接口
使用关键字interface定义 接口中定义的变量都是public static final 接口中定义的成员方法都是抽象方法 没有构造方法
26
package ch08.interfacetest; interface A { public static final String AUTHOR="yangwei"; public abstract void print(); public abstract String getInfo(); } package ch08.interfacetest; interface { String AUTHOR="yangwei"; public void print(); public String getInfo(); }