Java面向对象.ppt
932方法 v方法是一个功能模块 v方法和实例变量都必须定义在类内,方法是类的功能接口 ;v定义方法的原则:方法应当只执行单一的任务,并且方法名能有效地表达该任务;v方法的返回值类型、方法名和参数表共同称之为方法的特征。形参与实参第4章 Java的类 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计本章主要讲述的内容 类的定义和使用;类的定义和使用; 方法的定义和使用;方法的定义和使用; 实例变量和局部变量;实例变量和局部变量; 构造方法;构造方法; 方法的覆盖和重载;方法的覆盖和重载; 关键字关键字this的用法;的用法; 继承的概念和应用;继承的概念和应用; 组合与继承;组合与继承; 抽象方法和抽象类;抽象方法和抽象类; 对象类型转换;对象类型转换; 访问权限限制符:访问权限限制符:public、private、protected。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计对象的引用 程序中的思想来源于生活程序中的思想来源于生活 人类社会的发展就是从面向过程到面向对人类社会的发展就是从面向过程到面向对象的过程象的过程 人民公社人民公社 承包制承包制(责任清楚)责任清楚)面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计编程 个人编程与小组编程个人编程与小组编程 Windows 上千行代码上千行代码 耦合度耦合度 责任责任面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计员员对象的思想保管员保管员对象就是被承包的数据对象就是被承包的数据对外提供服务对外提供服务内部自己管理内部自己管理面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计具有确定边界的就是对象 一台电视机是对象一台电视机是对象 命名为命名为x 19 x.尺寸尺寸 x.颜色红色颜色红色 x.开机()开机() x.换频道(换频道(5) 属性、方法、属性、方法、 参数:执行服务的额外信息参数:执行服务的额外信息面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.1类与对象 类好比是图纸类好比是图纸 对象好比是房子对象好比是房子 类存在的理由:可能会创建多个房子类存在的理由:可能会创建多个房子 类并不真正存在类并不真正存在 类创建对象的过程是类创建对象的过程是实例化实例化面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.1 类与对象 在在Java程序中,除原子类型的变量以外都程序中,除原子类型的变量以外都是对象,连是对象,连Java程序本身也不例外。程序本身也不例外。 类是面向对象程序设计的基础,类是面向对象程序设计的基础,OO始终是始终是围绕着对象的封装性、继承性和多态性展围绕着对象的封装性、继承性和多态性展开讨论的。开讨论的。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 类是对象所应当具有的特征的描述类是对象所应当具有的特征的描述 类是抽象的存在类是抽象的存在 对象是具体的存在对象是具体的存在 对象对应着内存中的一片数据对象对应着内存中的一片数据面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.1.1 类与对象的区别 类是一个抽象的概念,对象是一个具体的类是一个抽象的概念,对象是一个具体的概念。概念。 类是在一组对象的基础上,通过抽象和概类是在一组对象的基础上,通过抽象和概括获得的一个概念。括获得的一个概念。 对象是由数据和方法紧密结合的一个封装对象是由数据和方法紧密结合的一个封装体,具有信息隐藏的能力。体,具有信息隐藏的能力。 对象可以通过方法(方法)与其它对象进对象可以通过方法(方法)与其它对象进行通信,但并不知道这些方法的实现细节行通信,但并不知道这些方法的实现细节 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计开发java的任务 使用已有的类使用已有的类 编写自己的类编写自己的类 使用自己的类创建对象使用自己的类创建对象 调用对象的方法、属性去解决问题调用对象的方法、属性去解决问题面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 隐藏内部的结构隐藏内部的结构好比手表内部的齿轮、发条好比手表内部的齿轮、发条 显露其提供的功能显露其提供的功能 功能是使用者关心的功能是使用者关心的 使用者不关心实现的细节使用者不关心实现的细节4.1.3 如何定义类 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.1.3 如何定义类 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.1.3 如何定义类(续) 系统类系统类Object是整个类层次结构中的根。是整个类层次结构中的根。 类内定义的变量称为实例变量,方法称为类内定义的变量称为实例变量,方法称为方法;方法; Java将类的定义和类的实现放在一起,便将类的定义和类的实现放在一起,便于系统维护。于系统维护。例如:例如:类与对象 图纸图纸class制造制造new面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.1.4 对象和引用 对象是客观存在的变量,对象的引用就是对对象是客观存在的变量,对象的引用就是对象的名字,例如:象的名字,例如:point p1; 创建对象:创建对象:p1=new point( ); 一个对象可以有多个别名一个对象可以有多个别名 ; 将一个变量设置为将一个变量设置为null,表明该变量不代表表明该变量不代表任何对象任何对象 : p1 = null ; 每个对象都有自己的变量,改变一个对象的每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。实例变量并不影响到另外一个对象。例如:例如:面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计93224.2 方法(续) 调用方法的格式:调用方法的格式:引用引用. 方法名方法名(参数表参数表); 例如:例如:point p1=new point( ),p2=new point( );p1.init(10,20); /仅对仅对p1对象的对象的x和和y进行赋值进行赋值面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计93234.3 实例变量和局部变量 Java中的变量分为两种:类内定义的实例中的变量分为两种:类内定义的实例变量,方法中定义的局部变量。变量,方法中定义的局部变量。 在同一个作用域内,不允许定义两个同名在同一个作用域内,不允许定义两个同名的局部变量。的局部变量。 局部变量可以掩盖实例变量。局部变量可以掩盖实例变量。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计class loc / 程序程序4-2 int x=1;/ 实例变量实例变量 void printLocVar( ) int x=25;/ 局部变量局部变量 System.out.println(n x is :+x); +x; System.out.println( x is :+x); void printInstanceVar( ) System.out.println(n x is :+x); x*=10; System.out.println(x is :+x); 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计public class testInstanceVar / 程序的主类程序的主类public static void main(String args ) loc obj=new loc( ); int x=5;/ 局部变量局部变量 x System.out.println( x is :+x); obj.printLocVar( ); obj.printInstanceVar( ); System.out.println( x is :+x); 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计93264.3 实例变量和局部变量(续) 实例变量属于对象,它描述了对象的属性,实例变量属于对象,它描述了对象的属性,随着对象的存在而存在;随着对象的存在而存在; 局部变量是随着方法的调用而存在,一旦局部变量是随着方法的调用而存在,一旦方法调用结束,局部变量也就消亡了。方法调用结束,局部变量也就消亡了。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计实例变量和类变量class dogfloat x;/实例变量实例变量static int y;/类变量类变量面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计实例方法和类方法float max(float x,float y)/实例方法实例方法static float(int x)/类方法类方法面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计注意! 实例方法能对实例实例方法能对实例变量进行操作,也变量进行操作,也能对类变量进行操能对类变量进行操作,而类方法只能作,而类方法只能对类变量进行操作对类变量进行操作class Aint a;static int b;void f(int x,int y)a=x;b=y;static void g(int z)b=24;a=z;?面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计注意! 一个类中的方法可以互相调用,实例方法一个类中的方法可以互相调用,实例方法可以调用该类中的其他方法;类中的类方可以调用该类中的其他方法;类中的类方法只能调用该类的类方法。法只能调用该类的类方法。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计注意! 对成员变量的操作只对成员变量的操作只能放在方法中。方法能放在方法中。方法可以对成员变量和自可以对成员变量和自己定义的局部变量进己定义的局部变量进行操作。行操作。class Aint a=12;float b=123.4f;class Aint a;float b;a=12;/正确正确?b=12.3f;/正确?正确? 思考为什么?思考为什么?面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计93344.4 构造方法 构造方法的功能是在创建对象时初始化对构造方法的功能是在创建对象时初始化对象的实例变量;象的实例变量; 构造方法与类具有相同的名字;构造方法与类具有相同的名字; 构造方法没有返回值;构造方法没有返回值; 如果类中没有定义构造方法,编译器会自如果类中没有定义构造方法,编译器会自动创建一个缺省的、不带参数的构造方法。动创建一个缺省的、不带参数的构造方法。 构造方法是在对象创建之后,构造方法是在对象创建之后,new操作完成操作完成前被调用的。前被调用的。 class point / 程序程序4-3int x, y; point(int a, int b) x=a;y=b;public class createPoint public static void main(String args )point p= new point(10,20); System.out.println(p.x + +p.y); 思考:无构造方法怎么办?思考:无构造方法怎么办?面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.5 方法重载 方法重载是在一个类中定义二个或多个同方法重载是在一个类中定义二个或多个同名的方法,但方法的参数个数或类型不完名的方法,但方法的参数个数或类型不完全相同;例如:全相同;例如:class point int x, y; point(int a, int b) x=a; y=b; point( )x=-1;y=-1; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计注意以下两点 一旦定义了构造方法,一旦定义了构造方法,Java就不能再调用就不能再调用系统缺省构造方法;系统缺省构造方法; 方法重载的一个误区是靠返回值区别重载,方法重载的一个误区是靠返回值区别重载,即定义多个方法,它们的名称和形参类型即定义多个方法,它们的名称和形参类型完全相同,但返回值不同,这是不允许的。完全相同,但返回值不同,这是不允许的。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计对象比较 运算符与运算符与equals()方法的区别()方法的区别 String s1=new String(“abc”); String s2=new String(“abc”); String s3=s1; if(str1=str2)System.out.println(“true”); else System.out.println(“false”);面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计对象的生命周期 离开声明的离开声明的 ; 引用赋值空;引用赋值空; 一个对象两个引用,其中一个赋值空一个对象两个引用,其中一个赋值空面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计垃圾回收 finalize()方法方法 System.gc()面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.6 关键字this 在类的方法定义中使用的在类的方法定义中使用的this代表使用该方代表使用该方法的对象的引用法的对象的引用 当必须指出当前使用方法的对象是谁时要当必须指出当前使用方法的对象是谁时要用用this 有时使用有时使用this处理方法中成员变量和参数重处理方法中成员变量和参数重名的情况名的情况 this可以看作一个变量,它的值时当前对象可以看作一个变量,它的值时当前对象的引用的引用面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.6 关键字this(续) this指代对象可以用于解决实例变量被局部指代对象可以用于解决实例变量被局部变量屏蔽的问题。变量屏蔽的问题。 例如:例如:class point int x , y; void init(int x, int y )this.x=x;this.y=y; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.6 关键字this (续) 在构造方法内部使用在构造方法内部使用this,它用于指代另外,它用于指代另外一个构造方法,但不能指代非构造方法。例一个构造方法,但不能指代非构造方法。例如:如:class point int x, y; point( )this(-1,-1); point(int a, int b) x=a; y=b; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.7 继承 继承是软件重用的一种形式继承是软件重用的一种形式 ,可以提高系可以提高系统的性能统的性能; 子类的对象也是其超类的对象,反之未必子类的对象也是其超类的对象,反之未必继承语法:继承语法:class className extends superClassName 各实例变量和方法的定义各实例变量和方法的定义 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 java只支持单继承,不允许多重继承只支持单继承,不允许多重继承 java可以有多层继承,可以有多层继承,继承具有传递性。继承具有传递性。 子类继承父类的的所有成员变量和成员方子类继承父类的的所有成员变量和成员方法。法。不继承父类的构造方法、私有成员?不继承父类的构造方法、私有成员?面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计关键字super 构造方法是一种特殊的方法,子类不能继构造方法是一种特殊的方法,子类不能继承父类的构造方法,但子类构造方法可以承父类的构造方法,但子类构造方法可以通过通过super调用父类的构造方法。调用父类的构造方法。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计再次讨论构造方法 若父类没有定义构造方法,那么对父类数若父类没有定义构造方法,那么对父类数据的初始化将采用系统缺省的构造方法;据的初始化将采用系统缺省的构造方法;例如:例如: class point int x, y; class circle extends point int radius; circle(int r, int x, int y) this.x=x; this.y=y; radius=r; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计再次讨论构造方法 若父类定义有缺省构造方法,那么子类可根若父类定义有缺省构造方法,那么子类可根据自己的需要设置自己的构造方法。例如:据自己的需要设置自己的构造方法。例如: class point int x, y; point( ) this(0,0); point(int x, int y) this.x=x; this.y=y; class circle extends point / 注意子类的构造方法注意子类的构造方法 int radius; circle(int r, int x, int y) radius=r; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计再次讨论构造方法(续) 若父类定义的构造方法都是有参的,那么子若父类定义的构造方法都是有参的,那么子类构造方法必须通过类构造方法必须通过super调用父类构造方调用父类构造方法,例如:法,例如:class point private int x, y; point(int x, int y) this.x=x; this.y=y; class circle extends point int radius; circle(int r, int x, int y) super(x, y); radius=r; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计子类对象的实例化过程1.分配成员变量的存储空间并进行默认初始分配成员变量的存储空间并进行默认初始化化2.绑定构造方法参数,将绑定构造方法参数,将new 类名类名(参数列表参数列表)传递的参数赋值给构造方法的参数变量传递的参数赋值给构造方法的参数变量3.如有如有this调用,调用重载的构造方法(被调调用,调用重载的构造方法(被调用的方法又从步骤用的方法又从步骤2开始执行),被调用的开始执行),被调用的构造方法执行结束后,回到当前构造方法,构造方法执行结束后,回到当前构造方法,执行步骤执行步骤6面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.显式或隐式追朔调用父类的构造方法(一显式或隐式追朔调用父类的构造方法(一直到直到object为止),父类的构造方法又从为止),父类的构造方法又从步骤步骤2开始执行,父类的构造方法执行结束开始执行,父类的构造方法执行结束后,回到当前构造方法,当前构造方法继后,回到当前构造方法,当前构造方法继续往下执行续往下执行5.进行实例变量的显式初始化操作,即定义进行实例变量的显式初始化操作,即定义成员变量时对其进行赋值的语句成员变量时对其进行赋值的语句6.执行当前构造方法的其余代码执行当前构造方法的其余代码面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.8 方法的覆盖 方法的覆盖发生在方法的覆盖发生在父类和子类之间父类和子类之间 子类的方法名、参数列表、返回值完全和子类的方法名、参数列表、返回值完全和父类一样父类一样 访问权限大于等于父类访问权限访问权限大于等于父类访问权限 如需调用父类被覆盖的方法,如需调用父类被覆盖的方法,super.super.方法方法的格式的格式面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.8.1 覆盖与重载的区别 重载可以出现在一个类中,也可以出现在重载可以出现在一个类中,也可以出现在父类与子类的继承关系中,并且重载方法父类与子类的继承关系中,并且重载方法的特征一定不完全相同。的特征一定不完全相同。 覆盖特点:子类中的方法特征与父类定义覆盖特点:子类中的方法特征与父类定义的的对应方法的对应方法的特征完全一样。例如:特征完全一样。例如: / 程序程序4-9class point int x, y; point( ) this(0,0); point(int x, int y) this.x=x; this.y=y; double area( ) return 0; class circle extends point int radius; circle(int r, int x, int y)super(x, y); radius=r; double area( ) return Math.PI*radius*radius ; 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.8.2 方法的动态调用 Java的所有对象运行时都有一个类型标识的所有对象运行时都有一个类型标识(RTTI:Run-Time Type Identification),),该标识记录了每个对象该标识记录了每个对象所属于的类。所属于的类。Java用此标识在运行时选择用此标识在运行时选择正确的方法。例如:正确的方法。例如: 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 子类对象调用方法时子类对象调用方法时(1) 子类检查是否具有子类检查是否具有同名和同参数类型的方法,若有调用该方同名和同参数类型的方法,若有调用该方法,否则继续执行。法,否则继续执行。(2) 到父类中寻找同名到父类中寻找同名和同参数类型的方法,若有调用该方法。和同参数类型的方法,若有调用该方法。若找不到,将产生编译错误。若找不到,将产生编译错误。 对象决定自己到底该调用哪个方法,取决对象决定自己到底该调用哪个方法,取决于该对象在继承链中的位置。于该对象在继承链中的位置。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.9 多态性不适合继承链中的实例变量 对象对象.方法:方法:根据多态性调用;根据多态性调用; 对象对象.实例变量:根据对象的类型调用。即:实例变量:根据对象的类型调用。即:多态性仅仅适用于方法的调用,而不适合多态性仅仅适用于方法的调用,而不适合实例变量实例变量 。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.12 关键字final 在实例变量、局部变量和方法的形参定义之在实例变量、局部变量和方法的形参定义之前加上前加上final,那么这个变量值只能被引用,那么这个变量值只能被引用,而不能修改。而不能修改。 finalfinal修饰的局部变量和实例变量必须给出修饰的局部变量和实例变量必须给出初值,代表一个常量。初值,代表一个常量。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.12.2 final方法 在方法定义前加上在方法定义前加上final,该方法就不能被该方法就不能被子类覆盖,成为终极方法子类覆盖,成为终极方法 ; 包含终极方法的类仍然可以被子类继承,包含终极方法的类仍然可以被子类继承,子类虽然不能覆盖父类中的终极方法,但子类虽然不能覆盖父类中的终极方法,但可以重载该方法。可以重载该方法。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.12.3 final类 在一个类定义前加上在一个类定义前加上final,意味着这个类,意味着这个类就不能被其它类继承,成为终极类。就不能被其它类继承,成为终极类。 系统类基本上都是系统类基本上都是final类,如类,如String类。类。 将将class定义为定义为final是为了杜绝继承,类中是为了杜绝继承,类中的方法自然都变成了终极方法。的方法自然都变成了终极方法。作业(1)编写Light类,该类拥有: 成员变量:watts(私有,整型);/用于存放灯的瓦数; indic(私有,布尔类型);/用于存放灯的开或关的状态构造方法Light(int watts)Light(int watts, boolean indic) 3成员方法public void switchOn() /开灯,灯的状态置为开 public void switchOff() /关灯 public void printInfo() /输出灯的瓦数和开关状态(2)编写TubeLight类,继承Light类。拥有:2个成员变量 tubeLength(私有,整型) /存放灯管的长度 color(私有,String类型) /用于存放灯光的颜色 构造方法TubeLight(int watts, int tubeLength,String color) 成员方法 public void printInfo() /输出瓦数、开关信息、长度以及颜色(3)测试程序,要求: 创建一个管状灯对象,瓦数为:32;长度为50;白色灯光,状态为开。 打印输出该灯的相关信息。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.14 抽象类和抽象方法 抽象方法:仅有方法特征,但没有代码;抽象方法:仅有方法特征,但没有代码; 抽象类:包含抽象方法的类。但是,不包含抽象类:包含抽象方法的类。但是,不包含抽象方法的类也可以是抽象类。抽象方法的类也可以是抽象类。 抽象类的作用:提供一种适当的超类,子类抽象类的作用:提供一种适当的超类,子类通过继承实现父类中的抽象方法。通过继承实现父类中的抽象方法。 抽象类不能用抽象类不能用final修饰。修饰。 抽象类体现了多态性,通过继承可以从抽象抽象类体现了多态性,通过继承可以从抽象类派生出具有相似操作的子类。例如:类派生出具有相似操作的子类。例如:面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计5.3 接口接口 什么是接口?什么是接口? 所谓接口可以看作是没有实现的方法和常所谓接口可以看作是没有实现的方法和常量的集合。接口与抽象类相似,接口中的量的集合。接口与抽象类相似,接口中的方法只是做了声明,而没有定义任何具体方法只是做了声明,而没有定义任何具体的操作方法。使用接口是为了解决的操作方法。使用接口是为了解决Java语语言中不支持多重继承的问题。言中不支持多重继承的问题。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计5.3.1 实现系统提供的接口实现系统提供的接口 Java已经创建了许多系统接口,如已经创建了许多系统接口,如MouseListener和和MouseMotionListener接接口,定义了处理鼠标事件的方法,当一个类实口,定义了处理鼠标事件的方法,当一个类实现这两个接口后,就可以处理这些鼠标事件。现这两个接口后,就可以处理这些鼠标事件。 在接口中定义的变量全部隐含为在接口中定义的变量全部隐含为final和和static,表明这些变量不能被实现接口方法的类改变,表明这些变量不能被实现接口方法的类改变,还必须设置初值。如果接口为还必须设置初值。如果接口为public的,则接的,则接口中的方法和变量也全部为口中的方法和变量也全部为public。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计5.3.2 创建自定义接口创建自定义接口 创建自定义接口要使用声明接口语句,格创建自定义接口要使用声明接口语句,格式如下:式如下: 修饰符修饰符 / 静态常量及方法声明静态常量及方法声明 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计5.3.3 接口的继承关系接口的继承关系 1接口的单继承接口的单继承 2接口的多重继承接口的多重继承面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计1. 接口的单继承。接口的单继承。interface A void F1();interface B extends A void F2();说明:说明:接口接口B将继承接口将继承接口A中的所有变量和方法,这种接口中的所有变量和方法,这种接口之间的继承称为单继承。接口之间的继承与类的之间的继承称为单继承。接口之间的继承与类的继承一样使用关键字继承一样使用关键字extends。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计2接口的多重继承 在在Java语言中,不支持类的多重继承。但语言中,不支持类的多重继承。但是支持接口的多重继承,其语法格式如下:是支持接口的多重继承,其语法格式如下: interface接口名接口名extends接口名接口名1, 接口名接口名2, 可见接口的多重继承只是在单继承的基础可见接口的多重继承只是在单继承的基础上再加上几个接口,并把这些接口用逗号上再加上几个接口,并把这些接口用逗号分隔开。分隔开。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.15 对象的类型转换 类型向上转换(类型向上转换(upcasting);); 类型向下转换(类型向下转换(downcasting)。)。 注意:对象类型转换只能发生在继承关系注意:对象类型转换只能发生在继承关系中中 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.15.1 向上类型转换 从子类向父类转换从子类向父类转换,在继承图中是向上移在继承图中是向上移动,通常称为向上类型转换。动,通常称为向上类型转换。 类型向上转换是安全的,因为这是从特殊类型向上转换是安全的,因为这是从特殊类型到通用类型的转换。类型到通用类型的转换。 进行向上类型转换时,出现的唯一问题是进行向上类型转换时,出现的唯一问题是可能丢失子类中定义的方法和变量。可能丢失子类中定义的方法和变量。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计4.15.2 向下类型转换 从父类向子类转换从父类向子类转换,在继承图中是向下移在继承图中是向下移动,称为向下类型转换。动,称为向下类型转换。 类型向下转换是不安全的,因为这是从一类型向下转换是不安全的,因为这是从一般类型到特殊类型的转换。般类型到特殊类型的转换。 用用instanceofinstanceof判断一个对象是不是一个类判断一个对象是不是一个类的实例的实例面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计Object类 Object 类类 equals()方法方法 Student s1=new Student(“zhang”,18); Student s2=new Student(“zhang”,18); s1.equals(s2)返回结果是返回结果是true还是还是false?面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计包 Java要求文件名与类名相同,将多个类放要求文件名与类名相同,将多个类放在一起时,要保证类名不能重复。当声明在一起时,要保证类名不能重复。当声明的类很多时,类名就有可能冲突,这就需的类很多时,类名就有可能冲突,这就需要一种机制来管理类名,这就是包。要一种机制来管理类名,这就是包。 一个包对应一个文件夹,包中还可以有包,一个包对应一个文件夹,包中还可以有包,称为包等级。如同文件夹中可以有子文件称为包等级。如同文件夹中可以有子文件夹。夹。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 同一个包中类名不能重复,不同包中可以同一个包中类名不能重复,不同包中可以有相同的类名。有相同的类名。 当源程序中没有声明类所在的包时,当源程序中没有声明类所在的包时,Java将类放在默认包中,即运行编译器的当前将类放在默认包中,即运行编译器的当前文件夹中。这时,不能出现重复的类名。文件夹中。这时,不能出现重复的类名。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计包语句 包是包是java语言中有效管理类的一个机制语言中有效管理类的一个机制 通过关键字通过关键字package声明包语句声明包语句 格式:格式:package 包名;包名; 包名可以是一个合法的标识符,也可以是包名可以是一个合法的标识符,也可以是若干个标识符加若干个标识符加“.”分割而成,如分割而成,如 package age; package ;面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计import语句 使用使用import语句可以引入包中的类语句可以引入包中的类 可以有多个可以有多个import语句语句 必须写在必须写在package和源程序之间和源程序之间 格式:格式:import package1. .package2. .(class-name | *); 采用采用*号不影响程序的运行性能,但会影响编译速号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合理。度。指明具体类比引入整个包更为合理。 面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计Java中的包 大约大约130多个,常用的包如下:多个,常用的包如下: java.lang这个包包含了一些形成语言核心的类,这个包包含了一些形成语言核心的类,提供了类似提供了类似Character、Integer和和Double这样的封装这样的封装类。它还提供了系统标准类,如类。它还提供了系统标准类,如String和和StringBuffer。Java编辑器总是自动装载这个包。编辑器总是自动装载这个包。 javax.swing这个包提供了更丰富而且更加方这个包提供了更丰富而且更加方便的用户界面元素集合。便的用户界面元素集合。 java.awt是由许多组成是由许多组成Java的抽象视窗工具的抽象视窗工具(awt)的类所组成的包,它提供了基于类的图形用)的类所组成的包,它提供了基于类的图形用户界面户界面.面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 这个包提供了网络、套接字处理器和这个包提供了网络、套接字处理器和Internet实用工具类。实用工具类。 java.io这个包中的类提供了输入输出服务,用这个包中的类提供了输入输出服务,用于读出和写入文件数据,访问键盘输入和打印输出。于读出和写入文件数据,访问键盘输入和打印输出。 java.nio这个包中的类提供了新的多路复用的这个包中的类提供了新的多路复用的非阻塞的输入输出服务。比面向线程的阻塞非阻塞的输入输出服务。比面向线程的阻塞 I/O 的可的可伸缩性更好,由选择器、可选择通道伸缩性更好,由选择器、可选择通道 和选择键和选择键 提供。提供。 java.util这个包包含为任务设置的实用程序类这个包包含为任务设置的实用程序类和集合框架类和集合框架类.面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 java.rmi远程方法启用包,在这个包中的类提远程方法启用包,在这个包中的类提供了通过远程接口控制的分布式代码的支持。通过该供了通过远程接口控制的分布式代码的支持。通过该包中的类,可以创建包中的类,可以创建Java应用程序,使它的不同部应用程序,使它的不同部分在不同的系统中一起运行。分在不同的系统中一起运行。 java.sql这个包提供了结构化查询语言数据库这个包提供了结构化查询语言数据库字段类型和方法的实现。字段类型和方法的实现。 java.applet这个包提供了创建这个包提供了创建Java applet的的途径,途径,Java applet运行在运行在Web浏览器下,通常通过浏览器下,通常通过Internet下载。下载。 javax.xml这个包提供了操作这个包提供了操作XML文档的基础文档的基础类类.面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计9380访问权限 Java提供的访问权限修饰符有四个,即提供的访问权限修饰符有四个,即public、private、protected和包修饰;和包修饰; 修饰符要置于每个类成员的定义之前,且修饰符要置于每个类成员的定义之前,且仅能控制它所修饰的那个成员仅能控制它所修饰的那个成员 。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计9381包修饰 缺省修饰符的情况就是包修饰。包修饰符缺省修饰符的情况就是包修饰。包修饰符意味着同一个目录(包)中的所有类都可意味着同一个目录(包)中的所有类都可以访问这种类型的成员。以访问这种类型