第七章 面向对象高级特性
- 格式:pdf
- 大小:463.74 KB
- 文档页数:38
面向对象高级特性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 静态属性 多个对象共享同一个属性 该属性隶属于类 类变量 对象.属性 / 类.属性 非静态属性 每个对象独享一个属性 该属性隶属于每个实例 实例变量 对象.属性•静态属性在该类第一次被加载到虚拟机时,分配静态存储区,以后 每次运行不再分配空间。
Ⅰ.选择题1、给定下列代码:B当在第6行加入什么方法时会引起编译错误?2、给定以下代码:B执行后的结果是?A. 打印字符串“T ested”B. 编译失败C. 代码运行成功但无输出D. 运行时抛出异常3、MAX_LENGTH是int型public成员变量, 变量值保持为常量100,用简短语句定义这个变量?( CD )A. public int MAX_LENGTH=100;B. final int MAX_LENGTH=100;C. final public int MAX_LENGTH=100;D. public final int MAX_LENGTH=100.4、给出以下代码,请问该程序的运行结果是什么?(B)1.class A { static void foo(int i ) {};}2. class B extends A{ void foo( int i ){};}A 第1行编译错误。
B 第2行编译错误。
C 代码编译成功。
//静态方法不能被重写4、有关类的说法正确的是(B)A.类具有封装性,所以类的数据是不能被访问的B.类具有封装性,但可以通过类的公共接口访问类中的数据C.声明一个类时,必须使用public修饰符D.每个类中必须有main方法,否则程序无法运行5、将类的访问权限设置为默认的,则该成员能被(A)A. 同一包中的类访问B.其他包中的类访问C.所有的类访问 D.所有的类的子类访问6、假设下面的程序代码都放在MyClass.java文件中,(D)程序代码能够编译通过。
A.import java.awt.*;package mypackage;calss MyClass{ }B.package mypackage;import java.awt.*;public class myClass{ }C.int m;package mypackage;import java.awt.*;class MyClass{ }D./*This is a comment*/package mypackage;import java.awt.*;public class MyClass{ }7、假设在java源程序文件“MyClass.java”中只含有一个类,而且这个类必须能够被位于一个庞大的软件系统中的所有java类访问到,那么下面(C )声明有可能是符合要求的类声明。
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 版权所有东软集团。