面向对象特征_第1页
面向对象特征_第2页
面向对象特征_第3页
面向对象特征_第4页
面向对象特征_第5页
已阅读5页,还剩174页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象特征第三章面向对象特征基本概念Java中类的定义对象类的继承和多态接口常用工具类第2页,共179页,2024年2月25日,星期天基本概念什么是编程语言?人和计算机进行交流的工具和手段编程语言的发展第一代语言:机器语言:0101001第二代语言:汇编语言:mov,push,add,call第三代语言:高级语言,以C语言为代表,过程化编程语言(ProceduralProgrammingLanguage)

特点:程序=算法+数据结构第四代语言:非过程化/面向对象的编程语言语言的发展:抽象的过程第3页,共179页,2024年2月25日,星期天基本概念过程化编程模式数据和函数(过程)是分开的,即开发人员看到的是函数或过程的集合以及一批单独的数据处理过程:参数输入函数/过程代码结果输出编程模式:函数1函数2函数3数据1数据2数据3数据4数据5……缺点:牵一发而动全身第4页,共179页,2024年2月25日,星期天基本概念面向对象编程模式程序被看作是相互协作的对象集合第5页,共179页,2024年2月25日,星期天面向对象(ObjectOriented-OO)面向对象的思想将客观事物看作具有状态和行为的对象,通过抽象找出同一类对象的共同状态和行为,构成类。第一个面向对象的语言:Simula-67(80年代初)第一个成功的面向对象编程语言:SmalltalkC++(1986年),JAVA(1995年),C#,PERL等用客观世界中描述事物的方法来描述程序中要解决的问题万事万物都是对象程序便是成堆的对象,彼此通过消息的传递,请求其他对象进行工作基本概念第6页,共179页,2024年2月25日,星期天五个基本概念对象类封装性继承性多态性基本概念第7页,共179页,2024年2月25日,星期天对象(object)everythingisanobject.现实世界的对象:桌子、书、自行车、电视、狗、文件、表格、按钮、窗口对象包含两个特性状态:指对象本身的信息(内部信息/内部变量)行为:实现对信息的访问/对象的操作一辆自行车的状态(型号:凤凰26、颜色:黑、速度:0,挡数:5),行为(刹车、加速、减速和换挡)一只圆的状态(名字:myCircle,半径:3.0,圆心(1.0,1.0)

等),行为(求周长、求面积、判断给定的一点是否在圆内等)一个程序窗口的状态(名称:MyWindow,大小:640×480,位置:(0,0),颜色:灰等),行为(关闭、打开、最小化、最大化,调整大小,移动等)基本概念第8页,共179页,2024年2月25日,星期天对象两个特性的表示方法:状态

变量(variables)

行为

方法(method)对象就是变量和相关方法的软件集合一个对象可以由其他对象组合而成,窗口(按钮,菜单条,文本框,状态栏等)程序就是对象的集合,对象之间相互交互和通信完成任务搭积木一个程序就是一堆对象的集合,这些对象之间通过发布消息进行交互。基本概念第9页,共179页,2024年2月25日,星期天类(class)现实世界中,存在很多同类的对象,很多桌子、书、自行车,把每一类对象共有的状态和行为进行抽象,形成对象的一个模板,这就是类。类是构造对象的模板或蓝图。就像建筑物与设计图纸的关系一样,通过一份设计图纸,可以建造出很多建筑物。表格(类)填入不同的个人信息

不同的对象对象是某个类的一个实例,类是许多对象的一个抽象编写程序时,实际上是在编写类代码,对象只有程序运行时才存在。基本概念第10页,共179页,2024年2月25日,星期天基本概念抽象性

