第5讲使用类和对象编程(三)内部类实例程序控制结构选择语句目标•了解内部类的定义和使用•掌握定义简单内部类的方法•理解程序控制结构•根据程序需要设计合理的布尔表达式•运用分支语句实现选择结构的程序设计内部类•类可以嵌套定义,即在一个类的类体中,还可以嵌套定义另外一个类。被嵌套的类称为内部类(InnerClass),它的上级称为外部类。内部类中还可以再嵌套另一个类,在最外层的类被称为顶层类(Toplevelclass)。内部类的创建方法与外部类相似。实例代码3_7•使用内部类的原因:Innerclassmethodscanaccessthedatafromthescopeinwhichtheyaredefined—includingdatathatwouldotherwisebeprivate.Innerclassescanbehiddenfromotherclassesinthesamepackage.Anonymousinnerclassesarehandywhenyouwanttodefinecallbackswithoutwritingalotofcode.匿名内部类•有一种称为匿名内部类(anonymousinnerclass)的内部类,是指可以利用内部类创建不具名称的对象,并利用它访问类里的成员。匿名内部类的创建不同于普通的内部类的创建,不需要定义类名,直接用new创建对象。classOut{voidshow(){System.out.println(thisisOutshowing.);}}publicclassTestAnonymousInterClass{publicstaticvoidmain(Stringargs[]){TestAnonymousInterClasstest=newTestAnonymousInterClass();test.show();}//在这个方法中构造了一个匿名内部类privatevoidshow(){OutanonyInter=newOut(){//获取匿名内部类实例voidshow(){//重写父类的方法System.out.println(thisisAnonymousInterClassshowing.);}};anonyInter.show();//调用其方法}}实例一•已知圆半径,用面向对象的编程方法,计算圆面积。•分析:一切数据和操作被封装在对象中,可以将圆作为一个对象来处理。这里的数据就是圆的半径,操作即计算圆面积。•进一步分析:对象是类的实例化,因此需要创建一个类,属性就是半径。计算圆面积,需要获得圆的半径,而半径应该能够变化,这些操作是类的属性行为,操作在类中以方法的形式表示,因此需要在类中建立3个方法,分别用来读取半径、修改半径和计算面积。•类和方法的设计:Circle作为类名,数据为Radius,创建的3个方法:getRadius()、setRadius()和computeArea()。classCircle{privatedoubleradius;publicCircle(doubler){radius=r;}publicdoublegetRadius(){returnradius;}publicvoidsetRadius(doublenewRadius){radius=newRadius;}publicdoublecomputeArea(){returnradius*radius*3.14159;}实例一(续)publicclassEx3_10{publicstaticvoidmain(Stringargs[]){CriclemyCircle=newCircle(5.0);System.out.println(“thecircleradiusis:”+myCircle.getRadius()+”thecircleareais:”+myCircle.computeArea());myCirle.setRadius(myCircle.getRadius()*2.0);System.out.println(“thecircleradiusis:”+myCircle.getRadius()+”thecircleareais:”+myCircle.computeArea());}}实例一(续)实例代码Ex3_10程序分析:声明了类Circle,方法getRadius、setRadius和computeArea()分别用来读取、修改半径和计算圆面积。主方法中先通过自定义构造方法circle(doubler),实例化对象myCircle并对其成员变量进行初始化。第一行输出语句中,myCircle.getRadius()获得圆的初始化半径5.0,然后由此半径计算圆面积;下一行语句myCirle.setRadius(myCircle.getRadius()*2.01);修改了圆的半径为10.0,再据此半径计算新的圆面积。实例2•设计一个名为Fan的类模拟风扇,属性为speed、on、radius和color。假设风扇有3种固定的速度,用常数1、2、3表示慢、中、快速。写一个用户程序,程序中创建一个Fan对象,具有最大速度、半径为10、黄色、打开状态的属性。要求返回包含类中所有属性值的字符串。•分析:这个问题已经给了类名和属性名,我们需要设计的是如何获得和修改4个属性值,以及如何将4个属性转换为字符串。•变量、常量的定义•类的定义•对象的创建•方法的声明•实例变量(或方法)和静态变量(或方法)•方法重载和构造方法•内部类的定义*小结程序设计的三种基本结构•面向对象程序的主体是类及对象,对象是属性及方法的封装。•在设计一个对象的方法时,还要对具体的处理过程进行分析,并通过形式化的程序设计语言表示这个过程。从程序设计语言的宏观上看,处理过程呈现出顺序结构,从局部看,处理过程还要重复或者选择。Java提供了基本的程序控制语句处理这些结构。•这三种基本结构是“顺序结构”、“选择结构”、“循环结构”。图4-1基本控制结构示意图基本控制结构示意图选择结构•选择结构用于判断给定的条件是否满足(真或假),以决定执行某个分支程序段。Java有几种类型的选择结构语句:1、简单if语句;2、双分支if…else语句;3、嵌套if语句;4、if…elseif语句;5、多分支switch语句等。•简单if语句又称单分支if语句,它的格式如下:if(布尔表达式){语句组;}•程序执行流程图如图4-2所示。•执行过程是:如果布尔表达式值为真,则执行语句组,否则,不执行语句组。•【例4.1】判断一个整数是否能被3整除。简单if语句双分支if…else语句•if…else语句的格式如下:if(条件表达式){语句组1;}else{语句组2;}•程序执行流程如图4-3所示•从键盘输入一个正整数,判断其是奇数还是偶数if(ik){if(jk)System.ou.println(i和j大于k。);elseSystem.ou.println(i大于k,j小于或等于k。);}嵌套if语句•当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。•其一般形式可表示如下:if(表达式)if语句;或者为if(表达式)if语句;elseif语句;•嵌套可以一层一层展开,原则上没有深度的限制。但是,嵌套的层数不宜过多。如上例If…elseif语句•当有多个分支选择时,可采用if-else-if语句,其一般形式为:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;…elseif(表达式m)语句m;else语句n;•其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。switch语句•switch语句(又称开关语句)是和case语句一起使用的,其功能是根据某个表达式的值在多个case引导的多个分支语句中选择一个来执行。它的一般格式如下:switch(表达式){case判断值1:语句块1;[break;]case判断值2:语句块2;[break;]case判断值3:语句块3;[break;]……case判断值n:语句块n;[break;]default:语句块n+1}switch语句•switch后面括号中表达式的值必须是符合byte,char,short,int类型的常量表达式,而不能用浮点类型或long类型,也不能为一个字符串。•一个switch语句可以代替多个if—else语句组成的分支结构,而switch语句从思路上显得更清晰。•【例4.3】输入一个百分制成绩,输出相应等级,等级划分如下:100≥成绩≥90,等级为“优秀”89≥成绩≥80,等级为“良”79≥成绩≥70,等级为“中”69≥成绩≥60,等级为“及格”成绩≤60,等级为“不及格”作业与实验•作业习题3的10、11•实验Java基本数据类型简单编程