第七章 面向对象高级特性
面向对象高级特性

案例分析:泛型在集合类中的应用
Java集合框架中的许多类都使用了泛型,如`ArrayList<E>`、`HashSet<E>`等。这些 泛型类允许我们存储和操作各种数据类型的元素,同时保证了类型安全。
在使用这些集合类时,我们可以指定具体的元素类型,如`ArrayList<String>`表示存 储字符串的列表,`HashSet<Integer>`表示存储整数的集合。
异常处理流程
异常抛出
当程序中出现错误或异常情况时, Python解释器会自动抛出异常,同时 终止程序的执行。
异常处理
在`except`块中,可以编写处理异常 的代码逻辑,例如打印错误信息、回 滚事务、关闭资源等。
异常捕获
使用`try-except`语句块来捕获异常,避免 程序因异常而中断执行。在`try`块中编写可 能引发异常的代码,在`except`块中处理异 常。
1 2 3
常见异常类型
包括`Exception`、`Error`、`RuntimeError`、 `TypeError`等,每种异常类型对应特定的错误情 况。
捕获异常方式
使用`try-except`语句块来捕获异常,其中`try` 块包含可能引发异常的代码,`except`块用于处 理异常。
多重异常捕获
桥接模式(Bridge Pattern)
将抽象部分与实现部分分离,使它们都可以独立地变化。
组合模式(Composite Patte…
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式 使得用户对单个对象和复合对象的使用具有一致性。
装饰器模式(Decorator Patt…
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模 式相比生成子类更为灵活。
07_面向对象高级特性三

把上节作业中Shape类的三个方法都改成抽象方法,其它按原来要求。看看结果是否一样。
5
设计飞的接口IFly,接口包含fly()方法。让鸟类Bird和飞机类Airplane实现这个接口。
编写用户程序FlyDemo,在程序中分别把鸟和飞机的对象赋值给接口,并调用接口的方法。
要求:
封装一个空调类,包涵风力和风向。里面有两个属性。风力、风向。并生成Set和Get方法。
要求空调的属性有制冷参数、功率参数等。
要求使用继承结构。空调底下有格力空调、美的空调等。
要求空调的包括(打开)turnOn、(关闭)turnoff()、(调整风力和风向)turnWind()方法等。
要求有些方法使用抽象方法,有些方法使用接口实现。
面向对象特性面向对象三大特性面向对象的特性面向对象编程面向对象程序设计面向对象三个特性面向对象什么是面向对象php面向对象java面向对象
面向对象高级特性_3课后作业
一、简答题
1.接口跟抽象类的异同?
陈述:
2.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?
陈述:
:
二、上机題:对应编号详细要求 Nhomakorabea1
把上节作业的Animal类中的方法bark改成抽象,然后同样编写实现多态的实例。
2
将Animal这个类改为接口,让其Dog、Cat等原先的类由继承Animal类改类实现Animal这个接口。同样编写实现多态的实例。
3
利用教室中的空调,通过抽象类和接口的混合使用。完成对空调的操作。
javaSE--09_面向对象高级特性

何时选择继承
一个很好的经验: 是一个A吗 如果是则让 如果是则让B 一个很好的经验:“B是一个 吗?”如果是则让 是一个 的子类. 做A的子类 的子类
常犯的错误A有一个 吗 常犯的错误 有一个B吗? 例如让汽车 有一个 轮子成为汽车的子类是错误的
继承性
class Trash_Car extends Car { double amount; public void fill_trash() { … } public void push_break() { speed = speed – 10; }
}
super关建字作用 关建字作用
子类可继承父类方法和变量. 子类可继承父类方法和变量
同一个包中 private default protected public
不同包中的子类
★ ★ ★
★ ★
变量隐藏及方法重写原则
变量隐藏原则: 变量隐藏原则 子类中变量名与继承自父类的变量名相同时, 子类中变量名与继承自父类的变量名相同时, 则继承自父类的变量将被隐藏。 则继承自父类的变量将被隐藏。 方法重写原则: 方法重写原则 //重载 重载 子类有个方法与父类的方法完全一致叫做重写 子类有个方法与父类的方法完全一致叫做重写 重写后的方法不能比被重写的方法有更严格的 访问权限(可以相同)。 改写后的方法不能比重写的方法产生更多的例 外。
变量隐藏示例
变量隐藏即指在子类中重新定义父类中 已有的变量; 已有的变量;例:
class Car { int color_number; int door_number=2; int speed=100; public void push_break() { speed = 0; } } class Trash_Car extends Car { double amount; String color_number=“四个”; 四个” 四个 int speed=300; public void fill_trash() { … }
03_面向对象高级特性

面向对象高级特性python.Style讲师:郭帆西安西部开源教育科技有限公司类属性与实例属性类方法与静态方法property 类属性目录Contents 单例模式01类属性与实例属性类属性与实例属性类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。
在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数。
02类方法与静态方法类方法是类对象所拥有的方法,需要用修饰器一般以@classmethod来标识其为类方法, 1). 对于类方法,第一个参数必须是类对象,作为第一个参数(cls是形参,可以修改为其它变量名,但最好用'cls'了)2). 能够通过实例对象和类对象去访问。
静态方法需要用修饰器一般以@staticmethod来标识其为静态方法, 1). 静态方法不需要多定义参数2). 能够通过实例对象和类对象去访问。
04property类属性property类属性什么是property属性?一种用起来像是使用的实例属性一样的特殊属性,可以对应于类的某个方法。
property属性的定义和调用要注意一下几点:1.定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数2.调用时,无需括号property类属性类属性应用需求:对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据这个分页的功能包括:•根据用户请求的当前页和总数据条数计算出 m 和 n•根据m 和 n 去数据库中请求数据property类属性property属性的有两种方式:•装饰器即:在方法上应用装饰器•类属性即:在类中定义值为property对象的类属性注意:•经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法•新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法04单例模式对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
第七章面向对象高级特性