把众多的事物进行归纳、分类是人们在认识客观世界时经常采用的思维方法,“物以类聚,人以群分”就是分类的意思,分类所依据的原则是抽象。抽象(Abstract)就是忽略事物中与当前目标无关的非本质特征,更充分地注意与当前目标有关的本质特征。从而找出事物的共性,并把具有共性的事物划为一类,得到一个抽象的概念。第11页,共179页,2024年2月25日,星期天4.封装性封装就是把对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。封装有两个含义:一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位。对象的属性值(除了公有的属性值)只能由这个对象的行为来读取和修改;二是尽可能隐蔽对象的内部细节,对外形成一道屏障,与外部的联系只能通过外部接口实现。好处对象本身的数据得到保护/隐藏其它对象仅仅需要知道对该对象的访问方法(接口/interface)即可使用模块化--每个对象的源文件可以是相互独立的,可以被不同的程序调用,每个对象是一块积木,可以搭建不同的形状可重用性例子电脑的DIY喷墨打印机,硒鼓坏/彩色硒鼓基本概念第12页,共179页,2024年2月25日,星期天5.继承性为什么会有继承?建立一个类后,发现另一个新的类有相同的特性,两个选择:(1)重新定义一个新的类;(2)在已有类的基础上修改(加加/减减)新的对象类由继承原有对象类的某些特性或全部特性而产生出来,原有对象类称为基类(或超类、父类),新的对象类称为派生类(或子类),派生类可以直接继承基类的共性,又允许派生类发展自己的个性。继承性简化了对新的对象类的设计。树型结构(层次化结构)根(基类)基本概念第13页,共179页,2024年2月25日,星期天5.继承性运输工具航空运输工具陆地运输工具水上运输工具人力驱动引擎驱动二轮四轮客运货运基本概念第14页,共179页,2024年2月25日,星期天6.多态性多态性是指不同类型的对象可以对相同的激励做出适当的不同响应的能力。多态性丰富了对象的内容,扩大了对象的适应性,改变了对象单一继承的关系。表现在继承中方法的重写子类从父类继承(extends扩展)而来多个子类同属一个父类,所有子类有相同的父类继承父类的方法在不同的子类中有不同的表现形式表现在用一个类中方法的重载基本概念第15页,共179页,2024年2月25日,星期天6.多态性多态性在继承中的表现基本概念第16页,共179页,2024年2月25日,星期天第三章面向对象特征基本概念Java中类的定义对象类的继承和多态接口常用工具类第17页,共179页,2024年2月25日,星期天程序是对象的集合,而对象是类的实例化源程序就是一个个的Java类类有两种:(1)Java本身提供的类(核心API)见Java文档中描述程序员可以对其进行调用j2sdk1.5.0_06\jre\lib\rt.jar(32.1MB)(2)程序员自己定义的类Java中类的定义第18页,共179页,2024年2月25日,星期天Java中类的定义最简单的类class类名{//类中的代码}例如:classStudent{ Stringsname;//姓名

intsage;//年龄

Stringsclass;//班级}用Student类创建对象:Studenttom=newStudent();第19页,共179页,2024年2月25日,星期天publicclassStudentExample{ publicstaticvoidmain(Stringargs[]){ Studenttom=newStudent(); Studentjerry=newStudent();

tom.sage=21;

tom.sname="Tom";

tom.sclass="97402";

jerry.sage=23;

jerry.sname="Jerry";

jerry.sclass="97403"; System.out.println("sname="+tom.sname+",sage="+tom.sage+",sclass="+tom.sclass); System.out.println("sname="+jerry.sname+",sage="+jerry.sage+",sclass="+jerry.sclass); }}第20页,共179页,2024年2月25日,星期天类的基本定义格式[类的修饰符]class

类名{

类型 成员变量1;

类型 成员变量2;

类型 成员方法1(参数1,[参数2,…]){

方法体; }

类型 成员方法2(参数1,[参数2,…]){

方法体; }

…}Java中类的定义第21页,共179页,2024年2月25日,星期天Java中类的定义classCircle{doubler;publicvoidsetR(doubler1){ r=r1; }publicdoublecircumference(){ returnMath.PI*2*r;}publicdoublearea(){ returnMath.PI*r*r;}}publicclassCalCircle{ publicstaticvoidmain(String[]args){ Circlec=newCircle(); c.setR(10.0); System.out.println("圆的面积是"+c.area()); System.out.println("圆的周长是"+c.circumference()); } }第22页,共179页,2024年2月25日,星期天在实际项目开发中,往往需要开发很多不同的类,能否方便高效地组织这些类,对项目的开发与使用具有很重要的意义。Java中提供包(Package)将不同类组织起来进行管理,借助于包可以方便地组织自己的类代码,并将自己的代码与别人提供的代码库分开管理。使用包的目的之一就是可以在同一个项目中使用名称相同的类,假如两个开发人员不约而同地建立了两个相同名字的类,只要将其放置在不同的包中,就不会产生冲突。包(package)第23页,共179页,2024年2月25日,星期天包(package)包的命名每个包的名称必须是“独一无二”的例如:java.langjava.utilmypackage.imageJava中包名使用小写字母表示命名方式建议把大的组织名称写到前面,逐渐缩小范围例如:云南省所有大学生合作来编写某大型程序:ynu.sise.cs.cs2002.zhangsanynu.sise.cs.cs2003.lisi第24页,共179页,2024年2月25日,星期天包(package)包的声明命名的包(NamedPackages)例如:

