1、本章主要内容本章主要内容3.1 面向对象的基本概念3.2 类3.3 成员方法3.4 对象3.5 面向对象特性 3.6 接口3.7 包3.1面向对象的基本概念1、对象的基本概念 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。现实世界中的对象有两个共同特征:形态和行为。图图3.2 3.2 软件对象的变量和方法软件对象的变量和方法 2、类的基本概念 类用class作为它的关键字,例如我们要创建一个汽车类,则可表示为:用类创建对象实例化当我们要通过汽车类来创建一个轿车对象,并使用它的刹车行为方法时,则要用下面的格式进行实例化:/实例化汽车对象汽车轿车=new 汽车();/引用汽车
2、对象的刹车方法轿车.刹车();3.2类与对象类和对象是Java的核心和本质。它们是Java语言的基础,编写一个Java程序,在某种程度上来说就是定义类和创建对象。定义类和建立对象是Java编程的主要任务。3.2.1 定义类 1、类的一般形式 类由类声明和类体组成,而类体又由成员变量和成员方法组成(如图3.3所示):一个具体的类的形式 2、类声明 类声明由四部分组成:类修饰符、类关键字class、声明父类、实现接口,其一般形式如下:publicabstract|final class publicabstract|final class 类名类名 extends extends 父类名父类名 i
3、mplements implements 接口列表接口列表 各组成部分的具体说明(1)类修饰符public:这个public关键字声明了类可以在其他类中使用。缺省时,该类只能被同一个包中的其他类使用。abstract:声明这个类为抽象类,即这个类不能被实例化。final:声明该类不能被继承,即不能有子类。也就是说,不能用它通过扩展的办法来创建新类。(2)类的关键字class在类声明中,class是声明类的关键字,表示类声明的开始,类声明后面跟着类名,按习惯类名要用大写字母开头,并且类名不能用阿拉伯数字开头。给类名命名时,最好取一个容易识别且有意义的名字,避免A、B、C之类的类名。(3)声明父类
4、extends为声明该类的父类,这表明该类是其父类的子类。一个子类可以从它的父类继承变量和方法。extends只能实现单继承。创建子类格式:class subclass extends 父类名(4)实现接口在类声明中使用关键字implements实现接口,当要实现有多个接口时,各接口名以逗号分隔,其形式为:implements 接口1,接口2,,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。一个类可以实现多个接口,以某种程度实现“多继承”。3.2.2 成员变量和局部变量成员变量和局部变量 成员变量(在类体中定义,在整个类中都有效);局部变量(在方法中定义,
5、只在本方法中有效)。变量变量(1)成员变量 最简单的成员变量声明的形式为:类型成员变量名;类型成员变量名;(2)局部变量在方法中声明的变量以及方法中的参数称为局部变量。(3)如果局部变量名与成员变量名相同,则成员变量被屏蔽。成员变量与局部变量class Data int x=12,y=5;public void sum()int s;s=x+y;x x、y y是成员变量,是成员变量,类中所有方法都可类中所有方法都可以使用它们以使用它们s s是局部变量。是局部变量。仅限于在仅限于在sum()sum()方法内部使用。方法内部使用。如果局部变量名与成员变量名相同,则成员变量被屏蔽。class Dat
6、a int x=12,y=5;public void sum()int x=3;/局部变量x屏蔽了成员变量 int s;s=x+y;局部变量和成员变量的作用范围如图所示。其中x、y是成员变量,a、b是局部变量。3.3.3 3 成员方法成员方法 在Java中,必须通过方法才能完成对类和对象的属性操作。成员方法只能在类的内部声明并加以实现。一般在类体中声明成员变量之后再声明方法。3.3.1 方法的定义 1、方法的一般形式、方法的一般形式 返回类型 方法名(数据类型1 参数1,数据类型2 参数2,)(局部变量定义);(方法功能实现);return(返回值);(1)方法名()方法声明包括方法名、返回类
7、型和参数。(2)方法体 方法体是一对大括号“”之间的内容。2、方法的返回值、方法的返回值在方法定义中,方法的类型是该方法返回值的数在方法定义中,方法的类型是该方法返回值的数据类型。方法返回值是方法向外界输出的信息。据类型。方法返回值是方法向外界输出的信息。根据方法功能的要求,一个方法可以有返回值,根据方法功能的要求,一个方法可以有返回值,也可以无返回值(此时方法的类型为也可以无返回值(此时方法的类型为 void型)。方法的返回值一般在方法体中通过型)。方法的返回值一般在方法体中通过return语句返回。语句返回。return 语句的一般形式为:语句的一般形式为:return 表达式表达式;【例
8、3-1】有参方法实例。编写一个方法模块,实现计算1+2+3+n的n项和的功能。(见教材P60)1int mysum(int n)23int i,s=0;4for(i=1;i=n;i+)5s=s+i;6return s;7方法说明:第1行“int mysum(int n)”是方法声明,其中mysum是方法名,方法类型为int类型,表明该方法计算的结果为整型;括号中的“int n”表示n是形式参数,简称形参,其类型为int。形参n此时并没有值。第2行至第7行是方法体部分,用以实现求和的功能。第6行是通过“return s;”将求得的和值s返回作为mysum方法的值。3.3.2 方法的调用方法的调用
9、1、方法调用的语法形式方法调用的语法形式 方法调用的语句形式如下:方法调用的语句形式如下:函数名(实际参数函数名(实际参数1,实际参数实际参数2,实际参数实际参数n););也就是说,一个方法在被调用语句中,其参数称也就是说,一个方法在被调用语句中,其参数称为实际参数。实际参数简称为实参,方法调用中的为实际参数。实际参数简称为实参,方法调用中的实参不需要加数据类型,实参的个数、类型、顺序实参不需要加数据类型,实参的个数、类型、顺序要和方法定义时的形参一一对应。要和方法定义时的形参一一对应。【例例3-3】方法调用示例方法调用示例,计算计算1+2+3+100的和。的和。算法设计:我们在主函数中调用例
10、3-1中计算前n项和的方法模块,将调用函数时,将函数的参数(实参)设置为100。这时,函数mysum的形参n得到具体值100。从而计算1+2+3+100 的和。1.import javax.swing.*;2.public class Example3_33.4.public static void main(String args)5.6.float sum=mysum(100);7.JOptionPane.showMessageDialog(null,1+2+3+100=+s);8.System.exit(0);9.10.11.int mysum(int n)12.13.int i,s=0
11、;14.for(i=1;i=n;i+)15.s=s+i;16.return s;17.【例例3-4】具有多个参数的方法示例。已经三角具有多个参数的方法示例。已经三角形的底和高形的底和高,计算三角形面积。计算三角形面积。1.import javax.swing.*;2.public class Example3_43.4.public static void main(String args)5.6.float s=area(3,4);7.JOptionPane.showMessageDialog(null,三角形面积=+s);8.System.exit(0);9.10.11.static fl
12、oat area(int x,int h)12.13.float s;14.s=(x*h)/2;15.return s;16.17.2、方法调用的过程方法调用的过程以【例3-4】为例,当调用一个方法时,整个调用过程分为4步进行(如图3.8所示):第1步方法调用,并把实参的值传递给形参;第2步执行被调用方法area()的方法体,形参用所获得的数值进行运算;第3步通过return语句将被调用方法的运算结果输出给主调方法;第4步返回到主调方法的方法调用表达式位置,继续后续语句的执行。3、方法调用的传值过程方法调用的传值过程(1)主调方法为实参赋值,将实参值存放到内存中专门存放临时变量(又称动态局部变
13、量)的区域中。这块存储区域称为堆栈。(2)当参数传递时,主调方法把堆栈中的实参值复制一个备份给被调方法的形参。(3)被调方法使用形参进行功能运算。(4)被调方法把运算结果(方法返回值)存放到堆栈中,由主调方法取回。此时,形参所占用的存储空间被系统收回。注意,此时实参值占用的存储单元还在被继续使用。3.3.3 方法重载方法重载方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同,或者是参数的个数不同,或者是参数类型不同。返回类型不能用来区分重载的方法。【例3-5】见教材P64图3.8重载与调用关系 4.3.4 构造方法构造方法 构造方法是一个特殊的方法,主要用于初始化新创建的对象。构造
14、方法的方法名要求与类名相同,而且无返回值。在创建对象时,Java系统会自动调用构造方法为新对象初始化。另外,构造方法只能通过new运算符调用,用户不能直接调用。需要注意的是,我们在这里说构造方法无返回值,并不是要在构造方法名前加上void,构造方法名是不能有void的,如果在构造方法名前加了“void”,系统就不会自动调用该方法了。【例例3-6】计算长方体的体积。(见教材计算长方体的体积。(见教材P66)1./*构造长方体 */2.class Box3.4.double width,height,depth;5.Box()6.7.width=10;8.height=10;9.depth=10;
15、10.11.double volume()12.13.return width*height*depth;14.15.Box类的构造方类的构造方法,与类同名法,与类同名普通方法,计算普通方法,计算长方体体积长方体体积16.public class Example3_617.18.public static void main(String args)19.20.Box box=new Box();21.double v;22.v=box.volume();23.System.out.println(长方体体积为:+v);24.25.在一个类的程序中,也可以没有定义构造方法,则在一个类的程序中,
16、也可以没有定义构造方法,则Java系统会认为是定义了一个缺省构造方法,缺省构系统会认为是定义了一个缺省构造方法,缺省构造方法是无任何内容的空方法。当编写类的时候,只有造方法是无任何内容的空方法。当编写类的时候,只有在需要进行一些特别的初始化的场合,才需要定义构造在需要进行一些特别的初始化的场合,才需要定义构造方法。方法。【例例3-7】使用缺省构造方法设计一个计算长方体体积的程序。使用缺省构造方法设计一个计算长方体体积的程序。1./*缺省构造方法构造长方体类 */2.class Box3.4.double width,height,depth;5.double volume()/计算长方体体积
17、6.7.width=10;8.height=10;9.depth=10;10.return width*height*depth;11.12.该类没有定义该类没有定义构造方法构造方法13.public class Example3_714.15.public static void main(String args)16.17.Box box=new Box();18.double v;19.v=box.volume();20.System.out.println(长方体体积为:+v);21.22.应用缺省构造方法应用缺省构造方法创建实例对象创建实例对象3.4 对象对象类是一个抽象的概念,而对
18、象是类的具体化。类通过实例化生成对象。一个对象的生命周期包括三个阶段:创建、使用和释放。1、对象的创建创建对象的一般格式为:类名类名 对象名对象名=new new 类名类名(参数列表参数列表););(1)对象声明:类名类名 对象名;对象名;(2)实例化:对象名=new 构造方法();2 2、对象的使用对象的使用 类是不能直接使用的,我们只能类实例化后的对象。而对象的使用是通过访问对象变量或调用对象方法。通过运算符“.”可以实现对对象的变量访问和方法的调用。(1)访问对象的变量访问对象的变量 访问格式:访问格式:对象名对象名.成员变量;成员变量;例如,设有一个A类其结构如下:class A in
19、t x;对变量x赋值,先创建并实例化类A的对象a,然后再通过对象给变量x:A a=new A();a.x=5;(2 2)调用对象的方法调用对象的方法 调用格式:对象名对象名.方法名方法名(参数列表参数列表););【例3-8】用带参数的成员方法计算长方体的体积。【例3-9】用对象作为方法的参数计算圆柱体的体积。3.3.5 5 面向对象特性面向对象特性java语言中有三个典型的面向对象的特性:封装性、继承性和多态性。关于继承性【例3-10】创建一个A类和它的子类B类,我们通过子类B的实例对象调用从父类A继承的方法。(教材P72)super关键字关键字java中通过关键字super来实现对父类成员的
20、访问,super用来引用当前对象的父类。Super 的使用有三种情况:(1)访问父类被隐藏的成员变量或方法,如:super.variable;(2)调用父类中被重写的方法,如:super.Method(paramlist);(3)调用父类的构造方法。由于子类不继承父类的构造方法,当要在子类中使用父类的构造方法时,则可以使用super来表示,并且super必须是子类构造方法中的第一条语句。this 关键字关键字 this 是Java的一个关键字,表示某个对象。this可以用于构造方法和实例方法中,但不可以用于类方法中(用static修饰的方法)。(1)this用于构造方法中时,代表调用该构造方法
21、所创建的对象。(2)this用于实例方法中时,代表调用该方法的当前对象。this的使用格式为:this.当前类的成员方法();当前类的成员方法();或 this.当前类的成员变量;当前类的成员变量;3.3.6 6 接口接口3.6.1接口的定义接口的定义接口是抽象类的一种,只包含常量和方法的定接口是抽象类的一种,只包含常量和方法的定义,而没有变量和具体方法的实现,且其方法都是义,而没有变量和具体方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面:抽象方法。它的用处体现在下面几个方面:(1)通过接口实现不相关类的相同行为)通过接口实现不相关类的相同行为,而无需考而无需考虑这些类之间的关系
22、。虑这些类之间的关系。(2)通过接口指明多个类需要实现的方法。)通过接口指明多个类需要实现的方法。(3)通过接口了解对象的交互界面)通过接口了解对象的交互界面,而无需了解对而无需了解对象所对应的类。象所对应的类。1 1、接口的定义接口的定义接 口 的 定 义 包 括 接 口 声 明 和 接 口 体。接口定义的格式如下:public interface public interface 接口名接口名 extends extends 父接口名父接口名 /接口体接口体 2 2、接口的实现接口的实现 在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且
23、必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。3.3.7 7包包 在在Java语言中,每个类都会生成一个字节码文语言中,每个类都会生成一个字节码文件,该字节码文件名与类名相同。这样,可能会发件,该字节码文件名与类名相同。这样,可能会发生同名类的冲突。为了解决这个问题,生同名类的冲突。为了解决这个问题,Java采用包采用包来管理类名空间。来管理类名空间。3.7.1 创建自己的包创建自己的包1、包的定义、包的定义把一个源程序归入到某个包的方法用package来实现。package语句的一般形式为:package 包名;包名;2、包的引用、包的引用 i
24、mport 包名包名.类名;类名;Import语句语句 Import java.io.*;Import java.applet.*;【例【例3-18】创建一个自己的包。创建一个自己的包。Import abc.test.*;public class MyTestpublic static void main(String args)MyTest mt=new MyTest();mt.print();Package abc.test;public class MyTest public void print()System.out.println(package test);(1)在当前目录建立子
25、目录:abctest(2)把MyTest.java保存到abctest目录下MyTest.java保存保存在当前目录在当前目录3.7.2 压缩文件1、将类压缩为jar文件在Java提供的工具集bin目录下有一个jar.exe文件,它可以把多个类的字节码文件打包压缩成一个jar文件,然后将这个jar文件存放到Java运行环境的扩展框架中,即将该jar文件存放在JDK安装目录的jrelibext下,这样,其他的程序就可以使用这个jar文件中的类来创建对象了。例:设有Test1.class和Test2.class,我们要将它们压缩成一个jar文件Test.jar。(1)编写Manifest.mf清单
26、文件Mainfest Version:Main-Class:Test1 Test2(注意Main-Class:与后面的类名之间要有一个空格,且最后一行要回车换行)。将其保存为Manifest.mf。(2)生成jar文件jar cfm Test.jar Manifest.mf Test1.class Test2.class其中参数c表示要生成一个新的jar文件,f表示要生成的jar文件的文件名,m表示清单文件的文件名。2、将应用程序压缩为jar文件 我们还可以用jar.exe将应用程序生成可执行文件。在Windows环境下,我们可用鼠标双击该文件,就可以运行该应用程序。其生成jar文件的步骤与前面生成类的jar文件相同。当要压缩多个类时,我们在清单文件中只要写出主类的类名,设有主类A.class,则:Mainfest Version:Main-Class:A生成jar文件时,也可以使用通配“*.class”。jar cfm Test.jar Manifest.mf*.class