Java编程基础 编程基础 ——面向对象高级特性 面向对象高级特性1第七章 面向对象高级特性目标: 目标 Java中的静态,类的继承,封 中的静态, 中的静态 类的继承, 装,多态,方法的重载与覆盖。
多态,方法的重载与覆盖。
抽象类及接口的概念与使用。
抽象类及接口的概念与使用。
Java中的包及类路径。
引用数据 中的包及类路径。
中的包及类路径 类型的转换。
包装类及内部类。
类型的转换。
包装类及内部类。
访问权限修饰符的使用。
访问权限修饰符的使用。
final关 关 键字。
键字。
时间: 时间:学时 教学方法: 教学方法:2本章要点• • • • • • • • • •static的含义 继承的规则 子类实例化的过程 方法的覆盖 final关键字 抽象类的特性 接口的规范 数据类型的转换 包和访问权限修饰符 包装类和内部类3静态修饰符static 静态修饰符•static可以修饰的元素 – 属性 – 共享 – 方法 – 访问的方式 – 块 – 执行的时机 – 只能修饰类成员,不能修饰局部变量4静态属性NonstaticDemo.java、StaticDemo.java 、 静态存储区 3.14 pi所有对象共享 – 也称为类变量 • 两种方式访问: – 类名.属性 – 对象名.属性•0x3000 200 radius…… 0x8000 100 Circle q Circle p 0x3000 0x8000 radius5静态属性•静态属性描述了类的所有对象的共同特征; 静态属性描述了类的所有对象的共同特征; 非静态属性描述的是每个对象独有的特征; 非静态属性描述的是每个对象独有的特征;静态属性与非静态属性的对比: 序号 1 2 3 4 静态属性 多个对象共享同一个属性 该属性隶属于类 类变量 对象.属性 / 类.属性 非静态属性 每个对象独享一个属性 该属性隶属于每个实例 实例变量 对象.属性•静态属性在该类第一次被加载到虚拟机时,分配静态存储区,以后 每次运行不再分配空间。
面向对象程序设计 类的高级特性