packagemypackage.graphic;package语句必须放在源文件的最前面,其之前不可以有其他任何语句。每个源文件中最多有一句package语句,因为一个类不可能属于两个包,就如同不能把一件衣服同时放进两个箱子一样。默认包(未命名的包)不含有包声明的编译单元是默认包的一部分包与目录Java使用文件系统来存储包和类包名就是文件夹名,即目录名目录名并不一定是包名用javac编译源程序时,如遇到当前目录(包)中没有声明的类,就会以环境变量classpath为相对查找路径,按照包名的结构来查找。因此,要指定搜寻包的路径,需设置环境变量classpath第25页,共179页,2024年2月25日,星期天包(package)引入包为了使用其它包中所提供的类,需要使用import语句引入所需要的类Java编译器为所有程序自动引入包java.langimport语句的格式

importpackage1[.package2…].(classname|*);其中package1[.package2…]表明包的层次,它对应于文件目录classname则指明所要引入的类名如果要引入一个包中的所有类,则可以使用星号(*)来代替类名第26页,共179页,2024年2月25日,星期天包(package)//Circle.javapackagemypackage.graphic;publicclassCircle{doubler;publicvoidsetR(doubler1){ r=r1; }publicdoublecircumference(){ returnMath.PI*2*r;}publicdoublearea(){ returnMath.PI*r*r;}}//CalCircle.javaimportmypackage.graphic.Circle;publicclassCalCircle{ publicstaticvoidmain(String[]args){

Circlec=newCircle(); c.setR(10.0); System.out.println("圆的面积是"+c.area()); System.out.println("圆的周长是"+c.circumference()); } }第27页,共179页,2024年2月25日,星期天如何防止名字冲突//myGraphics.CirclepackagemyGraphics; publicclassCircle{doubler;}//yourGraphics.CirclepackageyourGraphics;publicclassCircle{doubler;}包(package)importmyGraphics.*;importyourGraphics.*;publicclassTest{ publicstaticvoidmain(Stringargs[]){

Circlec=newCircle(); //那个Circle?

}}importmyGraphics.*;importyourGraphics.*;publicclassTest{ publicstaticvoidmain(Stringargs[]){ //Circlec=newCircle();

myGraphics.Circlec1=newmyGraphics.Circle();

yourGraphics.Circlec2=newyourGraphics.Circle();}}第28页,共179页,2024年2月25日,星期天类的定义格式[类的修饰符]class

类名{

}类的访问权限修饰符public:公共类,可以被其他类所访(无任何限制)无修饰/默认说明:仅能被同一个包中的其他类访问在同一个.java文件中,只能有一个public修饰的类,这个类一般为主类(包含main方法的类)。Java中类的描述第29页,共179页,2024年2月25日,星期天一个简单的类publicclassStudent{ Stringname,stuNumber; doublescore1,score2,score3; voidsetName(Strings1){ name=s1; } voidsetStuNumber(Strings2){ stuNumber=s2; } voidsetScore(doubled1,doubled2,doubled3){ doubled; score1=d1; score2=d2; score3=d3; }doublegetAverage(){return(d1+d2+d3)/3;}}Java中类的描述第30页,共179页,2024年2月25日,星期天对象具有状态和行为成员变量定义[访问权限修饰符]类型变量名;[访问权限修饰符]类型变量名[=初值];[访问权限修饰符]类型变量名[=初值][,变量名[= 初值]…];成员方法定义[访问权限修饰符]方法返回类型方法名(){

方法体;}类型:基本类型,复合类型(数组、类和接口)类成员-变量和方法第31页,共179页,2024年2月25日,星期天访问控制修饰符公共访问控制符-public被所有类访问(相当于公共设施,人人能用)默认访问控制符被同一包中其他类访问(包外的子类访问不到)(相当于某个工作单位设施,只能本单位的人能用,子女不能用)私有访问控制符-private只能被该类自身访问(相当于私人物品,只有自己能用)保护访问控制符-protected该类自身、同一个包中的其他类、其他包中的子类访问(相当于家庭物品,家里人能用,外人不能用)类成员方法的访问第32页,共179页,2024年2月25日,星期天public(公共变量/公共方法)容许全权访问,无任何限制(先构造对象,再访问)//Circle.javapublicclassCircle{publicdoubleradius;

