第5章创建类和方法2009-06-212回顾•面向对象的基本概念•四个概念三个原则•对象和类•类库•类的封装•类的多态•String类和StringBuffer类的应用3目标•实例和类的定义•定义方法和使用•应用程序传参•类的构造方法4Java类的定义类是组成Java程序的基本要素。它封装了一类对象的状态和方法,是这一类对象的原型。[类的修饰字]class类名称[extends父类名称][implements接口名称列表]{变量定义及初始化;方法定义及方法体;}类体,其中定义了该类中所有的变量和该类所支持的方法,称为成员变量和成员方法。5Java语言的类——类的修饰符类的修饰符访问控制修饰符抽象类修饰符最终类修饰符public缺省的访问修饰符[类的修饰符]class类名称[extends父类名称][implements接口名称列表]abstractfinal6Java语言的类——类名称•与Java的其他标识符一样,类名有如下设置:以字母、字符“-”或“$”开头只能含有大于十六进制00C0以上的Unicode字符不能使用与Java关键字相同的类名类名通常以大写字母开头,如果类名由多个单词组成,则每一个单词的开头字母也大写7Java语言的类——类体•类体中定义了该类所有的变量(属性)和该类所支持的方法。通常变量在方法前定义(并不一定要求),如下所示:类声明{成员变量定义;构造函数定义;成员方法定义;}8Java的类体——域的声明•域,也就是类的属性或变量。声明域的格式为•其中,[]内的内容为可选项,当初始值可能是一个表达式,也可能是一个对象。[域修饰符]类型变量[=初始值][,变量];9域的声明——变量•变量的声明格式:类型变量名[=初值];•变量的声明例子:byteb;intlength,width;doubled1=0.23,d2=56.7;//double是类型名,d1,d2是变量名,0.23和56.7是初值booleanmycom=true;charmyChar='b';[域修饰符]类型变量[=初始值][,变量];10域的声明——域修饰符[域修饰符]类型变量[=初始值][,变量];域的修饰符访问控制修饰符静态域修饰符其他修饰符publicstatictransient最终域修饰符final放在内存中的临时的变量。在网络传输时使用,节省资源默认的protectedprivate11Java的类体——方法的声明•方法声明了可以被调用的代码,传递固定数量的参数。方法声明的格式为:方法修饰符结果类型方法名([参数列表])throws子句{方法的体}finalvoidmove(intdx,intdy)throwsIOException{x+=dx;y+=dy;}例:12方法的声明——命名•Java中方法的命名包括方法名和参数列表两部分,方法名的命名规则与其他标示符规则一致•Java中允许相同方法名但参数列表不同的方法存在方法修饰符结果类型方法名([参数列表])throws子句{方法的体}classpointimplementsMove{intx,y;abstractvoidmove(intdx,intdy);voidmove(intdx,intdy){x+=dx;y+=dy;}}classpointimplementsMove{intx,y;abstractvoidmove(intdx);voidmove(intdx,intdy){x+=dx;y+=dy;}}13方法的声明——方法修饰符方法的修饰符访问控制修饰符静态方法修饰符publicprotectedprivatestatic最终方法修饰符final抽象方法修饰符abstract同步方法修饰符synchronized本地方法修饰符native表明这个方法不是用Java语言而是由一种本机语言编写的。默认的14方法的声明——方法的参数参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口),数据类型(数组、类或接口),参数传递方式是值传递。classA{staticvoidchange(inti){i=100;}publicstaticvoidmain(Stringargs[]){inti=10;change(i);System.out.println(i);}}运行结果:1015方法的声明——方法的体•方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。局部变量的作用域只在该方法内部。•如果方法提供实现,但是实现部分可以不要求任何可执行的代码,方法的体还是应该当作—个语句块写出,即“{}”。•如果方法被声明为void,那么,方法的体中就不能含有return语句。如果方法的声明中含有返回类型,则方法的体中必须含有return语句16main方法•main方法在Java应用程序中表示程序执行的起•main方法是Java应用程序中惟一与用户直接交换信息的方法,必须声明为publicstatic和void,不能返回往何值。它的定义格式如下:publicstaticvoidmain(Stringargs[]){方法体}17向方法传递参数classTest{inta,b;Test(inti,intj){a=i;b=j;}//可以在函数中改变对象状态voidchange(Testobj){obj.a=50;obj.b=40;}}当对象作为函数参数时,在函数中只能改变该对象的状态,但不能改变该对象的引用voidswapobj(Dayx,Dayy){Daytemp=y;y=x;x=temp;}引用本身按值传递Day2002,5,30Day2003,7,23obj1obj2xy调用swapobj(obj1,obj2)改变对象状态xyExceise\向方法传递参数18命令行参数•Java应用程序可以从命令行中接收任意数量的参数•每个参数被视为字符串分别存储在main函数的参数数组中•可以使用双引号将多个字符串作为一个整体显示classComndLineArg1{publicstaticvoidmain(Stringargs[]){for(inti=0;iargs.length;i++){System.out.println(args[i]);}}}输出结果输出结果19方法重载(overloading)•方法重载是Java实现面向对象的多态性机制的一种方式。•同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。•返回类型不同并不足以构成方法重载。•当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。20方法重载示例classCalculation{publicvoidadd(inta,intb){intc=a+b;System.out.println(两个整数相加得+c);}publicvoidadd(floata,floatb){floatc=a+b;System.out.println(两个浮点数相加得+c);}publicvoidadd(Stringa,Stringb){Stringc=a+b;System.out.println(两个字符串相加得+c);}}classCalculationDemo{publicstaticvoidmain(Stringargs[]){Calculationc=newCalculation();c.add(10,20);c.add(40.0F,35.65F);c.add(早上,好);}}编译器决定调用版本21Java的类体——构造函数•并非类的成员方法,而是一个用来创建对象的特殊方法,用来初始化对象的属性•构造器的名字与类名相同,所有的Java类都至少有一个构造器。例如,MyClass类的构造器为MyClass()classMyClass{publicintmyCount;publicMyClass(inti){myCount=i;}……}22构造函数方法•构造函数名称与类名称相同•构造函数没有返回类型•其任务是在创建对象时初始化其内部状态classFruit{booleanseedLess;booleanseasonal;floatprice;Fruit(booleanseed,booleanseason,floatp){seedLess=seed;seasonal=season;price=p;}}23重载构造函数•Java为每一个类自动提供缺省构造函数•缺省构造函数将成员变量的值初始化为缺省值•一旦创建了自己的构造函数,缺省的构造函数将不复存在。•重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。publicclassconstructOverload{intx;constructOverload(){x=0;System.out.println(不带参数的构造函数);}constructOverload(intx){this.x=x;System.out.println(带一个参数的构造函数);}}Exceise\构造方法重载24一个简单的类变量方法25总结•对象代表现实世界中的实体•类是对象的抽象,将对象的属性和行为抽象为类中的数据和方法。•类的定义•属性:变量(域)•方法:函数(构造函数)构造函数名称与类名称相同构造函数没有返回类型谢谢