内部类
• 内部类为非静态的嵌套类。 • 在类中定义的类称为内部类。 • 内部类之外的类称为外部类。
• 内部类可以访问其外部类的所有变量和方 法,并能够以和外部类的其他非静态成员 相同的方式直接引用它们。 • 内部类完全在其包围类的范围之内。
25
总结
• 类中的静态变量、方法或代码块并不具体 到实例,它们可以与类的名称一起使用, 而无需创建类的对象来访问类的静态特性。 • final 修饰符可应用于类、方法和变量。 • 定义抽象类的目的是提供可由其子类共享 的一般形式。 • 接口就是需要由其他类实现的行为模板。
2
目标
• 掌握类的静态成员 • 掌握final关键字用法 • 掌握抽象类的定义和用法 • 掌握接口的定义和用法 • 掌握高级访问控制 • 了解内部类的概念
3
类的静态成员
用static修饰符修饰, 可以是变量、方法或代 码块
• 类中的静态变量、方法或代码块属于类, 而不属于某个特定的对象。 • 类的静态成员可以与类的名称一起使用, 而无需创建类的对象。
class TestFinal { final void f() {} } class Further extends TestFinal { final void f(){} final方法不能 } 被覆盖
9
final 变量
• 一个变量可以声明为final,这样做的目的 是阻止它的内容被修改。 • 声明final变量后,只能被初始化一次,然 后就不能对其值进行修改。 • 一个final变量实质上是一个常量。
7
final 关键字/final类
• final 修饰符可应用于类、方法和变量。 • final在应用于类、方法和变量时意义是不 同的,但本质是一样的:final表示不可改 变。 • 声明为final的类不能被继承。 final class TestFinal { int i = 7; • final 类示例:
第7章面向对象高级特性上

重写父类中的方法
方法的重载是在同一个类中实现两个或两个以上的方法名相同而参数列 表不同的方法。在使用继承过程中,不但可以使用方法重载,还可以实现方 法的重写。
在继承中,子类不但可以继承自父类中的属性和方法,还可以增加子类 自身的属性和方法。子类可以通过成员变量的隐藏和成员方法的重写,把父 类的属性和方法改变为子类自身的属性和方法。如果子类中定义的方法使用 的方法名、返回类型和参数列表与父类中的方法一样,则称为子类的方法重 写了父类方法。
1-2
访问权限控制(访问权限控制修饰符)(二)
类内 包内 子类 任意public可以 可以 可以 可以
protected 可以 可以 可以 不
默认
可以 可以 不
不
private 可以 不
不不
1-3
javaBean(POJO)
不是语法,是企业开发为了开发方便,习惯性的编码规范 特点:
1) 类必须要放到一个包下面
本章重点
掌握封装的概念 掌握继承的基本概念。 掌握子类对象的实例化过程。 掌握super关键字的各种用法及其作用,比较this和super
异同。 掌握重写的概念和实现方式,比较重载和重写的异同。 掌握向上转型和向下转型的概念及其实现方式。 理解instanceof关键字的作用。
1-1
访问权限控制(一)
明确的调用父类中的有参数的构造方法 4)super:曾经的,过去的,可以在子类的构造方法中使用
super来调用父类中的构造方法 5)一般企业开发中,都会在父类中写一个空参的构造方法,避免子类继承父类的 出现问题
1-6
this和super
1) this :当前的,现在的 super:曾经的,过去的
part07 面向对象高级特性