publicdoublecircumference(){return2*Math.PI*radius;}}//CircumferenceTester.javapublicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();

c1.radius=50;//可以直接访问

Circlec2=newCircle();

c2.radius=10;//可以直接访问

doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}类成员方法的访问第33页,共179页,2024年2月25日,星期天private(私有变量/私有方法)仅能在其所定义的类中被访问(先构造对象,再访问)//Circle.javapublicclassCircle{privatedoubleradius;publicdoublecircumference(){return2*Math.PI*radius;}}//CircumferenceTester.javapublicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();

c1.radius=50;

Circlec2=newCircle();

c2.radius=10;

doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}类成员方法的访问第34页,共179页,2024年2月25日,星期天类成员方法的访问编译时会提示出错在编译语句“c1.radius=50;”及“c2.radius=10;”时会提示存在语法错误“radiushasprivateaccessinCircle”说明由于在Circle类声明中变量radius被声明为private,因此在其它类中不能直接对radius进行存取如果要允许其它类访问radius的值,就需要在Circle类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法第35页,共179页,2024年2月25日,星期天类成员方法的访问get方法功能是取得属性变量的值get方法名以“get”开头,后面是实例变量的名字一般具有以下格式:public<fieldType>get<FieldName>(){return<fieldName>;}对于实例变量radius,声明其get方法如下:publicdoublegetRadius(){returnradius;}第36页,共179页,2024年2月25日,星期天类成员方法的访问set方法功能是修改属性变量的值set方法名以“set”开头,后面是实例变量的名字一般具有以下格式publicvoidset<FieldName>(<fieldType><paramName>){<fieldName>=<paramName>;}声明实例变量radius的set方法如下:publicvoidsetRadius(doubler){

if(r>=0)radius=r;elseSystem.out.println(“半径输入错误”);}第37页,共179页,2024年2月25日,星期天//Circle.javapublicclassCircle{privateintradius;publicvoidsetRadius(doubler){

if(r>=0)radius=r;elseSystem.out.println(“半径输入错误”);}publicdoublegetRadius(){returnradius;}publicdoublecircumference(){return2*3.14*radius;}}//CircumferenceTester.javapublicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();c1.setRadius(50);Circlec2=newCircle();c2.setRadius(10);doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}第38页,共179页,2024年2月25日,星期天无修饰(友好变量/友好方法)容许与此成员所属类在同一个包中所有类访问也就是说,对于同一个包中的类,无修饰类型相当于public,而对于包外的类则相当于private例子:试把前面的Circle.java中的求面积,求周长的方法的访问权限改为无修饰类型类成员方法的访问第39页,共179页,2024年2月25日,星期天protected(保护变量/保护方法)容许同一个包中所有类以及子类(有一定限制)访问(先构造对象,再访问)其实就是在无修饰类型访问权限的基础上再增加子类例子:略,讲继承时补充类成员方法的访问第40页,共179页,2024年2月25日,星期天类成员方法的访问类属性与方法public默认

publicAB

protectedB+CB默认BB

