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 版权所有东软集团。