第四章类与对象-2-理解OOP编程思想掌握Java中创建类和对象的方法掌握Java的方法重载掌握包的创建和使用方法掌握Java访问修饰符的使用掌握静态变量、静态方法的使用掌握内部类的定义和使用目标-3-面向对象•面向对象概述:面向对象编程(OOP)是当前主流的程序设计范型,是一种编程语言模式,它已经取代了70年代早期的结构化、过程化程序设计开发技术面向对象编程的组织方式是围绕“对象”,而不是围绕“行为”;围绕数据,而非逻辑面向对象程序采用的观点是“一切都是对象”面向对象编程语言都提供面向对象模型的机制,这些机制就是:封装,继承和多态性-4-面向对象-1•封装封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联系。•封装的原则使对象以外的部分不能随意存取对象的内部数据,从而有效的避免了外部错误对它的“交叉感染”。数据隐藏特性提升了系统安全性,使软件错误能够局部化,减少查错和排错的难度。如:微波炉,将线路板(属性)封装在微波炉内部,使用者无法接触到,而通过面板按钮(方法)简单的操控线路板工作-5-面向对象-2•继承继承是软件重用的一种形式,它通过重用现有类的属性和方法,并增加新功能或修改现有功能来构建新的类。•多态多态是指在父类中定义的属性或方法被子类继承之后,可以具有不同的表现行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。如:“人”这个类抽象了这个群体的一般特性,“学生”和“老师”都具备“人”所定义的一般性,但其各自又有各自的特殊性,在保持了一般性和特殊性的情况下,作为一个新类而存在。如:动物会“叫”,“猫”和“鸟”都是动物的子类,但其“叫”声是不同的-6-面向对象-3•类类就是对象的模板,而对象就是类的一个实例。类由属性和方法构成:对象的特征在类中表示为成员变量,称为类的属性。类的方法是对象执行操作的一种规范。方法指定以何种方式操作对象的数据,是操作的实际实现。•Java中类声明格式类是Java的核心和本质,是Java语言的基础,类定义了一种新的数据类型。多个对象所共有的属性和方法需要组合成一个单元,称为“类”[access][modifiers]classclass_name{[attribute_declarations][constructor_declarations][method_declarations]}用于声明类、属性或方法的访问权限,具体可取public、protected、private或缺省。修饰符,可用的有abstract,static或final等,这些修饰符用于说明所定义的类有关方面的特性-7-面向对象-4•声明一个类定义一个长方形(Rectangle)类,有长、宽属性,对每个属性都提供相应的get/set方法。publicclassRectangle{/*长方形宽度*/privatedoublewidth;/*长方形高度*/privatedoublelength;/*成员变量对应的方法*/publicdoublegetWidth(){returnwidth;}publicvoidsetWidth(doublewidth){this.width=width;}publicdoublegetLength(){returnlength;}publicvoidsetLength(doublelength){this.length=length;}}-8-面向对象-5•类的构造方法构造方法是一种特殊的方法,在对象被创建时用来初始化对象。它具有和它所在的类完全一样的名字,构造方法和类的方法类似,只不过构造方法没有返回类型,构造方法的任务是初始化一个对象的内部状态。[access]class_name([argu_list]){语句;}-9-面向对象-6•类的构造方法实例在Rectangle类的基础上,基于width和length两属性来创建构造方法,代码如下所示:publicclassRectangle{privatedoublewidth;privatedoublelength;/*利用width和length创建构造方法*/publicRectangle(doublewidth,doublelength){this.width=width;this.length=length;}//省略……}如果在Java程序中没有定义任何的构造方法,则编译器将会自动加上一个不带任何参数的构造方法即缺省构造方法,该方法不存在于源程序中,但可以使用。-10-面向对象-7•类的方法方法是类行为的体现,其他对象可以根据类的方法对类进行访问。类的方法包括方法的说明和方法的实现两部分,格式如下所示[access][modifiers]return_typemethodName([argu_list]){}-11-面向对象-8•类的方法实例对Rectangle进行扩展,定义方法output()使用字符界面显示长方形的信息,代码如下所示:publicclassRectangle{//……省略变量定义及构造方法定义//……省略get和set方法/*输出长方形的长宽信息*/publicvoidoutput(){System.out.println(长方形的长为:+length);System.out.println(长方形的宽为:+width);}publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.println(请输入长方形的长:);doublelength=scanner.nextDouble();System.out.println(请输入长方形的宽:);doublewidth=scanner.nextDouble();//利用构造方法创建一个Rectangle类型的对象Rectanglerectangle=newRectangle(width,length);//调用output方法rectangle.output();}}执行结果如下:请输入长方形的长:3请输入长方形的宽:5长方形的长为:3.0长方形的宽为:5.0-12-面向对象-9•Overload在Java程序中,如果同一个类中存在两个方法同名,方法的签名(参数个数、参数类型、类型排列次序)上也一样,将无法编译通过。但在Java中多个方法重名是允许的,只要保证方法签名不同即可,这种特性称为方法重载(overload)。方法重载需遵循如下两条规则:方法名相同;参数列表(个数、类型、顺序)不同;注意返回值不影响方法重载。-13-对象•对象的创建当创建完一个类时,就创建了一种新的数据类型。可以使用这种类型来声明该种类型的对象。要获得一个类的对象一般需要两步:声明该类类型的一个变量。创建该对象(即在内存中为该对象分配地址空间),并把该对象的引用赋给声明好的变量。这是通过使用new运算符实现的。•创建Rectangle类的对象Rectanglerectangle=newRectangle(3,5);或Rectanglerectangle;rectangle=newRectangle(3,5);实例了类的对象后,可用点操作符“.”来实现对属性和方法的访问-14-对象-1•对象的实例对Rectangle进行扩展,增加area()方法用于计算长方形的面积,增加perimeter()方法用于计算长方形的周长,代码如下所示:publicclassRectangle{//……省略代码/*计算长方形的周长*/publicdoubleperimeter(){return2*(width+length);}/*计算长方形的面积*/publicdoublearea(){returnwidth*length;}publicstaticvoidmain(String[]args){//……省略代码//利用构造方法创建一个Rectangle类型的对象Rectanglerectangle=newRectangle(width,length);//……省略代码System.out.println(长方形的面积为:+rectangle.area());System.out.println(长方形的周长为:+rectangle.perimeter());}}执行结果如下:请输入长方形的长:3请输入长方形的宽:5//省略长方形的面积为:15.0长方形的周长为:16.0-15-对象-2•对象类型的方法参数在Java编程语言中,给方法传递参数的方式有两种:按值传递(callbyvalue),将要传递的参数的值传递给被调方法,被调方法通过创建一份新的内存拷贝来存储传递的值,然后在内存拷贝上进行数值操作,所以按值传递不会改变原始参数的值。通过具体实例来说明按值传递,代码如下所示:publicstaticvoidmain(String[]args){intnum=5;System.out.println(调用change方法前:+num);//创建一个CallByValue类型的对象CallByValuecallByValue=newCallByValue();callByValue.change(num);System.out.println(调用change方法后:+num);}/*定义change方法*/publicvoidchange(intnum){num+=5;System.out.println(在change中num的值为:+num);}在Java中,当传递基本数据类型的参数给方法时,它是按值传递的执行结果如下:调用change方法前:5在change中num的值为:10调用change方法后:5-16-对象-3引用传递(callbyvalue),将参数的引用(类似于C语言的内存指针)传递给被调方法,被调方法通过传递的引用值获取其指向的内存空间,从而在原始内存空间直接进行操作,这样将导致原始内存空间状态的修改。代码如下所示:classCallByRef{inta,b;CallByRef(inti,intj){a=i;b=j;}voidchange(CallByRefobj){obj.a=50;obj.b=40;System.out.println(在change方法中obj.a=+obj.a+,obj.b=+obj.b);}}publicclassTest{publicstaticvoidmain(String[]args){CallByRefobj=newCallByRef(15,20);System.out.println(调用change方法前obj.a=+obj.a+,obj.b=+obj.b);obj.change(obj);System.out.println(调用change方法后obj.a=+obj.a+,obj.b=+obj.b);}}执行结果如下:调用change方法前obj.a=15,obj.b=20在change方法中obj.a=50,obj.b=40调用change方法后obj.a=50,obj.b=40-17-类的组织•包Java允许使用包(package)将多个类组织在一起。借助于包可以方便的组织管理类,并将自定义的类与其它的类库分开管理。Java就是使用包来管理类库的。使用包维护类库比较简单,只要保证在同一个包下不存在同名的类即可。创建一个包也比较简单:只要将package命令作为一个Java源文件的第一句就可以,该文件中定义的任何类将属于指定的包。示例代码如下:packagemypackage;publicclassRectangle{......}-18-类的封装-1•包中类的访问一个类可以访问其所在包的所有类。对于其他包的类可