privateDD访问控制修饰符归纳第41页,共179页,2024年2月25日,星期天非访问控制修符静态成员修饰符static静态方法:属于类的方法静态变量:属于类的变量最终成员修饰符final最终方法:不能被子类重新定义的方法最终变量:值不能修改的变量抽象方法修饰符abstract抽象方法:只有方法说明,没有具体实现类成员方法的访问第42页,共179页,2024年2月25日,星期天方法的重载(overload)方法名相同,但方法的参数不同(数量,类型,顺序)求最大值定义:doublemax(doublea,doubleb)doublemax(doublea,doubleb,doublec)doublemax(doublea,doubleb,doublec,doubled)调用:max(1.1,2.3);max(1,4,3);max(1,100,34,45);成员方法的重载第43页,共179页,2024年2月25日,星期天构造方法对象初始化系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化第44页,共179页,2024年2月25日,星期天构造方法构造方法一种和类同名的特殊方法用来初始化对象Java中的每个类都有构造方法,用来初始化该类的一个新的对象没有定义构造方法的类,系统自动提供默认的构造方法构造方法的特点方法名与类名相同没有返回类型,修饰符void也不能有(为什么不需要返回类型?)通常被声明为公有的(public)可以有任意多个参数主要作用是完成对象的初始化工作不能在程序中显式的调用在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化第45页,共179页,2024年2月25日,星期天构造方法系统提供的默认构造方法如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法默认的构造方法没有参数,其方法体为空使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空声明一个银行帐号类及测试代码publicclassBankAccount{ String

ownerName;int

accountNumber;float

balance;}publicclassBankTester{publicstaticvoidmain(Stringargs[]){ BankAccountmyAccount=newBankAccount(); System.out.println("ownerName="+myAccount.ownerName);System.out.println("accountNumber="+myAccount.accountNumber); System.out.println("balance="+myAccount.balance); }}运行结果ownerName=nullaccountNumber=0balance=0.0第46页,共179页,2024年2月25日,星期天构造方法自定义构造方法与方法重载可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化构造方法可以被重载,构造方法的重载和普通方法的重载一致第47页,共179页,2024年2月25日,星期天构造方法为BankAccount声明一个有三个参数的构造方法publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;}假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法publicBankAccount(StringinitName,intinitAccountNumber){ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;}第48页,共179页,2024年2月25日,星期天构造方法自定义无参的构造方法无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错在声明构造方法时,好的声明习惯是不声明构造方法如果声明,至少声明一个无参构造方法第49页,共179页,2024年2月25日,星期天构造方法构建一个Bush类,有两个有参数的构造方法classBush{ Bush(inti){……}Bush(doubled){……}}如果写:newBush();

