xid-76276625-面向对象程序设计.ppt_第1页
xid-76276625-面向对象程序设计.ppt_第2页
xid-76276625-面向对象程序设计.ppt_第3页
xid-76276625-面向对象程序设计.ppt_第4页
xid-76276625-面向对象程序设计.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计2,教材45章,静态域与静态方法抽象类与抽象方法最终类与最终方法包及访问权限控制接口,静态属性(类属性),static静态修饰符,可以修饰类中的属性与方法静态属性(类属性)被static修饰的属性;是类的属性,不属于任何一个类的具体对象;位于类的内存区域中,是该类对象共享的存储单元;无static修饰的属性为对象属性。静态属性的访问类名.属性名或:对象名.属性名,访问的是相同的内存单元,静态属性例,classEmployee/Employee类定义Stringname;intage;floatsalary;staticfloatc_minSalary=500;/静态属性,职工最低工资Employee(Stringn,inta,floats)/构造方法name=n;age=a;salary=s;voidupSalary(floatinc)/方法提薪salary=salary+inc;StringgetInfo()/方法取信息return姓名:+name+年龄:+age+工资:+salary;,静态属性例,publicclassTestpublicstaticvoidmain(Stringargs)Employeeemp1=newEmployee(赵兵,28,1500.0F);Employeeemp2=newEmployee(何小明,31,1800.0F);System.out.println(Employee.c_minSalary);System.out.println(emp1.c_minSalary);System.out.println(emp2.c_minSalary);if(emp1.salaryEmployee.c_minSalary)emp1.upSalary(500.0F);,5-1,静态属性例,可实现各实例之间的通讯。例:跟踪创建的实例数classEmployee/Employee类定义Stringname;intage;floatsalary;staticfloatc_minSalary=800.0F;/静态属性,职工最低工资staticintc_count=0;/静态属性,创建对象记数器Employee(Stringn,inta,floats)/构造方法name=n;age=a;if(sc_minSalary)salary=c_minSalary;elsesalary=s;,静态属性例,c_count+;publicclassTestpublicstaticvoidmain(Stringargs)Employeeemp1=newEmployee(赵兵,28,500.0F);System.out.println(赵兵的工资是:+emp1.salary);Employeeemp2=newEmployee(何小明,31,1800.0F);System.out.println(目前创建了+Employee.c_count+个对象);,5-2,系统类的静态属性例,Integer类静态属性例:MIN_VALUE该属性(常量)代表整型数的最小值MAX_VALUE该属性(常量)代表整型数的最大值System类静态属性例:in(该属性为InputStream类型)表示标准输入(键盘)out(该属性为PrintStream类型)表示标准输出(显示器)测试例:publicclassTestpublicstaticvoidmain(Stringargs)System.out.println(Integer.MIN_VALUE);/-2147483648System.out.println(Integer.MAX_VALUE);/2147483647,静态方法(类方法),static静态修饰符,可以修饰类中的属性与方法。静态方法被static修饰的方法;使用类方法不用创建类的对象。调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名。非static的方法是对象方法(或称实例方法)。类方法中不能访问实例属性,而只能访问类属性(static属性)、自己的方法参数及定义的变量。类方法中不能直接调用本类中的实例方法,但可以调用其他的static方法。类方法中没有this值。静态方法的调用类名.方法名,静态方法(类方法)例,publicclassTestpublicstaticvoidmain(Stringargs)System.out.println(Math.round(3.54);Strings=toChar(2.718);System.out.println(e=+s);staticStringtoChar(doublex)returnDouble.toString(x);/调用Double类的toString静态方法Math.round(3.54)是调用Math类的round静态方法,其功能是对参数值进行四舍五入处理,并将处理的结果返回。Double.toString(x)是调用Double类的toString静态方法,其功能是将Doubie类型的参数值转换为String类型并返回。在main方法中还调用了Test类中定义的toChar静态方法。,5-3,静态方法(类方法),main方法是静态方法,这是为了系统在没有任何实例化对象之前可以运行一个应用程序。如果main方法要调用本类的其它方法:将这些方法设计成静态方法,创建对象,使用对象方法。一个静态方法不能被一个非静态方法所覆盖。,静态方法(类方法)例,classEmployee/Employee类定义Stringname;intage;floatsalary;staticfloatc_minSalary=500;/静态属性,职工最低工资Employee(Stringn,inta,floats)/构造方法name=n;age=a;salary=s;staticfloatgetMinSalary()/静态方法,读取静态属性returnc_minSalary;staticvoidsetMinSalary(floatf)/静态方法,设置静态属性c_minSalary=f;staticfloatfindTax(Employeee)/静态方法,计算税款returne.salary*0.1F;/Employee,静态方法(类方法)例,classManagerextendsEmployeefloatallowance;Manager(Stringn,inta,floats,floataa)/构造方法super(n,a,s);/调用父类构造方法(为3个属性赋值)allowance=aa;/为allowance属性赋值/方法略/Manager,静态方法(类方法)例,publicclassTestpublicstaticvoidmain(Stringargs)Employeeemp=newEmployee(赵兵,28,1400.0F);Managermgr=newManager(刘云峰,41,3800.0F,500.0F);Employee.setMinSalary(800.0F);/调用静态方法System.out.println(职工最低工资为:+Employee.getMinSalary();System.out.println(+应交税:+Employee.findTax(emp);System.out.println(+应交税:+Employee.findTax(mgr);,5-4,类的初始化静态初始化器,由关键字static引导的一对大括号括起的语句组,用来完成类的初始化的工作。与构造方法的区别:构造方法是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化;构造方法是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用执行;不同于构造方法,静态初始化器不是方法,没有方法名、返回值和参数列表。,静态初始化器例,classEmployee/Employee类定义Stringname;intage;floatsalary;staticfloatc_minSalary;/静态属性,职工最低工资staticintc_count;/静态属性,创建对象记数器static/静态初始化器,初始化两个静态属性c_minSalary=800;c_count=0;Employee(Stringn,inta,floats)/构造方法name=n;age=a;if(sc_minSalary)salary=c_minSalary;elsesalary=s;c_count+;/创建一个Employee对象,计数器计数一次/测试程序略,抽象类与抽象方法,abstract修饰符定义一个抽象类抽象类是没有具体对象的概念类,不能创建抽象类的对象;是类继承中处于较高层次的类,是对子类共性的抽象与定义;抽象类的作用是让其子类来继承它所定义的属性及方法,以避免各子类重复定义这些相同的内容;程序员可以先建立抽象类(定义子类共有的属性及方法),再从一般类派生出具有特性的子类。abstract修饰符定义一个抽象方法抽象方法是仅有方法头而没有方法体的方法;为该类的子类定义一个方法的接口标准,方法的具体实现在子类中完成。,抽象类与抽象方法,抽象类经常包含某些抽象方法,即规定一些方法的接口,而方法的代码要由不同的子类去实现。一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。抽象类中可以定义一般方法和抽象方法,但抽象方法只能出现在抽象类中。,最终类,用final修饰符定义的类最终类final类不能被继承,final类不能再有子类;在类的继承树中,final类只能是树的叶子结点;当然,叶子结点不一定是final类。类的保护性措施当通过类名引用类的对象时,实际引用的既可以是该类的对象本身,也可以是这个类的子类的对象,即有一定的不确定性;将一个类定义为final类,可以杜绝其子类的产生,将该类的属性及方法固定下来,类的内容与类的引用形成稳定的映射关系。final类通常是定义那些有固定功能、用来完成某种标准功能的类。,最终方法,用final修饰符定义的方法最终方法不能被当前类的子类重新定义的方法。子类不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。只能继承但不能修改。固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。方法的保护性措施。,最终属性,用final修饰符定义的属性最终属性final属性的值不能被修改,相当于一个常量;final属性要指定数据类型及其取值由于所有类对象的final属性值都一样,为节省空间,final属性通常又被同时声明为static(静态属性)。例:staticfinalintc_minSalary=800;而:staticintc_minSalary=800是定义静态属性,但可以修改。,类继承树,Object,class,abstractclass,class,finalclass,class,java采用单重继承机制,即每个类只有一个父类,抽象类例,抽象类,交通工具,自行车,汽车,空中交通工具,海上交通工具,陆地交通工具,客机,运输机,抽象类与最终类,抽象类最终类,Person,Engineer,Secretary,Customer,Employss,VipCust,Manager,Director,5-5,抽象类、抽象方法、最终类、最终方法例,finalgetName()finalupSalary(inc)getInfo(),staticc_minSalarynamesexagesalarytitle,Engineer最终类,finalgetName()finalupSalary(inc)getInfo(),staticc_minSalarynamesexagesalaryoffice,Secretary最终类,Employee类,抽象类、抽象方法、最终类、最终方法例,Employee类,方法重载,抽象类、抽象方法、最终类、最终方法例,例题代码,abstractclassPeople/人员类抽象类Stringname;charsex;abstractStringgetInfo();/抽象方法,子类要实现finalStringgetName()/最终方法,只能继承,不能修改returnname;,例题代码,classCustomerextendsPeople/客户类Stringcustno;Customer(Stringc,Stringn,charx)custno=c;/客户号name=n;/姓名sex=x;/性别StringgetInfo()/通过方法覆盖,实现父类的抽象方法return客户号:+custno+姓名:+name+性别:+sex;/Cuetomer,例题代码,finalclassVipCustextendsCustomer/vip客户最终类staticintc_vno=0;/静态属性,用于生成客户对象的vip号intvipno;/vip号VipCust(Stringc,Stringn,charx)super(c,n,x);vipno=+c_vno;StringgetInfo()/通过方法覆盖,改写方法returnvip客户:+vip编号:+vipno+姓名:+name;,例题代码,classEmployeeextendsPeoplestaticfloatc_minSalary=500;/静态属性(职工最低工资)intage;floatsalary;Employee(Stringn,charx,inta,floats)name=n;sex=x;age=a;if(sc_minSalary)salary=c_minSalary;elsesalary=s;voidupSalary(floatinc)/定义新方法salary=salary+inc;StringgetInfo()/通过方法覆盖,实现父类的抽象方法return姓名:+name+性别:+sex+年龄:+age;,例题代码,classManagerextendsEmployeefloatallowance;Manager(Stringn,charx,inta,floats,floataa)super(n,x,a,s);allowance=aa;/津贴finalvoidupSalary(floatinc1,floatinc2)/最终方法,方法重载salary=salary+inc1;allowance=allowance+inc2;StringgetInfo()/改写父类Employee的方法return管理者+super.getInfo()+收入:+(salary+allowance);/Manager,例题代码,finalclassDirectorextendsManager/最终类Stringtelephone;Stringdepartment;Director(Stringn,charx,inta,floats,floataa,Stringt,Stringd)super(n,x,a,s,aa);telephone=t;department=d;voidsetTel(Stringtel)telephone=tel;StringgetTel()returntelephone;StringgetInfo()returnname+是+department+部门的领导;/Director,例题代码,finalclassEngineerextendsEmployee/最终类Stringtitle;Engineer(Stringn,charx,inta,floats,Stringt)super(n,x,a,s);title=t;StringgetInfo()returnname+职称是+title;/Engineer,例题代码,finalclassSecretaryextendsEmployee/最终类Stringoffice;Secretary(Stringn,charx,inta,floats,Stringo)super(n,x,a,s);office=o;StringgetInfo()returnname+是+office+的秘书;/Secretary,例题代码,publicclassTestpublicstaticvoidmain(Stringargs)System.out.println(-测试客户-);Customercust1=newCustomer(c01,黄云,女);VipCustvip1=newVipCust(c02,李梓,女);VipCustvip2=newVipCust(c03,赵勇,男);System.out.println(cust1.getInfo();System.out.println(cust1客户名为:+cust1.getName();System.out.println(vip1.getInfo();System.out.println(vip1的客户名为:+vip1.getName();System.out.println(vip2.getInfo();System.out.println(已创建的vip客户数为:+VipCust.c_vno);,例题代码,System.out.println(-测试职工-);Employeeemp=newEmployee(赵兵,男,28,1500.0F);Managermgr=newManager(徐军,女,35,1800.0F,500.0F);Directordir=newDirector(黄帅,男,45,3000.0F,500.0F,2430,计划司);Engineereng=newEngineer(刘志军,男,38,1600.0F,工程师);Secretarysec=newSecretary(邓萍,女,23,1000.0F,财务室);System.out.println(emp的名字是:+emp.getName();emp.upSalary(500.0F);System.out.println(emp.getInfo();,例题代码,mgr.upSalary(200.0F,200.0F);System.out.println(mgr.getInfo();dir.setTel(8888);System.out.println(dir的姓名:+dir.getName()+dir的电话:+dir.getTel();System.out.println(dir.getInfo();System.out.println(eng.getInfo();System.out.println(sec.getInfo();,5-5,代码说明,方法覆盖抽象方法的实现People类抽象了一个其子类共有的方法:abstractStringgetInfo();这个方法代表相同的功能(获取对象信息),但对于不同类型的对象,显示内容是不同的。不同的子类可以重新定义该方法,实现不同内容的信息显示。但是所有的类中,凡是实现获取信息的方法,尽管内容不同,却共享相同的名字getInfo()由于同名的不同方法是属于不同的类,所以只需在调用方法时指明是哪个类对象即可区分(对象名.方法名),代码说明,若Customer类修改代码如下:classCustomerextendsPeopleStringcustno;Customer(Stringc,Stringn,charx)custno=c;name=n;sex=x;StringgetName()return客户姓名:+name;/Cuetomer,抽象方法在非抽象类中必须实现!最终方法不能重新定义(覆盖)!,代码说明,如果将Customer定义成最终类(final),编译错误如下:,最终类不能被继承,即不能有子类!,编译单元的基本概念,一个java源代码文件称之为一个编译单元。一个编译单元中只能有一个public类,该类名与文件名相同。编译单元中的其他类是该主public类的支撑类。经过编译,编译单元中的每个类都产生一个.class文件。java的工作程序是一串.class文件,JAVA解释器负责寻找、加载和解释这些文件。(不象其它语言最终生成一个.exe的可执行文件),编译单元,publicclassc1.main().classc2.classc3.,.java文件,classc4.classc5.,c1.class文件,c3.class文件,c2.class文件,c5.class文件,c4.class文件,javac,javac,java,.java文件,包(package),在操作系统中,目录用来组织文件,设置权限。Java利用包来组织相关的类,并控制访问权限。包是一种松散的类的集合。一般不要求处于同一个包中的类有明确的相互关系,如包含、继承等等。由于同一包中的类在缺省情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个包里。利用包来管理类,便于类的组织、管理和引用(共享),可实现类的访问权限控制。系统类库就是以若干个包的形式提供:Inputjava.io.*程序要引用系统io包中的类。,包与类的名字空间,所有类成员的名字都是相互隔离的。类A中的方法m1与类B中的方法m1互不相干,但类名就有冲突的问题;在一个Java程序运行过程中,某些类会从internet上自动下载,而用户并不知晓。所以在java中需要名字空间的完全控制,以便可以建立一个唯一的类名。包用于类的名字空间管理。作为包的设计人员,利用包来划分名字空间以避免类名冲突,类的名字空间包目录,包p1,类c1,类c2,类c3,包p11,包p2,类c2,类c3,类c4,类c1,类c5,p2,p11,d:temp,类,classpath=d:temp,p1,包,包与目录,一个包要放在指定目录下,包名本身又对应一个目录(用一个目录表示)。一个包可以包含若干个类文件,还可包含若干包。包名可以有层次,以小数点分割。包名一般全小写。环境变量classpath指定搜寻包的路径。,编译单元与包,对象三步曲:打开包(import,package)加载类(程序中只有类定义的一份拷贝)建对象(用new运算符可以创建一个类的若干实例),编译单元,当前包,其他包,其他包,package,import,package语句,常见语句格式:package包名;package包名.子包名;在一个编译单元中,只能有一个package语句,且为第一个语句。语句功能指定当前包凡在本编译单元中定义的类都属于这个包(对类分组);本编译单元也可引用当前包中已有的类;如果编译单元中无package语句,则隐含的当前包是一个无名包(放在当前目录下)。无名包中的类是为了局部应用。,import语句,常用语句格式:import包名.类名;/引入指定的类import包名.*;/引入包中的所有类import包名.子包名.*;import语句必须出现在所有类定义之前;import语句将所指定包中的类引入当前的名字空间,即告诉编译到哪去找程序中使用的类;例:importjava.util.*;该语句引入整个utility类库(标准Java库的一部分)例:importjava.util.Vector;该语句只引入Vector类,但utility类库中的其他类不可用。,从包中加载类,当程序需要建立一个类的对象,或是第一次访问类的静态成员时,会动态加载类文件。import语句并不实际加载包中的类;JAVA解释器加载类过程:将环境变量CLASSPATH包含的一个或多个目录作为起始目录;解释器取出包名,将小数点换成斜杠,产生以CLASSPATH目录为起点的查找路径;查找目录下的.class文件;例importp1.p11.*转换为p1p11*.class或p1/p11/*.class(取决于操作系统),包的使用例,例子说明在d:emp目录下建立一个名为employee的包;将Employee、Manager、Director三个类放入employee包中;在测试程序中,引用employee包中的类,对上述三个类的对象进行测试。包与目录的对应关系在d:emp目录下建立包,系统会在该目录下建立employee目录,代表这个包的所在位置;将Employee等三个类放入employee包中,最终结果是在d:empemployee目录下存放3个类文件:Employee.class、Manager.class和Manager.class,包的使用例,在开始该例子过程之前,先为新的包(employee)设置好查询路径。设置employee包的查询路径(dos命令)setclasspath=%CLASSPATH%;d:emp在原有查询路径的基础上,再加一个查询目录d:emp,包的使用例,packageemployee;/声明employee包为当前包publicclassEmployee/生成的类文件放入employee包中staticfloatc_minSalary=500;/静态属性Stringname;charsex;intage;floatsalary;publicEmployee(Stringn,charx,inta,floats)name=n;sex=x;age=a;salary=s;voidupSalary(floatinc)salary=salary+inc;publicStringgetInfo()return姓名:+name+性别:+sex+年龄:+age;,Employee.java,包的使用例,packageemployee;/声明employee包为当前包publicclassManagerextendsEmployeefloatallowance;publicManager(Stringn,charx,inta,floats,floataa)super(n,x,a,s);allowance=aa;publicStringgetInfo()/改写父类Employee的方法return管理者+super.getInfo()+收入:+(salary+allowance);/Manager,Manager.java,包的使用例,packageemployee;声明employee包为当前包publicclassDirectorextendsManagerStringtelephone;Stringdepartment;publicDirector(Stringn,charx,inta,floats,floataa,Stringt,Stringd)super(n,x,a,s,aa);telephone=t;department=d;voidsetTel(Stringtel)telephone=tel;StringgetTel()returntelephone;publicStringgetInfo()returnname+是+department+部门的领导;/Director,Director.java,包的使用例,javac命令选项:javac-d目录名指定存放生成的类文件的位置。本例由于指定了package语句,所以是将生成的类文件存入指定目录(d:emp)下的包中(employee包)如果emp目录下没有employee子目录,系统会自动创建。如果没有指定-d选项,系统就认为employee在当前目录下。,包的使用例,importemployee.*;/本程序要用到employee包中的类publicclassTestpublicstaticvoidmain(Stringargs)Employeeemp=newEmployee(赵兵,男,28,1500.0F);Managermgr=newManager(徐军,女,35,1800.0F,500.0F);Directordir=newDirector(黄帅,男,45,3000.0F,500.0F,2430,计划司);System.out.println(emp.getInfo();System.out.println(mgr.getInfo();System.out.println(dir.getInfo();,5-6,Test.java注意:本文件不要与前面的3个类文件放在同一目录下,访问控制符,访问控制符是一组限定类、属性和方法是否可以被程序其他部分访问的修饰符。类访问控制符public公共类:public类名一般类:无public修饰的类公共类:表明它可以被其他所有的类访问。一般类:只能被同一包中的类所访问;一个包中的类不用说明可相互访问。把常在一起协同工作的类放在一个包里是很自然的。,类成员(属性和方法)的访问控制,一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件。属性和方法的访问控制符,类成员(属性和方法)的访问控制,访问控制一般原则,本包使用,采用缺省方式;供其他包使用,采用public控制符;为了使对象具有良好的封装性,可将类的实例变量设计成私有,但为了使其它类或对象能够访问私有实例变量,本类必须提供访问私有变量的方法(公共方法)。按照惯例:读私有变量的方法取名为get写私有变量的方法取名为set,访问控制符例,publicclassEmployeeprivateStringname;privatecharsex;privateintage;privatefloatsalary;publicEmployee(Stringn,charx,inta,floats)name=n;sex=x;age=a;salary=s;voidupSalary(floatinc)salary=salary+inc;publicintgetAge()returnage;publicvoidsetAge(inta)age=a;publicStringgetInfo()return姓名:+name+性别:+sex+年龄:+age;,其他类不能访问,子类也不能继承,访问控制符例,publicclassTest/与Employee在同一包中publicstaticvoidmain(Stringargs)Employeeemp=newEmployee(赵兵,男,28,1500.0F);emp.upSalary(500);System.out.println(emp.age);/该语句出错emp.setAge(29);System.out.println(emp.getAge();System.out.println(emp.getInfo();,访问控制符例,publicclassManagerextendsEmployeefloatallowance;publicManager(Stringn,charx,inta,floats,floataa)super(n,x,a,s);allowance=aa;publicStringgetInfo()returnname+sex+age+salary;/出错,父类属性没有继承/Manager,5-7,接口interface,接口具有抽象类的概念接口中的方法都是没有方法体的抽象方法publicabstract方法(修饰符可省)接口中的属性只能是常量publicstatic

温馨提示

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

评论

0/150

提交评论