《JAVA编程基础-06面向对象高级特性.doc》由会员分享,可在线阅读,更多相关《JAVA编程基础-06面向对象高级特性.doc(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JAVA编程基础 面向对象高级特性3 Sept. 2008 Neusoft Confidential第六章 面向对象高级特性目标:介绍Java中类的继承,封装,多态,方法的覆盖,抽象类、接口及内部类等面向对象的高级特性。通过本课的学习,学员应该掌握如下知识:1)类的继承、封装、多态2)抽象类及接口3)引用数据类型的转换4)访问权限修饰符的使用5)final关键字教学方法:讲授ppt上机练习本章要点类的继承继承的规则子类的构造器Java中的包和访问修饰符方法的覆盖引用数据类型的转换向下转型向上转型多态特征动态绑定抽象类和接口定义抽象方法区别Final关键字内部类Contents12345类的继承
2、Java包的概念访问权限修饰符方法的覆盖引用类型的转换类的继承类的继承在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化)。被继承的类称为父类(超类,基类),新的类称为子类(派生类)。子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法。使用继承继承的语法和规则继承的语法示例Employee.javaWorker.java修饰符 class 子类名 extends 父类名继承的语法和规则继承的语法 练习 Officer.javaTestOfficer.java用 java中类的继承机制,实现 Officer类,并设计一个测试程序TestOff
3、icer类,来访问Officer类继承的好处使编码更高效易维护代码的重用继承的语法和规则继承的规则Java中只支持单继承,也就是说每个类只能有一个父类,不允许有多重继承一个父类可以有多个子类子类继承父类所有的属性和方法子类实例化的过程子类实例化时先实例化其父类,然后实例化子类。要先调用父类的构造器,父类构造器运行完毕,才调用子类的构造器。如果实例化类D,说出构造器执行的顺序。ABD示例 SubClassConstruct.javaCEsuper和this关键字super() 作用:调用父类的构造器 只能出现在子类的构造器中,且必须是第一行 super()中的参数,决定了调用父类哪个构造器 如果
4、子类构造器中没有出现super,那么编译器会默认加上super(),即调用父类的空构造器,如果父类没有空构造器,编译器提示错误。super和this关键字this() 作用:调用本类的构造器 只能写在构造器的第一行在同一个构造器中super()和this()不能同时出现示例 Person.java、Student3.java、Student4.java子类的构造器子类的构造器 子类不能继承父类的构造器在子类中创建构造器时,必须调用父类的构造器子类可以在自己的构造器中使用super关键字来调用父类的构造器super (参数1,参数2,);如果使用super关键字调用父类构造器,必须写在该子类构造
5、器的第一行如调用的是父类中无参的构造器,则可以不写super( )如果子类中调用了父类无参的构造器,而父类中没有无参构造器则系统编译出错super和this关键字super. 指向父类的引用。this. 指向本类的引用。类的继承给定以下代码:下列描述哪些是正确的_?A. 编译失败C. 在第7行抛出异常B. 代码正常运行D. 在第2行抛出异常答案:AContents12345类的继承Java包的概念访问权限修饰符方法的覆盖引用类型的转换Java中的包包的概念及应用在Java中,包主要有以下用途 :有助于避免命名冲突包允许在更广的范围内保护类、数据和方法包可以是类、接口和子包的集合Java中的包包
6、的概念及应用将类放入包中package 包名 ;注意:package语句作为java源文件的第一条语句每个源文件只能声明一个包如果没有package语句,则默认为无名包Java中常用的包java.lang Java语言包,任何程序中,该包都被自动导入。java.awt 图形用户界面包。java.awt.event 图形用户界面事件处理包。java.swing 跨平台轻量级组件包。Java中常用的包java.sql 数据库访问包。java.io 这个包由对您的输入/输出操作有用的类组成。java.util 该包提供了许多创建如:lists, calendar, date等所需要的类和接口。 该包
7、提供了许多进行TCP/IP网络编程的类和接口。import导入包中的类访问其它包中的类包名.类名package test;class Cat extends p08.Animal使用import关键字引入其它包中的类package test;import p08.Animal;class Cat extends Animal位于同一包中的类可以直接访问import导入包中的类访问其他包中的类导入包中所有的类import 包名.*;导入子包中所有的类import 包名.子包名.*;导入包中的某个类import 包名.子包名.类名;Contents12345类的继承Java包的概念访问权限修饰符方
8、法的覆盖引用类型的转换封装信息隐藏,隐藏对象的实现细节,不让用户看到将东西包装在一起,然后以新的完整形式呈现出来 将方法和属性一起包装到一个单元中,单元以类的形式实现“隐藏属性、方法或实现细节的过程称为封装。”封装封装的目的隐藏类的实现细节让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作便于修改,增强代码的可维护性可进行数据检查示例Employor.javaTestEmployer.java访问权限修饰符访问权限修饰符访问权限修饰符访问权限修饰符用来控制类的成员和类的使用范围类成员的访问权限修饰符:private、default、protected、p
9、ublic类的访问权限修饰符:public、defaultprivatedefaultprotectedpublic同一类同一包中的类不同包中的子类其他包中的类示例:Access.java TestAccess.java访问权限修饰符 练习给定以下代码:下列选项正确的是?A. 编译失败B. 成功编译并执行C. 编译成功,但运行时在ClassTest.java的第5行抛出异常D.编译成功,但运行时在ClassTest.java的第6行抛出异常答案:AContents12345类的继承Java包的概念访问权限修饰符方法的覆盖引用类型的转换方法的覆盖方法的覆盖(override)重写(rewrite
10、)对从父类中继承来的方法进行改造在子类继承父类时发生方法覆盖的规则在子类中的覆盖方法与父类中被覆盖的方法应具有相同的方法名相同的参数列表(参数数量、参数类型、参数顺序都要相同)相同的返回值类型子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限示例Worker.java方法的覆盖 练习给定下列代码:当在第6行加入什么方法时会引起编译错误?答案:B方法的覆盖 练习给定类class A int method1(int a, double b) return 0; ,在其子类中下列哪些覆盖方法可以正确的声明_A. int method1(int a, double b) return 1; B.
11、 int method1(int a, long b) return 1; C. int method1(int b,double a)return 1;D. short method1(int a, double b) return 1: E. int method1(double b, int a) return 1; 答案:A CContents12345类的继承Java包的概念访问权限修饰符方法的覆盖引用类型的转换上溯造型引用数据类型的转换(对象造型)示例: Upcasting.java向上转型(Upcasting) 子类转换为父类,自动转换;前提 具有继承或实现关系向上转换损失了子类
12、新扩展的属性和方法仅可以使用从父类中继承的属性和方法下溯造型从父类引用转换为子类引用向下转型的原则:强制转换只有曾经做过向上转型的对象,才能再向下转型,否则会发生运行期异常。示例: DownCasting植物生物动物Animal a = new Cat( );Cat c = (Cat)a;人类猫类向下转型instanceof 运算符instanceof 运算符判断一个类是否实现了某个接口对象 instanceof 接口判断一个实例对象是否属于一个类对象 instanceof 类它的返回值是boolean型的示例InstanceofDemo.javaContents678910多态抽象类接口fi
13、nal关键字内部类多态多态(polymorphism)也叫动态绑定、池绑定,指多种表现形态.动态绑定:指在运行的时候,根据句柄实际指向的类型来决定调用哪一个,相同类型的变量调用相同的方法,执行的具体代码却不同。在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。多态最大限度的增加了程序的可扩展性。分为两种表现形式 赋值多态 传参多态(隐式的赋值多态)示例fuzhi.java、chuancan.java37多态多态的存在有三个必要条件: 要有继承 要有重写 父类引用指向子类对象38多态练习在停车场收费系统中,收费者会根据车型的不同收取不同的停车费。客车:15元/
14、小时;卡车:12元/小时;轿车:8元/小时;摩托车:3元/小时。编写程序完成此功能39Contents678910多态抽象类接口final关键字内部类抽象类抽象类抽象类是抽象方法和非抽象方法的集合访问权限修饰符 abstract class 类名 特殊情况全部是抽象方法全部为非抽象方法abtract class A String name;abstract int method1(int a, int b);void sayHi( )System.out.println(“Hello!”);抽象方法抽象方法只有方法声明,没有方法实现的方法访问权限修饰符 abstract 返回值类型abstra
15、ct class A abstract int method1(int a, int b);抽象方法名 (参数列表) ;抽象类的规则抽象类注意:抽象类不能被实例化;其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;抽象方法不能为static;在下列情况下,一个类必须声明为抽象类:当一个类的一个或多个方法是抽象方法时;当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;抽象类 练习给定以下代码:执行下列哪些操作后,可以让代码通过编译?A.B.C.D.对methodA方法添加方法体将57行,用“;
16、”代替删除class前的abstract关键字删除methodA方法前的abstract关键字E.删除methodB方法前的abstract关键字答案:BEContents678910多态抽象类接口final关键字内部类接口interface接口是常量和抽象方法的集合,包含常量和方法的定义,而没有方法的实现,也没有构造函数。接口不是一个类,不能实例化;JJava只支持单继承,但可以用接口来实现现实中多继承的现象。接口可以使方法的定义和实现相分离,降低模块之间或系统间的耦合性。定义格式如下:public interface Student int age = 16;void study();46
17、类实现接口接口必须通过类来实现它的抽象方法,类实现接口的关键字为implements。如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法,否则这个类只能声明为抽象类。格式如下:public class MyClass implements Student/实现接口中所有抽象方法47接口的特点接口使用interface关键字来定义,而不是class。接口中没有自己的构造函数,接口中定义的方法全部都是抽象方法,即只提供方法的定义,而没有提供方法的具体实现的语句,并且是public的。接口中定义的变量都是公共静态最终变量(public static final)。接口采用多继承机制(也
18、就是一个类可以实现多个接口,一个类可以实现多继承了) ,而不像类一样采用单继承机制。多个无关的类可以实现同一个接口接口可以继承其它的接口,并添加新的属性和抽象方法。接口默认: 常量:public static final 抽象方法: public abstract48接 口(interface) 练习给定以下代码:下列选项中,哪些选项可以用来替代第2行代码?A. final int k = 4;B.C.public int k =4;static int k = 4;D. private int k = 4;E.abstract int k = 4;答案:ABC接 口(interface) 练
19、习下列选项中,哪些可以定义在一个接口中?答案:AB接口与抽象类的区别接口不能含有任何非抽象方法,而抽象类可以。类可以实现许多接口,但只能有一个父类。接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。51类的继承class A extends B class A implements C, D class Bextendsclass Ainterface Cimplementsclass Aclass A extends B implements C, D interface Dimplementsclass Bextendsinterface Cimplementsinterface
20、 Dimplementsclass A52抽象类的继承class A extends B abstract class A implements C, D abstract class Bextendsclass Ainterface Cimplementsabstract class ainterface Dimplementsabstract class A extends B implements C, D abstract class Bextendsinterface Cimplementsinterface Dimplementsabstract class A53接口的继承int
21、erface A extends B, C, D interface Bextendsinterface Cextendsinterface Dextendsinterface A54访问接口中常量public static final int MAX_SPEED=100;有三种方式: 对象名.MAX_SPEED 类名. MAX_SPEED 接口名. MAX_SPEED55接口练习编写代码,实现下面的结构,在主函数中调用Person对象的think方法,调用Dog对象的call方法,调用Animal接口的run方法。Animalrun()eat()Persont hink()Dogcall()
22、56Contents678910多态抽象类接口final关键字内部类final关键字final关键字final可以修饰的元素:类:不能被继承变量(属性和局部变量):不能被重新赋值 在声明时赋值,或在构造器中赋值 系统不会对final属性默认的赋初始值方法:不能在子类中被覆盖,即不能修改。示例 FinalTest.javaContents678910多态抽象类接口final关键字内部类内部类内部类(嵌套类)内部类就是定义在另一个类内部的类。内部类对于同一包中的其它类来说,内部类能够隐藏起来。注意内部类可以访问其外部类中所有的属性和方法无需创建外部类的对象,即可从内部类访问外部类的变量和方法。必须
23、创建内部类的对象,否则无法从外部类访问内部类的变量和方法。如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获得比外部类的变量和方法更高的优先级。不能定义static变量内部类类中定义的内部类public class Outerprivate int varOuter=100;class Innerint varInner=200;public void showOuter()System.out.println(varOuter); /是否能够输出?public void showInner()Inner i=new Inner();System.out.println(i.va
24、rInner);内部类类中定义的内部类普通类的访问权限修饰符defaultpublic内部类的访问权限修饰符defaultpublicprotectedprivate内部类内部类的访问在Outer内访问Inner,只需如下:Inner in = new Inner() ;在Outer外访问Inner,必须如下:Outer o = new Outer(); /实例化外部类Outer.Inner oi = o.new Inner(); /实例化内部类静态内部类用static标识的内部类为静态内部类。静态内部类作为外部类的静态成员,不能访问外部类非静态成员。非静态内部类只能定义非静态成员,而静态内部
25、类可以定义静态成员和非静态成员。使用Outer.Inner inn=new Outer.Inner()方式实例化静态内部类。非静态内部类不可以使用上面的方式实例化。示例:OuterStatic.java局部内部类局部内部类在一个类的方法体中或程序块内定义的内部类class Aint a;局部内部类public void method()class B class Aint a;public void method( int c )int b=0;class B 类中定义的内部类小结类的继承子类的构造器Java中的包和访问修饰符方法的覆盖引用数据类型的转换向下转型向上转型多态特征动态绑定抽象类和接口定义抽象方法区别Final关键字内部类