编译器将要告诉你找不到对应的构造方法说明用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法第50页,共179页,2024年2月25日,星期天构造方法在例子BankAccount基础上再声明一个无参的构造方法publicBankAccount(){ownerName="";accountNumber=999999;balance=0.0f;}第51页,共179页,2024年2月25日,星期天综合例子包括状态、构造方法、get方法及set方法publicclassBankAccount{ privateStringownerName; privateintaccountNumber; privatefloatbalance; publicBankAccount(){ ownerName=“”; accountNumber=0; balance=0; } publicBankAccount(StringinitName,intinitAccNum,floatinitBal){ ownerName=initName;accountNumber=initAccNum; balance=initBal; } publicStringgetOwnerName(){returnownerName;}publicintgetAccountNumber(){returnaccountNumber;}publicfloatgetBalance(){returnbalance;}publicvoidsetOwnerName(StringnewName){ownerName=newName;}publicvoidsetAccountNumber(intnewNum){accountNumber=newNum;}publicvoidsetBalance(floatnewBalance){balance=newBalance;}}第52页,共179页,2024年2月25日,星期天综合例子声明测试类AccountTesterpublicclassAccountTester{publicstaticvoidmain(Stringargs[]){

BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);anAccount.setBalance(anAccount.getBalance()+100);System.out.println("Hereistheaccount:");System.out.println("Accountname:"+anAccount.getOwnerName());System.out.println("Accountnumber:"+anAccount.getAccountNumber());System.out.println("Balance:$"+anAccount.getBalance());}}测试结果Hereistheaccount:Accountname:ZhangLiAccountnumber:100023Balance:$100.0第53页,共179页,2024年2月25日,星期天内存回收垃圾收集器自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收作为一个线程运行通常在系统空闲时异步地执行当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,与系统同步运行finalize()方法在类java.lang.Object中声明,因此Java中的每一个类都有该方法用于释放系统资源,如关闭打开的文件或socket等声明格式protectedvoidfinalize()throwsthrowable如果一个类需要释放除内存以外的资源,则需在类中重写finalize()方法第54页,共179页,2024年2月25日,星期天内存回收同C和C++的区别C语言中通过free来释放内存C++中则通过delete来释放内存在C和C++中,如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存耗尽在Java中不会发生内存泄漏情况,但对于其它资源,则有产生泄漏的可能性第55页,共179页,2024年2月25日,星期天static(静态变量/静态方法)类的变量/方法,独立于类的对象,可以直接根据类名调用也称为类变量,类方法,声明时需加static修饰符不管类的对象有多少,类变量只存在一份,在整个类中只有一个值,它不保存在任意一个对象的内存空间中,而是保存在类的公共区域中类初始化的同时就被赋值适用情况类中所有对象都相同的属性经常需要共享的数据系统中用到的一些常量值引用格式<类名|实例名>.<类变量名>静态成员第56页,共179页,2024年2月25日,星期天静态成员对于一个圆类的所有对象,计算圆的面积时,都需用到π的值,可在Circle类的声明中增加一个类属性PIpublicclassCircle{

staticdoublePI=3.14159265;intradius;}当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中例如:系统类Math中的Math.E和Math.PI第57页,共179页,2024年2月25日,星期天静态成员对类变量进行测试publicclassClassVariableTester{publicstaticvoidmain(Stringargs[]){Circlex=newCircle();System.out.println(x.PI);System.out.println(Circle.PI);Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}测试结果3.141592653.141592653.143.14第58页,共179页,2024年2月25日,星期天静态成员声明一个Point类,有两个私有变量保存点坐标,一个类变量保存已有点的个数publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;publicPoint(intx,inty){this.x=x;this.y=y;pointCount++;}}第59页,共179页,2024年2月25日,星期天测试类ex2_4classex2_4{ publicstaticvoidmain(String[]args){ Pointp=newPoint(1,1);System.out.println(p.pointCount); Pointq=newPoint(2,2); System.out.println(q.pointCount); System.out.println(q.pointCount==Point.pointCount); System.out.println(Point.pointCount); }}测试结果12true2第60页,共179页,2024年2月25日,星期天静态成员静态方法也称为类方法,表示类中对象的共有行为声明时前面需加static修饰符类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用Math.sinMath.cosMath.maxMath.log

