1、Java程序程序设计设计与开与开发发2022-12-8 在面向对象程序设计中,继承是最为显著的一个特征。继承在面向对象程序设计中,继承是最为显著的一个特征。继承机制模仿了现实中机制模仿了现实中IS-A关系关系(层次关系层次关系).继承就是以原有某个类继承就是以原有某个类为基础生成新的类,增加一些为基础生成新的类,增加一些新的成员变量和方法新的成员变量和方法,使新的类,使新的类功能更趋完善的一种高效编程机制。新生成的类被称为功能更趋完善的一种高效编程机制。新生成的类被称为子类子类(或或派生类派生类),原有的这个类被称为子类的,原有的这个类被称为子类的父类父类(基类,也称为超类基类,也称为超类).
2、v通常把某一组相似对象的基础的、共有的、通用的属性设计通常把某一组相似对象的基础的、共有的、通用的属性设计成父类,再通过继承生成新的子类,代码重用性得到了提高成父类,再通过继承生成新的子类,代码重用性得到了提高.例如例如,水果和梨水果和梨,动物和乌龟动物和乌龟,食品和罐头食品和罐头,交通工具和轿车等交通工具和轿车等 注意,注意,Java顶层父类是顶层父类是Object.3.2 继承继承Java程序程序设计设计与开与开发发2022-12-8类的定义语法是:类的定义语法是:修饰符修饰符 class class 类名类名 extends extends 父类父类 implements impleme
3、nts 接口名接口名 类成员变量定义类成员变量定义 类方法定义类方法定义 类的类的修饰符修饰符用来说明类的特殊用来说明类的特殊性质。分为三种:性质。分为三种:访问控制符:访问控制符:public 或或 无无抽象类说明符:抽象类说明符:abstract最终类说明符:最终类说明符:final接口名接口名跟在跟在implements关键关键字后面,用来说明当前类中实字后面,用来说明当前类中实现了哪个接口定义的功能和方现了哪个接口定义的功能和方法。法。接口是接口是Java语言用来实语言用来实现多重继承的一种特殊机制。现多重继承的一种特殊机制。3.2.1 类的定义类的定义 Java程序程序设计设计与开与
4、开发发2022-12-8v如定义一个如定义一个Person类和子类类和子类Studentclass Person String name;int age;public void eat()public void sleep()class Student extends Person private String shoolNO;private void doHomework();Java程序程序设计设计与开与开发发2022-12-83.2.2 成员变量和方法成员变量和方法 成员变量用来描述类创建的对象的属性,而成员方法则刻画成员变量用来描述类创建的对象的属性,而成员方法则刻画了对象特有的行为。
5、了对象特有的行为。Java中的成员变量根据不同的修饰符有中的成员变量根据不同的修饰符有3种类型:种类型:-实例变量实例变量,随对象被访问,随对象被访问-类变量类变量,随类被访问,随类被访问 -常量常量注意,注意,Java成员变量随对象被创建而产生,对于全局静态变成员变量随对象被创建而产生,对于全局静态变量,则与类属于同等层次概念。量,则与类属于同等层次概念。Java程序程序设计设计与开与开发发2022-12-8v举例说明,见举例说明,见【例例3.3】Java程序程序设计设计与开与开发发2022-12-8v就对象的方法而言,可分为构造方法和普通方法。而构造方就对象的方法而言,可分为构造方法和普通
6、方法。而构造方法是在类创建对象时由系统自动调用。法是在类创建对象时由系统自动调用。与成员变量一样,方法也有实例方法和类方法之分。与成员变量一样,方法也有实例方法和类方法之分。-实例方法实例方法,随对象而调用,随对象而调用-类方法类方法,随类而调用,随类而调用方法的定义语法是:方法的定义语法是:修饰符修饰符 返回值返回值 (参数列表参数列表)方法体方法体 其中,修饰符共其中,修饰符共4种情况:种情况:public,protected,private 或或 不提供不提供.Java程序程序设计设计与开与开发发2022-12-8v要使用对象,必须先创建对象。要使用对象,必须先创建对象。Java中的对象
7、是通过构造中的对象是通过构造方法来创建的。构造方法有以下特性:方法来创建的。构造方法有以下特性:构造方法的方法名构造方法的方法名与类名相同与类名相同。构造方法构造方法没有返回值没有返回值,当然也没有返回类型。,当然也没有返回类型。构造方法的主要作用是完成构造方法的主要作用是完成对类对象的初始化工作对类对象的初始化工作。构造方法构造方法一般不能一般不能由编程人员显式地直接调用。由编程人员显式地直接调用。在创建一个类的新对象的同时,系统会在创建一个类的新对象的同时,系统会自动调用该类的构造自动调用该类的构造方法方法,为新对象初始化。,为新对象初始化。一个类可以有一个类可以有多个构造方法,多个构造方
8、法,可以可以有有0个、个、1个或多个参数个或多个参数。构造方法总是构造方法总是和和new运算符一起被调用运算符一起被调用。3.2.3 对象的构造和初始化过程对象的构造和初始化过程*!*Java程序程序设计设计与开与开发发2022-12-8v当没有为类提供一个构造方法时,则编译器会自动加入一个当没有为类提供一个构造方法时,则编译器会自动加入一个不带参数的构造方法,称为默认构造方法。例如,不带参数的构造方法,称为默认构造方法。例如,class Person Person()super();class Student extends Person Student()super();/系统自动行为系统
9、自动行为 public static void main(String args)new Student();/(1)创建子类对象创建子类对象 问题,上述语句问题,上述语句(1)会不会创建父类对象会不会创建父类对象?要注意区分要注意区分构造方法构造方法和和new操作操作的不同作用的不同作用!class Object Object()Java程序程序设计设计与开与开发发2022-12-8 v构造方法的执行过程构造方法的执行过程 当创建一个对象时,对象的各个变量根据其类型被设置为当创建一个对象时,对象的各个变量根据其类型被设置为相应的相应的默认初始值默认初始值,然后调用构造方法然后调用构造方法。下
10、面是执行步骤。下面是执行步骤:调用父类的构造方法,这个过程会重复下去调用父类的构造方法,这个过程会重复下去.按声明顺序对成员变量进行初始化按声明顺序对成员变量进行初始化.执行构造方法中的各语句执行构造方法中的各语句.v构造器调用的顺序保证构造器调用的顺序保证所有的父类构造方法所有的父类构造方法都得到调用,保都得到调用,保证证其基类的成员得到正确的初始化其基类的成员得到正确的初始化并执行相关语句,然后对并执行相关语句,然后对本对象的域本对象的域(变量变量)进行初始化。构造方法的作用就是初始化进行初始化。构造方法的作用就是初始化.下面举例说明下面举例说明.【例例3.1】构造方法和对象初始化构造方法
11、和对象初始化Java程序程序设计设计与开与开发发2022-12-8程序运行结果是:?程序运行结果是:?下面,将对继承情况下父下面,将对继承情况下父-子类之间的初始化进行分析子类之间的初始化进行分析.Java程序程序设计设计与开与开发发2022-12-8public class aparent int height=170;int weight;aparent()height=160;weight=130;class aboy extends aparent protected int comhei=120;aboy()weight=(int)(120f/height*weight);v当创建当
12、创建 一个类型为一个类型为aboy的对象时,其创建和初始化的步骤的对象时,其创建和初始化的步骤如下表所示。如下表所示。v例如,创建一个子类对象时例如,创建一个子类对象时Java程序程序设计设计与开与开发发2022-12-8Java程序程序设计设计与开与开发发2022-12-8vJava的类加载过程和对象初始化顺序,按照如下步骤进行:的类加载过程和对象初始化顺序,按照如下步骤进行:首先,当类被加载时执行首先,当类被加载时执行静态变量初始化静态变量初始化、静态初始化块静态初始化块.然后,然后,非静态变量初始化非静态变量初始化、非静态初始化块非静态初始化块被执行被执行.最后,最后,构造方法被执行。构
13、造方法被执行。从父类的构造方法递归执行从父类的构造方法递归执行.即,依次执行:即,依次执行:(静态变量、静态初始化块静态变量、静态初始化块)(变量、初始化块变量、初始化块)构造方法构造方法 Java程序程序设计设计与开与开发发2022-12-8注意注意,(1)在继承情况下在继承情况下,并不是父类完全初始化完毕后才进行子类并不是父类完全初始化完毕后才进行子类的初始化的初始化!(2)静态变量和静态初始化块是依照他们在类中的定义顺序静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样进行初始化的。同样,变量和初始化块也遵循这个规律变量和初始化块也遵循这个规律.下面举例说明下面举例说明.
14、【例例3.2】类加载和对象初始化类加载和对象初始化Java程序程序设计设计与开与开发发2022-12-8v3.2.4 上转型对象上转型对象 梨子梨子-水果,乌龟水果,乌龟-动物,学生动物,学生-人等概念具有从属关系,前者人等概念具有从属关系,前者是后者的一种。是后者的一种。例如,对于例如,对于Person类和子类类和子类Student;当创建;当创建Student子类子类对象时,并把这个对象的引用放到类对象时,并把这个对象的引用放到类Person声明的对象声明的对象中,即:中,即:Person p=new Student();或者或者 Person p;Student s=new Studen
15、t();p=s;则称则称 对象对象p是子类对象是子类对象s的的上转型对象上转型对象.类似地类似地,也可以将创建的间接子类也可以将创建的间接子类 Graduate对象放到对象放到Person对象引用中。对象引用中。v 对象的上转型对象的实体是子类负责创建的,只是失去了对象的上转型对象的实体是子类负责创建的,只是失去了原对象的一些属性和方法,其特点如图所示:原对象的一些属性和方法,其特点如图所示:Java程序程序设计设计与开与开发发2022-12-8v原对象和上转型对象之间关系原对象和上转型对象之间关系v上转型对象的特点是:上转型对象的特点是:a.上转型对象不能操作子类新增的变量和方法上转型对象不
16、能操作子类新增的变量和方法.b.上转型对象可以操作子类继承上转型对象可以操作子类继承或隐藏或隐藏的成员变量,也可以使的成员变量,也可以使用子类继承或重写的方法用子类继承或重写的方法.c.可将上转型对象再转换到一个子类对象,这时该子类对象又可将上转型对象再转换到一个子类对象,这时该子类对象又具备了子类的所有属性和功能具备了子类的所有属性和功能.【例例3.3】上转型对象上转型对象Java程序程序设计设计与开与开发发2022-12-8v上转型对象应用举例上转型对象应用举例.问题问题:下列语句正确吗下列语句正确吗?Student s=new Person();上转型对象是父类对象吗?上转型对象是父类对
17、象吗?Java程序程序设计设计与开与开发发2022-12-83.2.5 this和和super this,super分别指代当前对象和父类对象,通常出现在构造分别指代当前对象和父类对象,通常出现在构造方法中。例如,方法中。例如,class Person String name=“zhangshan”;public Person()/super(name);/显式调用父类带参的构造方法显式调用父类带参的构造方法 this(name);/调用重载的构造方法调用重载的构造方法,Person(name)?public Person(String name)this.name=name;/为同名的成员变
18、量赋值为同名的成员变量赋值 Java程序程序设计设计与开与开发发2022-12-8v注意以下几点:注意以下几点:1)在一个构造方法中使用了在一个构造方法中使用了this或或super语句,那么它必须作语句,那么它必须作为构造方法的第一条语句为构造方法的第一条语句.2)只能在构造方法只能在构造方法(非其他实例方法非其他实例方法)中用中用this语句来调用类的语句来调用类的其他构造方法,且不能通过方法名来直接调用构造方法其他构造方法,且不能通过方法名来直接调用构造方法.如如果调用父类构造方法也只能用果调用父类构造方法也只能用super而不是父类名而不是父类名.3)this,super对象不能出现在
19、静态方法中对象不能出现在静态方法中.public static void main(String args)this.play();/Java程序程序设计设计与开与开发发2022-12-83.3 多态多态v多态是指一个名称具有多种功能。即同名但拥有不同的方法多态是指一个名称具有多种功能。即同名但拥有不同的方法体。分重载(体。分重载(overloading)和覆盖()和覆盖(overriding)两种。)两种。v重载,又称编译时多态,在一个类中通过不同参数个数或不重载,又称编译时多态,在一个类中通过不同参数个数或不同类型参数来体现。如:同类型参数来体现。如:sum(byte a,byte b);
20、sum(int a,int b);sum(double a,double b);Java程序程序设计设计与开与开发发2022-12-8v构造方法的重载构造方法的重载 构造方法重载的目的是构造方法重载的目的是以不同的方法对类进行初始化。以不同的方法对类进行初始化。例如,例如,为类为类Person编写构造方法编写构造方法:public Person()public Person(String name)public Person(int ID)public Person(String name,String ID)为为Student子类编写构造方法子类编写构造方法:public Student()
21、public Student(String name,String no)v如果构造方法有返回值类型如果构造方法有返回值类型(包括包括void)修饰,那它不再是构修饰,那它不再是构造方法而成了普通方法,一般不提倡这么做。造方法而成了普通方法,一般不提倡这么做。构造方法可以被继承构造方法可以被继承吗吗?可以用可以用static修饰吗修饰吗?Java程序程序设计设计与开与开发发2022-12-8v方法覆盖,又称运行时多态,只有在运行时(非编译时)根方法覆盖,又称运行时多态,只有在运行时(非编译时)根据对象的类型来决定是调用父类的同名方法还是子类重写的据对象的类型来决定是调用父类的同名方法还是子类重
22、写的方法。例如,方法。例如,狗叫,猫叫,老虎叫,狮子叫声都不一样狗叫,猫叫,老虎叫,狮子叫声都不一样!方法覆盖条件:方法覆盖条件:1)方法名相同方法名相同;2)方法的参数列表完全相同方法的参数列表完全相同;3)返回值必须相同返回值必须相同;举例说明如下:举例说明如下:方法的访问修饰符方法的访问修饰符有影响吗有影响吗?对照想一想,方法对照想一想,方法重载的条件呢重载的条件呢?【例例3.4】方法重载方法重载Java程序程序设计设计与开与开发发2022-12-8【例例3.5】方法覆盖方法覆盖Java程序程序设计设计与开与开发发2022-12-8v下面下面修改修改一下上述一下上述main方法中的几个语
23、句,如上图所示,方法中的几个语句,如上图所示,则运行结果呢?则运行结果呢?Animal a=new Animal();Animal c=new Cat();Animal d=new Dog();a.sound();c.sound();d.sound();Java程序程序设计设计与开与开发发2022-12-8关于方法覆盖关于方法覆盖(重写重写)vJava运行时系统运行时系统根据调用该方法的对象根据调用该方法的对象,来决定调用哪个,来决定调用哪个方法。对于子类的一个对象,如果子类方法。对于子类的一个对象,如果子类重写了重写了父类的方法,父类的方法,则运行时系统则运行时系统调用子类的方法调用子类的方
24、法;如果子类;如果子类继承了继承了父类的方法父类的方法(未重写),则运行时系统(未重写),则运行时系统调用父类的方法。调用父类的方法。vprivate方法可以被覆盖吗?方法可以被覆盖吗?final方法可以被覆盖吗?方法可以被覆盖吗?v注意,方法覆盖还存在访问权限的问题。注意,方法覆盖还存在访问权限的问题。Java程序程序设计设计与开与开发发2022-12-8v变量覆盖变量覆盖 或称变量隐藏,只要变量名相同就实现了隐藏。或称变量隐藏,只要变量名相同就实现了隐藏。其修饰符和类型可以不同。其修饰符和类型可以不同。例如,例如,问题,这样赋值可以吗问题,这样赋值可以吗?woman.aveHight=17
25、0.5f;Java程序程序设计设计与开与开发发2022-12-83.4 修饰符修饰符3.4.1 访问修饰符访问修饰符 在定义类,成员变量,方法时,可以在其前面加上修饰在定义类,成员变量,方法时,可以在其前面加上修饰符符。有访问修饰符和非访问修饰符之分。有访问修饰符和非访问修饰符之分。访问修饰符访问修饰符 是一组限定类,成员变量或方法能在多大范是一组限定类,成员变量或方法能在多大范围内被访问的修饰符。围内被访问的修饰符。v类的访问修饰符只有两种,而成员变量和方法可以拥有类的访问修饰符只有两种,而成员变量和方法可以拥有4 4种不同的修饰符种不同的修饰符.如图所示:如图所示:Java程序程序设计设计
26、与开与开发发2022-12-8 类的访问修饰符类的访问修饰符(2种种)public(公共访问公共访问)缺省包访问缺省包访问成员变量与方法的访问修饰符成员变量与方法的访问修饰符(4种种)符号符号publicprotected无无private 含义含义公共访问公共访问保护访问保护访问缺省包访缺省包访问问私有访问私有访问 Java程序程序设计设计与开与开发发2022-12-8(1)公共访问修饰符公共访问修饰符-public用来修饰类时,即公有类,表明它可以被用来修饰类时,即公有类,表明它可以被所有的其他类所有的其他类所访问和引用所访问和引用.这里访问和引用是指这个这里访问和引用是指这个类作为整体是
27、可见和可使用的类作为整体是可见和可使用的,可以创建这个类的对象、访问这个类可以创建这个类的对象、访问这个类内部可见内部可见的成员变量的成员变量和调用它的和调用它的可见可见的方法。的方法。一个一个类作为整体类作为整体对程序的其他部分可见,并不能代对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分表类内的所有属性和方法也同时对程序的其他部分可见,可见,前者只是后者的必要条件前者只是后者的必要条件,类的属性和方法,类的属性和方法能否为所有其他类所访问,能否为所有其他类所访问,还要看这些属性和方法还要看这些属性和方法自己的访问修饰符自己的访问修饰符。Java程序程序设计设计与开
28、与开发发2022-12-8(2)缺省访问修饰符缺省访问修饰符-default 假如一个类假如一个类没有访问修饰符没有访问修饰符,说明该类只能被,说明该类只能被同同一个包一个包中的类访问。这种缺省的访问修饰规定该类只中的类访问。这种缺省的访问修饰规定该类只能被能被同一个包同一个包中的类访问和引用,而不可以被其他包中的类访问和引用,而不可以被其他包中的类使用,这就是中的类使用,这就是包访问特性包访问特性。类的默认访问修饰符是类的默认访问修饰符是 defaultdefault.通过声明类的访问修饰符可以使整个程序结构清晰、通过声明类的访问修饰符可以使整个程序结构清晰、严谨,减少可能产生类间干扰和错误
29、。严谨,减少可能产生类间干扰和错误。Java程序程序设计设计与开与开发发2022-12-8(3)保护访问控制符保护访问控制符-protected用用protected修饰的修饰的成员变量或方法成员变量或方法可以被三种类所引用:可以被三种类所引用:该类自身该类自身;与它与它在同一个包中的其他类在同一个包中的其他类;在其他包中的该类的子类在其他包中的该类的子类;使用使用protected修饰符的主要作用是允许其他包中的它的子类修饰符的主要作用是允许其他包中的它的子类来访问父类的特定属性。来访问父类的特定属性。Java程序程序设计设计与开与开发发2022-12-8(4)私有访问控制符私有访问控制符-
30、private用用privateprivate修饰的成员变量或修饰的成员变量或方法方法 只能被该类自身所访只能被该类自身所访问和修改问和修改,而不能被任何其他类,包括该类的子类,来,而不能被任何其他类,包括该类的子类,来获取和引用。获取和引用。在下面的情况下可以选择私有方法:在下面的情况下可以选择私有方法:1)与类的使用者无关的那些方法。与类的使用者无关的那些方法。2)如果类的实现改变了,不容易维护的那些方法如果类的实现改变了,不容易维护的那些方法如果构造方法被声明为如果构造方法被声明为private型的,会发生什么情况呢?型的,会发生什么情况呢?Java程序程序设计设计与开与开发发2022-
31、12-8成员变量和方法的访问修饰符成员变量和方法的访问修饰符 可以有可以有4个,其访问特性如下个,其访问特性如下表所示:表所示:注意,成员变量和方法默认修饰符是注意,成员变量和方法默认修饰符是default,即具有包访,即具有包访问权限问权限.下面举例说明下面举例说明.【例例3.6】访问修饰符举例访问修饰符举例Java程序程序设计设计与开与开发发2022-12-8v在同一个包中的访问情况在同一个包中的访问情况 程序运行结果程序运行结果?Java程序程序设计设计与开与开发发2022-12-8v在不同包中的访问情况在不同包中的访问情况程序运行结果程序运行结果?Java程序程序设计设计与开与开发发2
32、022-12-83.4.2 非访问修饰符非访问修饰符1.类的非访问修饰符类的非访问修饰符可以使用可以使用abstractabstract,finalfinal修饰一个类,当为内部类时,还可修饰一个类,当为内部类时,还可以用以用staticstatic予以修饰。予以修饰。2.成员变量和方法的非访问修饰符成员变量和方法的非访问修饰符可以使用可以使用static,final来修饰变量,使用来修饰变量,使用static,final和和abstract修饰方法,具体如下表所示:修饰方法,具体如下表所示:*Java程序程序设计设计与开与开发发2022-12-8static变量和变量和static方法方法
33、用用static修饰的成员变量,也称类变量;相反,则为实例变量修饰的成员变量,也称类变量;相反,则为实例变量.用用static修饰的成员方法,也称类方法;相反,则为实例方法修饰的成员方法,也称类方法;相反,则为实例方法.它们是属于整个类的,它们是属于整个类的,使用类名作前缀进行访问使用类名作前缀进行访问,它们随,它们随类类的装载而初始化的装载而初始化,为该类的所有对象所共享,为该类的所有对象所共享.注意,在类方法中可以操纵类变量和调用其他类方法,但注意,在类方法中可以操纵类变量和调用其他类方法,但不不能操纵实例变量和调用实例方法能操纵实例变量和调用实例方法(当然可以通过对象名来操当然可以通过对
34、象名来操纵纵).).同样地,在类方法中不能出现同样地,在类方法中不能出现this,superthis,super的引用的引用.static的作用体现的作用体现在不必创建对象的前提下在不必创建对象的前提下就可以调用那个就可以调用那个方法方法.还有还有static常量常量!问题,实例变量和实例方法会共享吗?问题,实例变量和实例方法会共享吗?【例例3.7】非访问修饰符非访问修饰符Java程序程序设计设计与开与开发发2022-12-8abstract类和类和abstract方法方法 当一个类被声明为当一个类被声明为abstract时,这个类被称为是时,这个类被称为是抽象类抽象类。所。所谓抽象类就是谓抽
35、象类就是没有具体实例对象的类没有具体实例对象的类。例如,。例如,abstract class 如果将抽象类中的方法声明为如果将抽象类中的方法声明为abstract,这个方法即为,这个方法即为抽象抽象方法方法。抽象方法只含有一个。抽象方法只含有一个声明声明,没有方法体没有方法体。例如,。例如,abstract void display();abstract类不允许创建对象且类不允许创建对象且必须被继承必须被继承,抽象类允许方法拥,抽象类允许方法拥有方法体,有方法体,但抽象方法必须存在于抽象类中但抽象方法必须存在于抽象类中。例如,。例如,abstract class absClass abstra
36、ct void display();void printX()System.out.println(“This is an abstract class”);Java程序程序设计设计与开与开发发2022-12-8抽象类的例子抽象类的例子1)用户类(管理员用户类(管理员,VIP用户用户,普通用户普通用户,)2)形状类(点形状类(点,线线,圆圆,)3)工具类(轿车工具类(轿车,汽车汽车,火车火车,)4).【例例3.8】非访问修饰符非访问修饰符2 Java程序程序设计设计与开与开发发2022-12-8v非访问修饰符举例非访问修饰符举例程序运行结果程序运行结果?Java程序程序设计设计与开与开发发20
37、22-12-8final类类,final方法方法,final变量变量 如果一个如果一个类类被声明为被声明为final,则称,则称final类类,意味着,意味着它不能被继它不能被继承承。若用来修饰一个方法,则称若用来修饰一个方法,则称final方法方法,该方法不允许被覆盖,该方法不允许被覆盖!若用来修饰一个变量,则称若用来修饰一个变量,则称final变量变量,这种变量只能被赋值,这种变量只能被赋值一次。例如,一次。例如,final class finalClass final double PI=3.1415926;.问题问题,一个类能不能既被声明为,一个类能不能既被声明为abstract又被声
38、明为又被声明为final型?型?【例例3.9】非访问修饰符非访问修饰符3 Java程序程序设计设计与开与开发发2022-12-83.5 内部类和匿名内部类内部类和匿名内部类v定义在一个类的类体中的类被称为内部类。内部类有静态内定义在一个类的类体中的类被称为内部类。内部类有静态内部类和匿名内部类等形式,内部类具有以下特点:部类和匿名内部类等形式,内部类具有以下特点:内部类相当于外围类的成内部类相当于外围类的成员员,可以访问外围类的成员可以访问外围类的成员!Java程序程序设计设计与开与开发发2022-12-8v内部类更多的反映的是类内部类更多的反映的是类/对象之间的关系,对象之间的关系,一般用来
39、生成一般用来生成事件适配器,用于事件处理。其定义有三种方式:事件适配器,用于事件处理。其定义有三种方式:(1)是其它类的是其它类的成员成员;/(2)在一个语句块的内部定义在一个语句块的内部定义;/(3)在表达式内部匿名定义在表达式内部匿名定义;/匿名内部类匿名内部类注意,注意,a.若若内部类内部类被声明为被声明为static,就变成了顶层类,就变成了顶层类,不能再使用局不能再使用局部变量部变量.b.若想在内部类中声明任何若想在内部类中声明任何static成员,则该成员,则该内部类内部类必须声明必须声明为为static.【例例3.10】内部类及其创建内部类及其创建1 Java程序程序设计设计与开
40、与开发发2022-12-8v内部类应用举例内部类应用举例1在外围类方法中创建内在外围类方法中创建内部类对象部类对象.程序运行结果?程序运行结果?Java程序程序设计设计与开与开发发2022-12-8v内部类应用举例内部类应用举例2由外围类对象创建内部由外围类对象创建内部类对象类对象.程序运行结果?程序运行结果?v当一个类继承了内部类时,内部类的构造方法不会自动调用!如何完当一个类继承了内部类时,内部类的构造方法不会自动调用!如何完成子类对象创建?成子类对象创建?Java提供了提供了enclosingClassReference.super();来说明内部类与外部类对象引用之间的关联来说明内部类
41、与外部类对象引用之间的关联.Java程序程序设计设计与开与开发发2022-12-8v静态内部类静态内部类 public class outClass /public static class statInnerClass()/不可以访问外部类的实例变量不可以访问外部类的实例变量 class innerClass /可以访问外部类的实例变量可以访问外部类的实例变量 此时,与其他静态变量、静态方法一样与对象无关,此时,与其他静态变量、静态方法一样与对象无关,静态内静态内部类只可以访问外围类的静态变量和静态方法部类只可以访问外围类的静态变量和静态方法,而不能直接引,而不能直接引用定义在外围类中的实例
42、变量或者方法,但可以通过对象的引用定义在外围类中的实例变量或者方法,但可以通过对象的引用来使用它们。用来使用它们。Java程序程序设计设计与开与开发发2022-12-8v匿名内部类匿名内部类(anonymous inner-class)匿名类就是没有名字的内部类,将把继承类与实例化子类对匿名类就是没有名字的内部类,将把继承类与实例化子类对象在一个表达式里完成。其定义语法如下:象在一个表达式里完成。其定义语法如下:new 类或接口类或接口()/类的主体类的主体 这种形式的这种形式的new语句声明一个匿名内部类,它对一个给定的语句声明一个匿名内部类,它对一个给定的类进行扩展,或者实现一个给定的接口
43、;它还创建匿名内部类类进行扩展,或者实现一个给定的接口;它还创建匿名内部类的一个对象,并把这个对象作为的一个对象,并把这个对象作为new语句的返回值语句的返回值.v 匿名内部类有两种实现方式:匿名内部类有两种实现方式:第第1种,继承一个类,重写其方法种,继承一个类,重写其方法;第第2种,实现一个接口,实现其中的方法种,实现一个接口,实现其中的方法.下面举例说明之下面举例说明之.Java程序程序设计设计与开与开发发2022-12-8注意匿名内部类的定义注意匿名内部类的定义方式方式.程序运行结果?程序运行结果?Java程序程序设计设计与开与开发发2022-12-83.6 接口接口v接口接口类似抽象
44、类,只包含常量和方法的声明,而类似抽象类,只包含常量和方法的声明,而没有方法的没有方法的实现。实现。接口是由常量和抽象方法组成的特殊类,接口的定义包括接接口是由常量和抽象方法组成的特殊类,接口的定义包括接口声明和接口体。接口声明的格式如下:口声明和接口体。接口声明的格式如下:public interface interfaceNameextends listOfSuperInterface extends 子句与类声明的子句与类声明的extends子句基本相同,不同的是子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一一个接口可有多个父接口,用逗号隔开,而一个类只能有一
45、个父类。例如,个父类。例如,interface power boolean onoff=false;void on();void off();interface water_power extends power float waterline=139f;int adjust_waterline(float newvalue);接口中方法和变量各有什么特点接口中方法和变量各有什么特点?Java程序程序设计设计与开与开发发2022-12-8接口的实现接口的实现v在类的声明中用在类的声明中用implements子句来表示一个类实现某个接口子句来表示一个类实现某个接口.class powerMana
46、ger implements power void on()void off()v一个类可以实现多个接口,在一个类可以实现多个接口,在implements子句中用逗号分开子句中用逗号分开.class powerManager implements water_power,fire_power void on()void off()int adajust_waterline()v一个类实现某个接口,就必须一个类实现某个接口,就必须实现接口中声明的所有方法实现接口中声明的所有方法,包括继,包括继承的接口承的接口.interface fire_power extends power float ad
47、just_temperature(float newvalue);Java程序程序设计设计与开与开发发2022-12-8v接口的用处接口的用处1)通过接口实现通过接口实现不相关类不相关类的的相同行为相同行为,而无需考虑这些类,而无需考虑这些类之间的关系。之间的关系。2)通过接口指明多个类通过接口指明多个类需要实现需要实现的方法。的方法。3)通过接口了解对象的交互界面,而无需了解对象所对应通过接口了解对象的交互界面,而无需了解对象所对应的类。的类。与抽象类的比较与抽象类的比较v抽象类必须被继承,接口必须被实现抽象类必须被继承,接口必须被实现v抽象类允许方法的实现,而接口只有方法的声明没有抽象类允
48、许方法的实现,而接口只有方法的声明没有方法体方法体v类只有单根继承,而接口可以多重继承类只有单根继承,而接口可以多重继承v抽象类,接口可用作变量的类型。抽象类,接口可用作变量的类型。v抽象类的维护比接口要简单些抽象类的维护比接口要简单些抽象类可以赋予方法默抽象类可以赋予方法默认行为认行为.如果接口变动了?如果接口变动了?Java程序程序设计设计与开与开发发2022-12-8接口类型的使用接口类型的使用v作为一种引用类型来使用作为一种引用类型来使用v任何实现该接口的类的实例都可以存储在该接口类型任何实现该接口的类的实例都可以存储在该接口类型的变量中的变量中v通过这些变量可以访问类所实现的接口中的
49、方法通过这些变量可以访问类所实现的接口中的方法 下面举例说明下面举例说明.【例例3.11】接口应用接口应用 Java程序程序设计设计与开与开发发2022-12-8程序运行结果呢?程序运行结果呢?Java程序程序设计设计与开与开发发2022-12-8接口举例接口举例Java程序程序设计设计与开与开发发2022-12-8接口举例接口举例 Java程序程序设计设计与开与开发发2022-12-8一个类实现多个接口一个类实现多个接口Java程序程序设计设计与开与开发发2022-12-81.包及其作用包及其作用v包是一组相关类和接口的集合,通常称为包是一组相关类和接口的集合,通常称为“类库类库”,是一个,
50、是一个较为松散的集合。包提供了命名空间管理和访问保护,较为松散的集合。包提供了命名空间管理和访问保护,将实将实现某方面功能的一组类和接口组织在一起,形成包现某方面功能的一组类和接口组织在一起,形成包。vJava语言提供了一些系统级基本包,例如:语言提供了一些系统级基本包,例如:3.7 程序包程序包Java程序程序设计设计与开与开发发2022-12-82.自定义包自定义包v创建一个包的方法非常简单,只要将一个包的声明放在创建一个包的方法非常简单,只要将一个包的声明放在Java源程序的源程序的第一个语句第一个语句即可。其语法是:即可。其语法是:package book;package语句的作用范围