7.2.1 重载 一组具有相似功能的方法可以共享相同的方法 名。我们把一个类中存在名字相同的多个方法 的现象称为重载。重载的方法要求方法名相同, 但是各个方法所带参数的个数不同或者当个数 相同时参数的类型{ System.out.println("eat at :"+h.place); } void eat(Restaurant r){ System.out.println("eat at :"+r.place); }
在构造方法中默认的存在着第一条语句: super(); 在这里,super代表了父类的构造方法名,所 在这里,super代表了父类的构造方法名,所 以调用的是父类中无参的那个构造方法。
下面的代码在编译时出错,原因是父类没有提 供一个无参的构造方法。 class SubClass extends SuperClass{//编译出错 SuperClass{//编译出错 } class SuperClass{ SuperClass(int i){} }
第7章 面向对象高级特性
福建农林大学 计算机与信息学院
7.1 继承
继承(extends)是指从已有的类中吸收某些特性 继承(extends)是指从已有的类中吸收某些特性 或全部特性而产生出一个新的类。原有的类称 为父类(或称超类),新的类称为子类( 为父类(或称超类),新的类称为子类(或派生 类)。子类可以直接继承父类的特性,又允许 子类发展自己的个性。 如果以原有类为基础产生出新的类,我们可以 说子类继承了父类,也可以说父类派生出子类。 派生新类(继承)的过程一般包括子类吸收父 类已有成员、修改父类成员和添加新成员三个 步骤。
Overload(int x){ i=x; } Overload(int x,int y){ //在这之前不能有任何的语句 //在这之前不能有任何的语句 this(x+y);//正确的形式 this(x+y);//正确的形式 //Overload(1); 错误的形式 }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA编程基础——面向对象高级特性东软人才实训中心3 Sept. 2008©Neusoft Confidential第七章:面向对象高级特性目标:介绍Java中类的继承,封装,多态,方法的重载与覆盖。
抽象类及接口的概念与使用。
Java中的包及类路径。
引用数据类型的转换。
包装类。
访问权限修饰符的使用。
final关键字。
教学方法:讲授ppt+上机练习本章要点•类的继承9继承的规则9子类的构造方法9方法的覆盖9final关键字•接口9接口的规范9引用数据类型的转换9多态•Java中的包9包和访问权限修饰符•类的封装Contents1类的继承2接口3Java中的包4类的封装类的继承•类的继承9在Java 中定义一个类时,让该类通过关键字extends 继承一个已有的类,这就是类的继承(扩展)。
9被继承的类称为父类(超类,基类),新的类称为子类(派生类)。
9子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法。
使用继承+getDetail()+getSalary()+vehicleAllowance()-name -birth-salary-departmentOfficer类的继承•继承的语法示例Employee.java Worker.java[修饰符] class 子类名extends父类名类的继承•继承的好处¾使编码更高效¾易维护类的继承•继承的规则9Java中只支持单继承,也就是说每个类只能有一个父类,不允许有多重继承9一个父类可以有多个子类9子类继承父类所有的属性和方法,但不继承父类的构造方法示例TestWorker.java类的继承•子类的构造方法—子类不能继承父类的构造方法9使用默认的构造方法9在子类中的创建构造方法示例Worker.java¾在子类中创建构造方法时,必须调用父类的构造方法¾子类可以在自己的构造方法中使用super关键字来调用父类的构造方法super (参数1,参数2,…);¾如果使用super关键字调用父类构造方法,必须写在该子类构造方法的第一行¾如调用的是父类中无参的构造方法,则可以不写super( )¾如果子类中调用了父类无参的构造方法,而父类中没有无参构造方法则系统编译出错类的继承•方法的覆盖(override)9重写(rewrite)9对从父类中继承来的方法进行改造9在子类继承父类时发生•方法覆盖的规则9在子类中的覆盖方法与父类中被覆盖的方法应具有¾相同的方法名¾相同的参数列表(参数数量、参数类型、参数顺序都要相同)¾相同的返回值类型¾子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限示例Worker.java类的继承•final关键字9final可以修饰的元素:¾类:不能被继承¾变量(属性和局部变量):不能被重新赋值–在声明时赋值,或在构造方法中赋值–系统不会对final属性默认的赋初始值¾方法:不能在子类中被覆盖,即不能修改。
示例Final.java TestFinal.javaContents1类的继承2接口3Java中的包4类的封装•抽象方法9只有方法声明,没有方法实现的方法[访问权限修饰符]abstract 返回值类型抽象方法名(参数列表);class A {abstract int method1(int a, int b);}•抽象类9抽象类是抽象方法和非抽象方法的集合[访问权限修饰符]abstract class 类名{……}9特殊情况¾全部是抽象方法¾全部为非抽象方法abtract class A {String name;abstract int method1(int a, int b);void sayHi( ){System.out.println(“Hello!”);}•抽象类9注意:¾抽象类不能被实例化;¾其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;¾抽象方法不能为static;9在下列情况下,一个类必须声明为抽象类:¾当一个类的一个或多个方法是抽象方法时;¾当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;¾当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;•接口的声明示例AudioDevice.java VideoDevice.java 9接口是常量和抽象方法的集合,而没有变量和方法的实现[访问权限修饰符]interface 接口名{接口的成员}9接口的成员:¾常量(字段)¾抽象方法•接口的声明interface Runnable{public abstract void run();}•注意:9接口不是一个类,没有构造方法,不能被实例化9接口使用interface关键字来定义,而不是class9接口默认:¾常量:public static final¾抽象方法:public abstractextends interface A extends B { }interfaceinterfaceinterface extends interface A extends B, C, D { }interface extends •扩展接口(接口的继承)示例VADevice.java•类实现接口—implements9为了使用一个接口,你要编写实现接口的类9如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。
否则这个类只能声明为抽象类9多个无关的类可以实现一个接口,一个类可以实现多个无关的接口9一个类可以在继承一个父类的同时,实现一个或多个接口示例Television.java•类的单继承与多实现•类实现接口☻示例Student.java Consumer.java Person.java9有一个Student类9该类继承了Person类,并实现了Consumer接口9该类具有String类型的属性school9并有一个study方法,在该方法中,系统可打印出学生在那所学校学习9并创建一个测试方法,测试Student类•接口的意义:9接口可以实现多继承:¾用接口可以实现混合类型(主类型,副类型),java 中可以通过接口分出主次类型¾主类型使用继承,副类型,使用接口实现9接口可以使方法的定义和实现相分离,降低模块间或系统间的耦合性¾针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。
•引用数据类型的转换(对象造型) 示例:TestStudent.java9向上转型(Upcasting)—子类转换为父类,自动转换;¾前提—具有继承或实现关系¾向上转换损失了子类新扩展的属性和方法仅可以使用从父类中继承的属性和方法•引用数据类型的转换示例:TestStudent.java9向下转型(Downcasting):强制转换¾将父类对象显示的转换成子类类型。
Animal a = new Cat( );Cat c = (Cat)a;•instanceof运算符9判断一个类是否实现了某个接口对象instanceof接口9判断一个实例对象是否属于一个类对象instanceof类9它的返回值是boolean型的示例TestStudent.java•多态(动态绑定、晚绑定Polymorphism)9在Java中,相同类型的变量,调用相同的方法,执行的具体代码却不同的现象,称之为多态。
¾多种表现形态9多态存在的三个必要条件¾要有继承,或实现¾要有重写¾父类引用指向子类对象一旦满足以上3个条件,当调用父类中被重写的方法后,运行时创建的是哪个子类的对象,就调用该子类中重写的那个方法9在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用相应的方法•多态的优点9简化代码9改善代码的组织性和可读性9易于扩展☻示例Parker.java Vehicle.java Bus.java Truck.java Car.java 9在停车场收费系统中,收费者会根据车型的不同收取不同的停车费,其中,¾客车:15元/小时¾货车:12元/小时¾轿车:8元/小时编写java程序完成此功能Contents1类的继承2接口3Java中的包4类的封装•包的概念及应用9在Java中,包主要有以下用途:¾包允许将类组合成较小的单元¾有助于避免命名冲突¾包允许在更广的范围内保护类、数据和方法9包可以是类、接口和子包的集合•包的概念及应用9将类放入包中package包名;9注意:¾在java中位于包中的类,在文件系统中的存放位置,必须有与包名层次相对应的目录结构¾package语句作为java源文件的第一条语句¾每个源文件只能声明一个包¾如果没有package语句,则默认为无名包•访问其它包中的类9包名.路径名package test;class Cat extends p08.Animal{…} 9使用import关键字引入其它包中的类package test;import p08.Animal;class Cat extends Animal{…} 9位于同一包中的类可以直接访问•访问其他包中的类9导入包中所有的类import包名.*;9导入子包中所有的类import包名.子包名.*;9导入包中的某个类import包名.子包名.类名;•JDK中常用的包ng¾Java语言包(包含String、Math、System等类),任何类中,该包中的类都会被自动导入。
9java.util¾包含一些实用的工具类(包含list, calendar, date等类)9java.awt¾图形用户界面包。
9java.io¾提供多种输入/输出功能的类。
•访问权限修饰符9用来控制类的成员和类的使用范围¾类成员的访问权限修饰符:private 、default(friendly)、protected 、public¾类的访问权限修饰符:public 、default(friendly)示例:Access.java TestAccess.java√√√同包子类√不同包无继承关系类√√不同包子类√√√同包无继承的关系类√√√√类内部publicprotecteddefaultprivate•访问权限修饰符Contents1类的继承2接口3Java中的包4类的封装类的封装•类的封装9将类的成员变量声明为私有的(private),再提供一个或多个共有(public)方法实现对该成员变量的访问或修改,这种方式就被称为封装•封装的目的9隐藏类的实现细节9让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作9便于修改,增强代码的可维护性9可进行数据检查示例Employor.java TestEmployer.javaCopyright ©2008 版权所有东软集团。