第61页,共179页,2024年2月25日,星期天静态成员将摄氏温度(centigrade)转换成华氏温度(fahrenheit)转换公式为fahrenheit=centigrade*9/5+32除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法转换方法centigradeToFahrenheit放在类Converter中publicclassConverter{publicstaticintcentigradeToFahrenheit(intcent){return(cent*9/5+32);}}方法调用Converter.centigradeToFahrenheit(40)第62页,共179页,2024年2月25日,星期天静态成员main()方法统一格式:publicstaticvoidmain(String[]args)

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法因为main()方法是由Java虚拟机调用的,所以必须为public,虚拟机调用main()方法的时候不需要产生任何对象,所以main方法声明为static,且不需要返回值,所以声明为voidmain()方法可以有输入参数,类型为String[],这是java的规范,这个输入参数数组的名字可以自己设定,但通常都取为agrs,用命令行执行时:java主类名参数0参数1参数2……参数列表自动赋值给String[]args,以字符串存储第63页,共179页,2024年2月25日,星期天静态成员publicclassTestMain{

publicstaticvoidmain(Stringargs[]){ System.out.println("打印main方法中的输入参数!"); for(inti=0;i<args.length;i++){ System.out.println(args[i]); } }}第64页,共179页,2024年2月25日,星期天final变量/方法final变量:定义一个常数,即变量值不能改变finaldoublePI=3.1415927;final类:不能有子类final方法:方法不能被重写(overriding)classChessAlgorithm{...

finalvoidnextMove(ChessPiecepieceMoved,BoardLocationnewLocation){...}...}final成员第65页,共179页,2024年2月25日,星期天方法参数成员方法参数传递publicstaticvoidmain(Stringargs[]){ intx=3,y=4; Testp=newTest(); System.out.println(x+""+y); p.swapInt(x,y); System.out.println(x+""+y);

intarr[]={5,6}; System.out.println(arr[0]+"

"

+arr[1]); p.swapArray(arr);

System.out.println(arr[0]+"

"

+arr[1]); }}classTest{ voidswapInt(intx1,inty1){ inttemp=x1;x1=y1;y1=temp; } voidswapArray(inta[]){

inttemp=a[0];a[0]=a[1];a[1]=temp; }第66页,共179页,2024年2月25日,星期天第三章面向对象特征基本概念类的定义对象类的继承和多态接口常用工具类第67页,共179页,2024年2月25日,星期天对象引用对象的变量格式:对象名.变量名引用对象的方法格式:对象名.方法名例1Vectorv=newVector();v.addElement("helloworld");例2inta[]={1,2,3,4,5};intsize=a.length;例3System.out.println();第68页,共179页,2024年2月25日,星期天对象通过对象引用对象的成员变量和成员方法classQangle{ inta,h; Qangle(){a=10;h=20;} Qangle(intx,inty){a=x;h=y;} Qangle(Qangler){ a=r.width(); h=r.height(); } voidset(intx,inty){a=x;h=y;}}q1.set(30,40);q1.a=30;q1.h=40;目的相同第一方式更安全、更面向对象(数据封装)第69页,共179页,2024年2月25日,星期天对象的使用封装封装是一个面向对象的术语,其含义很简单,就是把东西包装起来。换言之,成员变量和方法的定义都包装于类定义之中,类定义可以看成是将构成类的成员变量和方法封装起来。通过限定类成员的可见性,可以使类成员中的某些属性和方法能够不被程序的其他部分访问,它们被隐藏了起来,只能在定义的类中使用,这就是面向对象中实现封装的方式。Java中封装需要遵循的规则:(1)用访问限制修饰符保护成员变量,通常是private。(2)建立公有的访问方法,强制调用代码通过这些方法访问成员变量。第70页,共179页,2024年2月25日,星期天对象的使用publicclassDesk{ privateintheight; privateintwidth; publicvoidsetProperty(inti,intj){ if(i>0){ height=i; System.out.println("设置桌子高成功"); }elseSystem.out.println("设置桌子高出错"); if(j>0){ width=j; System.out.println("设置桌子宽成功"); }elseSystem.out.println("设置桌子宽出错"); }}第71页,共179页,2024年2月25日,星期天对象的使用publicclassTest{ publicstaticvoidmain(String[]args){ //创建desk对象

Deskd=newDesk(); //访问成员变量height和width

d.setProperty(-100,200); }}第72页,共179页,2024年2月25日,星期天对象的使用封装不但可以提高健壮性,还便于代码维护例如:把上例中的width类型改为StringpublicclassDesk{ privateintheight; //将width改为String型

privateStringwidth; publicvoidsetProperty(inti,intj){ if(i>0){ height=i; //Integer.toString(i)将int类型转为String类型

System.out.println("设置桌子高成功,高为"+Integer.toString(i)); }else System.out.println("设置桌子高出错"); if(j>0){ //将输入的int类型转为String类型

Stringwidth_s=Integer.toString(j); width=width_s; System.out.println("设置桌子宽成功,宽为"+width); }else System.out.println("设置桌子宽出错"); }}第73页,共179页,2024年2月25日,星期天对象的使用publicclassTest{ publicstaticvoidmain(String[]args){ //创建desk对象

Deskd=newDesk(); //访问成员变量height和width d.setProperty(120,230); }}第74页,共179页,2024年2月25日,星期天对象的使用对象作为方法的参数[访问权限修饰符]方法返回类型方法名(参数){

方法体;}参数:类型变量名,…

…类型:基本数据类型/复合类型(对象)参数的传递基本数据类型:值传递(Passbyvalue)复合数据类型:引用传递第75页,共179页,2024年2月25日,星期天例对象用作方法的参数对象的使用classTest{publicstaticvoidmain(Stringargs[]){ Spots=newSpot(2,3); System.out.println("s点的坐标:"+ +s.getX()+","+s.getY()); Transts=newTrans();

ts.move(s,4,5); System.out.println("s点的坐标:"+ +s.getX()+","+s.getY()); }}classSpot{ privateintx,y; Spot(intu,intv){ x=u;y=v;} voidsetX(intx1){x=x1;} voidsetY(inty1){y=y1;} intgetX(){returnx;} intgetY(){returny;}}classTrans{

voidmove(Spotp,inth,intk){ p.setX(p.getX()+h); p.setY(p.getY()+k); }}classTest{publicstaticvoidmain(Stringargs[]){ Spots=newSpot(2,3); System.out.println("s点的坐标:" +s.getX()+","+s.getY());

Trans.move(s,4,5); System.out.println("s点的坐标:" +s.getX()+","+s.getY()); }}classSpot{ privateintx,y; Spot(intu,intv){ x=u;y=v;} voidsetX(intx1){x=x1;} voidsetY(inty1){y=y1;} intgetX(){returnx;} intgetY(){returny;}}classTrans{staticvoidmove(Spotp,inth,intk){ p.setX(p.getX()+h); p.setY(p.getY()+k); }}classTest{publicstaticvoidmain(Stringargs[]){ Spots=newSpot(2,3); System.out.println("s点的坐标:" +s.getX()+","+s.getY());

s.move(4,5); System.out.println("s点的坐标:" +s.getX()+","+s.getY()); }}classSpot{ privateintx,y; Spot(intu,intv){ x=u;y=v;} voidsetX(intx1){x=x1;} voidsetY(inty1){y=y1;} intgetX(){returnx;} intgetY(){returny;}

voidmove(inth,intk){ x=x+h; y=y+k; }}第76页,共179页,2024年2月25日,星期天对象的使用对象的访问对象作为方法的返回值[访问权限修饰符]方法返回类型方法名(参数){

方法体;}返回类型有返回值:基本数据类型/复合类型(对象)无返回值:void第77页,共179页,2024年2月25日,星期天对象的使用对象作为方法的返回值例:求两点坐标之间的中点坐标思路:(x1,y1)和(x2,y2)(x,y)x=(x1+x2)/2,y=(y1+y2)/2Spots1=newSpot(2,3);Spots2=newSpot(4,5);Spots=s1.midSpot(s2);第78页,共179页,2024年2月25日,星期天例对象用作方法的返回值对象的使用classTest{publicstaticvoidmain(Stringargs[]){ Spots1=newSpot(3.0,5.0); Spots2=newSpot(6.0,8.0); System.out.println("s1点的坐标:" +s1.getX()+","+s1.getY()); System.out.println("s2点的坐标:" +s2.getX()+","+s2.getY());

Spots=s1.midSpot(s2); System.out.println("中点的坐标:" +s.getX()+","+s.getY()); }}classSpot{ privatedoublex,y; Spot(doubleu,doublev){ setX(u);setY(v);} voidsetX(doublex1){x=x1;} voidsetY(doubley1){y=y1;} doublegetX(){returnx;} doublegetY(){returny;}

SpotmidSpot(Spots){ doublemidX=(x+s.getX())/2; doublemidY=(y+s.getY())/2;

returnnewSpot(midX,midY); }}第79页,共179页,2024年2月25日,星期天对象的使用对象数组classTest{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[5]; for(inti=0;i<a.length;i++) System.out.println(a[i]); Strings[]={"a","bc","def","ghij"}; for(inti=0;i<s.length;i++) System.out.println(s[i]); for(inti=0;i<s.length;i++) System.out.println(s[i].length()); }}第80页,共179页,2024年2月25日,星期天对象的使用对象数组classStudent{ privateStringname; privateStringid; Student(Strings1,Strings2){name=s1;id=s2;} StringgetName(){returnname;} voidsetName(Strings){name=s;} voiddisplay(){ System.out.println(name+ ""+id);}}Studentst[]=newStudent[10];for(inti=0;i<st.length;i++){ st[i]=newStudent(…);}for(inti=0;i<st.length;i++){ st[i].display();}第81页,共179页,2024年2月25日,星期天对象的使用对象作为另一个对象的成员变量一个对象中包含另一个对象,组合关系classStudent{ privateStringname; privateStringid; Student(Strings1,Strings2){ name=s1;id=s2; } StringgetName(){retu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论