《Java程序设计开发教程【第4节--Java程序结构】.ppt》由会员分享,可在线阅读,更多相关《Java程序设计开发教程【第4节--Java程序结构】.ppt(85页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java语言是一种纯面向对象的程序设计语言,它的核心概念是类和对象,它的程序是基于类和对象建造的,程序中类的结构决定了程序的结构。这一章较深入系统地介绍Java程序的结构,介绍组成Java程序的类之间的关系。Java程序结构类层次结构 对象的使用与对象间通信 多态性 接口与包 访问控制与修饰符 类层次结构类层次结构继承的概念 继承的描述 类的继承规则 变量的隐藏 继承的概念继承的概念在日常生活中,我们常用“是一种(is-a)”关系来组织与表达知识,从而将知识组织成一种有层次、可分类的结构。面向对象程序设计方法将is-a关系引入到程序设计领域,用于描述类与类之间的关系,称之为继承继承。 多态性同
2、一运算或方法(如“+”)对不同类型的对象(如整型数,或字符串)有不同的语义解释。这种在程序中同一方法对不同类型的对象有不同解释的现象称为多态性多态性多态性与继承是密不可分的。通常,两类对象都有共同的父类,在父类中定义的方法在这两个子类中分别有不同的实现 超类与子类我们在声明类A时,指明类A继承了类B(类B是一个已定义了的类),则类A 通常就拥有了类B的成员变量和方法。此时,类B称为类A的直接超类超类(superclass),超类也称为父类或基类;类A称为类B的直接子类子类(subclass),子类也称为派生类 继承的描述继承的描述Java语言中,声明类首部的格式如下: 类的修饰符 class
3、类名 extends 超类名implement 接口名表其中“extends 超类名”部分就是用来描述继承的,这里超类名指明所声明类的直接超类 继承描述的演示继承描述的演示 class Car / 声明声明Car类类 int car_number; void set_number(int car_num) car_number = car_num; void show_number( ) System.out.println(我的车号是:我的车号是:+car_number); class TrashCar extends Car / 声明声明TrashCar类,它继承类,它继承Car类类 in
4、t capacipy; void set_capacity(int trash_car_capacipy) capacipy = trash_car_capacipy; void show_capacity( ) System.out.println(我的容量是:我的容量是:+capacipy+ ); 类的继承规则类的继承规则直接子类继承那些被声明为public 或protected的直接超类成员(包括成员变量和成员方法,下同)直接子类继承那些未被存取权限修饰符修饰的直接超类成员,只要该子类与该超类在同一个包中如果直接子类声明了一个与直接超类中的成员同名的成员,则该子类不继承该超类中的该同名成
5、员直接子类不继承被修饰为private的直接超类的成员 变量的隐藏变量的隐藏直接子类声明了一个与其直接超类的成员变量同名的成员变量,则称该超类的该成员变量在该直接子类中被隐藏隐藏,关键字this 和super分别用来指明直接子类和其直接超类中同名的成员变量 当超类的成员变量、子类的成员变量和类中方法使用的局部变量三者同名,或其中的两者同名时,可以使用关键字this和super来指定所要使用的变量 this和和super区别同名变量的演示区别同名变量的演示class A int x; / 类类A中声明了成员变量中声明了成员变量xclass B extends A / 类类B继承类继承类A,也继承
6、了类,也继承了类A的成员变量的成员变量xint x; / 类类B中又声明了成员变量中又声明了成员变量xvoid m( )int x; / 方法方法m声明了自己的局部变量声明了自己的局部变量xsuper.x = 2; / super.x是其所在类的父类即类是其所在类的父类即类A的的xthis.x = 1; / this.x 是其所在类即类是其所在类即类B的的xx = 100; / x是方法本身的局部变量是方法本身的局部变量x对象的使用与对象间通信对象的使用与对象间通信对象的创建 对象的使用 对象间的通信(消息)与实例方法的调用 对象的创建对象的创建Java中,类是某一类对象的共同特征(属性、行为
7、)的描述,即类中含有某一类对象具有哪些属性哪些属性、哪些哪些行为行为的信息。而由类创建的多个对象都具有类所定义的那些属性和行为。但是,由同一个类所创建的不同对象的同一个属性的值可能不同 对象的生命周期对象的生命周期 对象和现实生活中的事物一样,有它的产生、发展和消亡的过程,在Java中分别称之为对象的创建、使用和释放,这一过程称为对象的生命周期 定义一个学生类定义一个学生类 class Student / Student是学生类名是学生类名/ 定义成员变量定义成员变量private int sNumber; / 学号学号private String sName; / 姓名姓名private S
8、tring sClass; / 班号。以下是班号。以下是 定义成员方法定义成员方法void setSNumber(int xNumber) / 成员方法成员方法setSNumbersNumber = xNumber;int getSNumber( ) / 成员方法成员方法getSNumberreturn sNumber;void setSName(String xName) / 成员方法成员方法setSNamesName = xName;String getSName( ) / 成员方法成员方法getSNamereturn sName;void setSClass(String xClass)
9、 / 成员方法成员方法setSClasssClass = xClass;String getSClass( ); / 成员方法成员方法getSClassreturn sClass; 创建对象过程创建对象过程 对象的声明对象的实例化对象的初始化 对象的声明对象的声明对象声明的语法形式为: 类名 对象名;该语句从指定的类创建对象。 对象的实例化和初始化对象的实例化和初始化 必须给一个对象分配相应的存储空间,才能使用它。在声明一个对象时,并没有为该对象分配存储空间。对象的实例化完成对象的空间分配,对象实例化是通过new操作完成。构造方法的调用则确定了对象的初始状态,这一过程就是初始化 对象创建过程的
10、演示对象创建过程的演示class Course / Course是课程类名是课程类名/ 定义成员变量定义成员变量private int cNumber; / 课程编号课程编号private String cName;/ 课程名课程名private int cUnit; / 学分数学分数/ 定义成员方法定义成员方法void setCNumber(int xNumber) / 成员方法成员方法setCNumbercNumber = xNumber;int getCNumber( ) / 成员方法成员方法getCNumberreturn cNumber;void setCName(String xN
11、ame) / 成员方法成员方法setCNamecName = xName;String getCName( ) / 成员方法成员方法getCNamereturn cName;void setCUnit(int xUnit) / 成员方法成员方法setCUnitcUnit = xUnit;int getCUnit( ) / 成员方法成员方法getCUnitreturn cUnit;public class InitialDemo1public static void main(String args) Course cs1 = new Course( ); /声明一个声明一个Course对象对象
12、cs1System.out.println(cs1.getCNumber( );/输出初始值输出初始值cNumberSystem.out.println(cs1.getCName( ); /输出初始值输出初始值cNameSystem.out.println(cs1.getCUnit( ); /输出初始值输出初始值cUnit 演示对象的初始化演示对象的初始化 class Course / Course是类名是类名/ 定义成员变量定义成员变量int cNumber = 1; / 课程编号课程编号String cName = ”Wang”; / 课程名课程名int cUnit = 2; / 学分数学
13、分数public class InitialDemo2public static void main(String args) Course cs1 = new Course( ); /声明一个声明一个Course对象对象cs1 System.out.println(cs1.cNumber); /输出初始值输出初始值cNumber System.out.println(cs1.cName); /输出初始值输出初始值cName System.out.println(cs1.cUnit); /输出初始值输出初始值cUnit 演示使用构造方法进行初始化演示使用构造方法进行初始化 class Cour
14、se / Course是类名是类名 / 定义成员变量定义成员变量int cNumber = 1;String cName;int cUnit = 2;/构造方法构造方法Course( String Name, int Unit )cName = Name;cUnit = Unit;public class InitialDemo3public static void main(String args) Course cs1 = new Course(“Zhang”,6); /使用类中声明的构造方法使用类中声明的构造方法/声明一个声明一个Course对象对象cs1 System.out.prin
15、tln(cs1.cNumber); System.out.println(cs1.cName); System.out.println(cs1.cUnit); 演示由子类创建对象的过程演示由子类创建对象的过程 class Aint x = 1; int y = 1;A(int x1,int y1) x = x1; y = y1; class B extends Aint x = 2; float z; B(int xx,int yy)super(0,0);/子类的构造方法中先调用超类的构造方法,否则子类的构造方法中先调用超类的构造方法,否则Java调用默认的构造方法调用默认的构造方法A( )t
16、his.x = xx; this.y = yy; public class EtndsDemo public static void main(String args) B b1 = new B(1,2); System.out.println(b1.x); System.out.println(b1.y); System.out.println(b1.z); 对象的使用对象的使用引用对象的成员变量 调用对象的成员方法 对象作数组元素 对象作类的成员变量 引用对象的成员变量引用对象的成员变量引用对象成员变量的语法形式为: 对象名.成员变量名 ; 例:例:Rectangle类的声明类的声明 cl
17、ass Rectangle int width; int height; Rectangle( ) / Rectangle类的构造方法类的构造方法 width = 20;height = 30; 静态变量和实例变量静态变量和实例变量 类类 myclassint Var1 ;static int Var2 ;对象myobject1Var1Var2对象myobject2Var1Var2myobject1.Var2myobject2.Var2myobject1.Var1myobject2.Var1静态变量实例变量调用对象的成员方法调用对象的成员方法如前所述, 调用对象成员方法的语法形式为: 对象名.
18、 成员方法名(实际参数表);其中: 对象名对象名指定所使用的对象; 成员方法名成员方法名指定所要调用的成员方法; 实际参数表实际参数表由0个或多个表达式构成,表达式之间用逗号“,”分隔 调用对象方法参数传递过程演示调用对象方法参数传递过程演示class MethodDemo1/实现两个形式参数实现两个形式参数x、y的相加,其和以方法返回值的形式传回的相加,其和以方法返回值的形式传回float add(float x, float y) float z;z = x + y;return z;public class CallMethodDemo1public static void main(S
19、tring args) float result; methodDemo1 addCall = new methodDemo1( ); result = addCall.add (3,5); /调用对象调用对象addCall的的add方法,计算方法,计算3+5 System.out.println(result);/result的值为的值为3+5 说明实例说明实例本例中类MethodDemo1给出一个实现两float型数相加的方法。方法的参数x、y是参与加法的操作数,相加的结果存于局部变量z中,return语句指明z的值即是方法的返回值。类CallMethodDemo1的add对象调用了类Me
20、thodDemo1的方法add,实参为整型3和5 演示方法的一种用法演示方法的一种用法 class Fact float fact( int n) /定义计算定义计算n!的方法!的方法 int i;float x = 1;for(i = 1;in;i+)x = x*i;return x; public class MethodCallDemo2 public static void main (String args ) Fact x = new Fact( );System.out.println(x.fact(10);/计算计算10!System.out.println(x.fact(15
21、);/计算计算15! 演示静态方法的用法演示静态方法的用法 class Fact static float fact( int n) /将方法将方法fact声名为静态方法声名为静态方法 int i;float x = 1;for(i = 1;in;i+)x = x*i;return x; public class MethodCallDemo5 public static void main (String args ) System.out.println(Fact.fact(10);/直接用类名直接用类名.方法名调用静态方法方法名调用静态方法System.out.println(Fact.
22、fact(15); 演示数组作为方法的参数演示数组作为方法的参数Java中中数组是作为对象来处理的数组是作为对象来处理的 class methodDemo5float findMax(float arr )/形式参数形式参数arr 是数组是数组int i;float temp;temp = arr0;for(i = 1; itemp) temp = arri;return temp;public class MethodCallDemo6 public static void main (String args ) float max; float x = 1,2,3,4,5; methodD
23、emo5 y = new methodDemo5( ); max = y.findMax(x);/实参实参x是数组,数组调用的返回值为是数组,数组调用的返回值为5.0 System.out.println(max); 对象作数组元素对象作数组元素对象也可以作数组元素,当对象作数组元素时,其数组称为对象的数组。创建对象的数组时,首先对数组初始化,然后对数组的每个元素初始化 对象作数组元素用法的演示对象作数组元素用法的演示class nodeprivate int data;private node next; void setData(int x) data = x; int getData(
24、) return data; node getNext( ) return next; void setNext(node x) next = x; public class ObjAsArrayElementDemo public static void main (String args ) /创建创建3个结点个结点node x = new node3;/创建元素为创建元素为node型对象的数组并初始化数组型对象的数组并初始化数组int i;for(i = 0;ix.length;i+)/初始化数组元素初始化数组元素对象对象xi = new node( ); /给结点的给结点的data赋值
25、,并组成链表赋值,并组成链表for(i = 0;ix.length;i+)xi.setData(i);if(ix.length-1) xi.setNext(xi+1); /利用利用start依次输出链表各结点的值依次输出链表各结点的值node start = new node( ); start = x0;/指向链表的第指向链表的第1个结点个结点System.out.println(start.getData( );/输出输出x0.datawhile(start.getNext( )! = null)start = start.getNext( );/指向下一结点指向下一结点System.ou
26、t.println(start.getData( );/输出输出xi.data 对象作类的成员变量对象作类的成员变量class dateString yy;/年年String mm; /月月String dd; /日日date(String xyy, String xmm, String xdd)/ date构造方法构造方法yy = xyy; mm = xmm; dd = xdd;class Student private int idNumber, height;/学号、身高学号、身高 private char sex;/性别性别 date birthday; /出生日期出生日期birthd
27、ay是对象是对象/ Student构造方法构造方法 Student(int id, int h, char s, String xyy, String xmm, String xdd) idNumber = id; height = h; sex = s;/调用调用date构造方法构造方法birthday = new date(xyy, xmm, xdd); int getHeight( ) return height; int getSex( ) return sex; void show( ) /输出学号,身高,输出学号,身高, 性别,出生年份性别,出生年份System.out.print
28、ln( );System.out.print(/t+idNumber);System.out.print (/t+height);System.out.print (/t+sex);System.out.println(/t+birthday.yy); public class UseStudentpublic static void main(String args)throws java.io.IOExceptionint sum = 0;double ave; Student a = new Student 3;/创建对象的数组创建对象的数组,数组元素初始化数组元素初始化a0 = new
29、 Student(100001, 169, 女女,1976,06,12);a1 = new Student(100002, 155, 女女,1976,02,03);a2 = new Student(100003, 175, 男男,1976,05,25); /求平均身高求平均身高 for (int i = 0; ia.length; i+) sum = sum+a i.getHeight( ); ave = sum/3.0; /输出超过平均身高的女生学号与身高输出超过平均身高的女生学号与身高 System.out.println(超过平均身高的女生学号与身高为超过平均身高的女生学号与身高为);
30、for (int i = 0; i = ave) &(a i.getSex( ) = = 女女) a i.show( ); 对象间的通信(消息)与实例方对象间的通信(消息)与实例方法的调用法的调用消息是一个对象发送给另一对象的信息,用来驱动接受这一消息的对象的某个行为。消息由三部分组成:接受消息的对象、对象中描述某一行为的方法以及这一方法所需要的参数。这些问题包括对象作方法的参数、作方法的返回值、作数组元素以及作类的成员变量。 对象作方法的参数对象作方法的参数 当方法的参数时类类型时,方法的实参就是一个对象,这就是对象作方法的参数的情形。与基本数据类型的变量作方法参数的情形不同,在基本数据类型
31、的变量作方法参数的情形下,进行方法调用时的语义动作,是将实参的值传递给相应的形参。 对象作方法参数的演示对象作方法参数的演示class objPara/定义对象作为参数的类定义对象作为参数的类float temp;/用成员变量用成员变量temp传递参数值传递参数值class methodDemo4void add(float x, float y, objPara z) /对象对象z作为方法作为方法add的参数的参数z.temp = x+y;/方法体对对象方法体对对象z进行操作,可以改变进行操作,可以改变z的值的值void callAdd2(float m,float n)objPara k
32、= new objPara( );add( m,n,k); /向方法向方法add发消息,将参数发消息,将参数m,n的值分别传递给的值分别传递给x,y,并将并将k的的 /存储地址值传送给存储地址值传送给z,然后执行方法,然后执行方法add的方法体,计算的方法体,计算x+y, /计算结果通过计算结果通过k传回传回callAdd方法方法System.out.print(m+n+ = +k.temp);/ k.temp的值即为的值即为m+npublic class MethodCallDemo7 public static void main (String args ) objPara x = ne
33、w objPara( ); methodDemo4 y = new methodDemo4( ); System.out.println(x.temp);/x.temp值为值为0.0 y.add(1, 2, x);/调用对象调用对象y的的add方法,计算结果存于对象方法,计算结果存于对象x的的temp变量中变量中 System.out.println(x.temp);/x.temp值为值为3.0y.callAdd2(1,2);/输出输出1+2的结果的结果 对象作方法的返回值对象作方法的返回值 class nodeprivate int data;private node next; /成员变量
34、成员变量next是是node类型,而类型,而node是正在声明的类类型是正在声明的类类型 void setData(int x) data = x; int getData( ) return data; node getNext( )/此方法的返回值类型是类类型此方法的返回值类型是类类型 return next; void setNext(node x) next = x; public class ObjAsRetValDemo public static void main (String args ) /创建创建3个结点个结点node x1 = new node( ); node x2
35、 = new node( ); node x3 = new node( );/给结点的给结点的data赋值赋值 x1.setData(1); x2.setData(2); x3.setData(3);/把把3个结点组成链表个结点组成链表x1.setNext(x2); x2.setNext(x3);/利用利用start依次输出链表各结点的值依次输出链表各结点的值node start = new node( ); start = x1;/指向结点指向结点x1 System.out.println(start.getData( );/输出输出x1.datastart = start.getNext(
36、 );/指向下一结点指向下一结点x2 System.out.println(start.getData( );/输出输出x2.datastart = start.getNext( );/指向下一结点指向下一结点x3 System.out.println(start.getData( );/输出输出x3.data 多态性多态性方法的重构与重载 方法的动态调用 抽象类 多态性多态性多态性多态性,就是程序中同一操作在不同的环境中有不同语义解释的现象。和继承机制一样,多态性是面向对象方法的一大特色,它提供了使同一程序有很强的适应不同环境的能力的描述机制。 方法的重构与重载方法的重构与重载在直接子类中定
37、义的某个方法与其直接超类的某个方法有相同的名称和参数,则称该子类重构重构(Overriding)了该超类的该方法,重构也称为覆盖在同一个类中定义了多个同名的方法,它们或有不同的形参个数或有不同的形参类型,则称该方法被重载重载(Overloading)方法重构的演示方法重构的演示class Fathervoid speak( ) / 超类定义的超类定义的speak方法方法 System.out.println(I am Father!); class Son extends Father void speak( ) / 子类重构的子类重构的speak方法方法 System.out.println
38、(I am Son!); 方法重构的演示方法重构的演示class Father void speak( ) / 超类定义的超类定义的speak方法方法 System.out.println(I am Father!); class DemoThisSuper extends Fathervoid speak( ) / 子类重构的子类重构的speak方法方法 System.out.println(I am Son!); void demThisSuper( )super.speak( );/调用超类调用超类Father的的speak方法方法this.speak( ); /调用子类调用子类Demo
39、ThisSuper重构的重构的speak方法方法class MethodCallDemo4public static void main (String args ) Father x = new Father( );DemoThisSuper y = new DemoThisSuper( );x.speak( );/执行方法体执行方法体System.out.println(I am Father!);y. speak( );/执行方法体执行方法体System.out.println(I am Son!);y. demThisSuper( );/super.speak( )执行方法体执行方法体
40、System.out.println(I am Father!);/this.speak( )执行方法体执行方法体System.out.println(I am Son!); 演示方法的重载演示方法的重载 class Demoverloadint add(int x,int y)return x+y;double add(double x,double y)return x+y;class MethodCallDemo3public static void main (String args ) Demoverload x = new Demoverload( );int im = 1,in
41、= 2;double fm = 1.0,fn = 2.0;System.out.println(x.add(im,in);/调用时,匹配整型加方法调用时,匹配整型加方法int add(int x,int y)System.out.println(x.add(fm,fn);/调用时,匹配单精度型加调用时,匹配单精度型加方法方法 /double add(double x,double y) 方法重构的规定方法重构的规定 子类重构父类方法时,子类方法的返回类型应当与被重构方法的相同子类不能重构父类的final和private方法子类不能用实例方法去重构父类的static方法。子类的static方法可
42、重构父类的static方法,但不能重构父类的实例方法子类方法重构父类方法时,子类方法的访问权限修饰词不能严于父类方法的访问权限修饰词子类若要引用父类中的被重构方法,应使用“super方法名”的方式方法的动态调用方法的动态调用class Location/位置类位置类int x,y;/位置的坐标位置的坐标 Location(int locX, int locY) x = locX; y = locY; void show( ) System.out.print(+x+,+y+); class Point extends Location/点类点类 boolean visible; /可见性可见性
43、 Point(int pointX, int pointY, boolean trueOrFalse) super(pointX,pointY);/调用超类的构造方法调用超类的构造方法 visible = trueOrFalse; void moveTo(int newX, int newY)/方法方法-移动到新位置移动到新位置 x = newX; y = newY; class Circle extends Point/圆类圆类 int r ;/r存放半径存放半径 Circle(int centX, int centY, int radius,boolean tureOrFalse) sup
44、er(centX,centY,tureOrFalse); r = radius; void expand(int delta) r = r+delta; /方法方法-扩展扩展 void contract(int delta) r = rdelta; /方法方法-收缩收缩 void show( ) System.out.print(t圆心位于圆心位于); super.show( ); System.out.print(t半径为半径为+r); if (visible) System.out.println(t此圆发亮此圆发亮); else System.out.println(t此圆不发亮此圆不发
45、亮); class TestPointCircle public static void main(String args) Point p = new Point(200, 200, false); System.out.print(t点点p的位置是的位置是); p.show( ); /调用超类调用超类Location的的show方法方法 System.out.println( ); Circle c = new Circle(100,100,20,true); c.show( ); /调用调用Circle类的类的show方法方法 c.moveTo(300,400); c.expand(40
46、); c.show( ); 说明说明子类对象的引用可以赋给超类对象的引用;方法形参为某类对象时,可用其子类对象作实参。当子类对象引用赋给父类对象引用后,父类对象引用引用的是子类实例,用这个父类引用来引用子类实例成员(变量与方法)时只能引用与父类成员同名的那些成员。若成员变量出现隐藏,引用的是父类变量,若成员方法出现重构,引用的是子类的方法。 方法动态调用的演示方法动态调用的演示 class TwoDimension void show( ) class Point extends TwoDimension private int x, y; Point(int px, int py) x =
47、px; y = py; void show( )/重构了超类的重构了超类的show方法,输出点的位置方法,输出点的位置 System.out.println(点的位置是点的位置是(+x+,+y+); class Line extends TwoDimension private int x1, y1, x2, y2; Line(int px, int py, int qx, int qy) x1 = px; y1 = py; x2 = qx; y2 = qy; void show( )/重构了超类的方法,输出线段两端位置,方法体语句略重构了超类的方法,输出线段两端位置,方法体语句略 class
48、 Circle extends TwoDimension private int cX, cY, radius; Circle(int x, int y, int r) cX = x; cY = y; radius = r; void show( )/重构了超类的方法,输出圆心坐标及半径,方法体语句略重构了超类的方法,输出圆心坐标及半径,方法体语句略 class UseTwoDimension static void showParameter(TwoDimension plc) plc.show( ); public static void main(String args) Point p
49、 = new Point(10, 10); Line l = new Line(0, 20, 100, 20); Circle c = new Circle(100, 100, 50);/p,l,c均是均是TwoDimension类的子类类型,充当类的子类类型,充当showParameter方法的实参方法的实参/将子类对象引用赋给超类对象引用将子类对象引用赋给超类对象引用 showParameter( p );/执行执行p.show( ) showParameter( l );/执行执行l.show( ) showParameter( c );/执行执行c.show( ) 抽象类抽象类使用修饰
50、符abstract对类加以修饰,这个类就是抽象类抽象类(abstract class),抽象类不能被实例化。通常,抽象类中含有抽象方法,抽象方法是指只给出方法声明但没有方法体的方法。子类在继承抽象类时,必须必须重构其父类的抽象方法,给出具体的定义。 演示抽象类及其用法演示抽象类及其用法 abstract class Figure / 声明抽象类声明抽象类Figuredouble x,y; void set_size(double size1,double size2) x = size1;y = size2;/ 声明抽象方法声明抽象方法get_area,它没有方法体,它没有方法体abstrac