资源描述
单击此处编辑母版标题样式,单击此处编辑母版副标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第三章 抽象、封装与类,李莉,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4. Java,的类,5.,定义和使用类,6.,域,7.,方法,1.,面向对象思想,面向机器的程序:最早的计算机程序,为特定的硬件系统专门设计的。其运行速度和效率都很高,但是可读性和可移植性很差,随着软件开发规模的扩大,面向机器的程序逐渐被以,C,为代表的面向过程的程序所取代。,面向过程的程序:模拟问题的解决过程。数据结构、算法是面向过程问题求解的核心组成。面向过程的问题求解可以精确、完备地描述具体的求解过程,但却不足以把一个包含了多个相互关联的过程的复杂系统表述清楚。,面向对象的程序:模拟描述系统本身,包括系统的组成、系统的各种可能状态、系统中可能产生的各种过程与过程引起的系统状态切换。关心所有这些过程的整体,不仅仅是孤立的单个过程。,面向对象的程序设计语言的出发点:直接描述问题域中客观存在的事物,(,即对象,),以及它们之间的关系。,1.,面向对象思想,面向对象的程序设计语言对现实世界的直接模拟体现在:,客观世界是由一些具体的事物构成的,每个事物都具有自己的一组静态特征,(,属性,),和一组动态特征,(,行为,),。例如,一辆汽车有颜色、型号、马力、生产厂家等静态特征,又具有行驶、转弯、停车等动态特征。面向对象的程序设计语言把客观世界的这一事实映射到计算机语言中,把客观世界中的事物抽象成对象,(Object),,用一组数据描述该对象的静态特征,(,属性,称为数据成员,),,用一组方法来刻画该对象的动态特征,(,行为,),。,现实生活中的实体,计算机中的对象的原型,aCar,color_number,= red;,door_number,= 2;,int speed = 200;,void brake() ,void,speedUp,() ;,void,slowDown,() ,1.,面向对象思想,客观世界中的事物既具有特殊性又具有共同性,人类在认识客观世界过程中通常根据事物的共同性把相似的事物归结为某些类。例如所有的汽车和某一辆汽车之间的关系就很容易理解这一点。,OOPL,用类,(Class),来表示一组具有相同属性和方法的对象。,class Car ,int color_number;,int door_number;,int speed;,void brake() ,void,speedUp,() ;,void,slowDown,() ,现实生活中的对象,1,现实生活中的对象,2,aCar,color_number,= red;,door_number,= 2;,int speed = 200;,void brake() ,void,speedUp,() ;,void,slowDown,() ,bCar,color_number,= blue;,door_number,= 2;,int speed = 300;,void brake() ,void,speedUp,() ;,void,slowDown,() ,抽象,实例化,对象:小王,静态特征:小王,女,讲师,890.00,动态特征:授课,评职称,调工资,属性值,执行的,操作,方法名,属性,类:教师,属性:姓名,性别,职称,工资,服务:授课,评职称,调工资,1.,面向对象思想,在同一类事物中,每个事物既具有同类的共同性,又具有自己的特殊性。,OOPL,用父类与子类来描述这一事实:在父类中描述事物的共性,通过父类派生,(Derive),子类的机制来体现事物的个性。考虑同类事物中每个事物的特殊性时,可由这个父类派生子类,子类可以继承,(Inheritance),父类的共同性又具有自己的特殊性。,1.,面向对象思想,轿车,卡车,吊车,车,载客人数,后备箱容量,载重量,class Truck extends Car ,int,load,;,1.,面向对象思想,客观世界中的事物是一个独立的整体,它的许多内部实现细节是外部不关心的。例如,对于一个只负责开车的驾驶员来说,他可能根本不知道他所驾驶的这辆汽车内部用了多少根螺钉或几米导线,以及它们是怎样组装的。,OOPL,用封装,(Encapsulation),机制把对象的属性和方法结合为一个整体,屏蔽了对象的内部细节。,class Car ,int color_number;,int door_number;,int speed;,void brake() ,void,speedUp,() ;,void,slowDown,() ,class Car ,int color_number;,int door_number;,int speed;,void brake() ,void,speedUp,() ;,void,slowDown,() ,this.speed,-; ,public Class,UseCar,public static void,main(String,Args,),Car,obj,= new Car();,obj.slowDown,();,1.,面向对象思想,客观世界中的一个事物可能与其他事物之间存在某种行为上的联系。例如,一辆行驶中的汽车当看到红色信号灯时要刹车停止,,OOPL,便通过消息连接来表示对象之间的这种动态联系。,class Car ,int color_number;,int door_number;,int speed;,void brake() ,void,speedUp,() ;,void,slowDown,() ,class Light ,boolean,isRed,= true;,boolean,isGreen,;,boolean,isYellow,;,void,changeLight,(),class Test ,public static void main(),Car,aCar,= ;,Light,aLight,= ;,aLight.changeLight,();,if(aLight.isRed,),aCar.brake,();,1.,面向对象思想,客观世界中较为复杂的事物往往是由其他一些比较简单的事物构成的,例如,一辆自行车是由车架、车轮、把手等构成的,,OOPL,也提供了描述这种组成关系的功能。,综上,面向对象的编程语言使程序能够比较直接地反映客观世界的本来面目,并且使软件开发人员能够运用人类认识事物所采用的一般思维方法来进行软件开发。,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4. Java,的类,5.,在,Java,中定义和使用类,6.,域,7.,方法,2.,面向对象的优点,对象的数据封装特性解决了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性。,对象的数据封装特性把对象的私有数据和公共数据分离开,保护私有数据的安全性;减少了可能的模块间干扰,降低了程序复杂性。,对象是一个独立的整体,通过自身定义的操作,(,包括修改自身的状态、向外界发布消息,),来管理自己。当对象,A,欲影响对象,B,时,对象,A,需要调用对象,B,自身的方法,而不是直接去改变对象,B,。这使得所有修改对象的操作都以对象自身的一部分的形式存在于对象整体之中,维护了对象的完整性,有利于对象的复用、扩充和维护。,2.,面向对象的优点,对象通过一定的接口和相应的消息机制与外界相联系。这个特性和对象的封装性实现了信息的隐藏,(,隐藏了私有数据和操作细节等,),。使用对象时只需要了解其接口提供的功能操作即可,而不必了解对象内部的数据描述和具体的功能实现。,继承是面向对象方法中除封装外的另一个重要特性,通过继承可以很方便地实现应用的扩展和已有代码的重复使用,提高了开发效率。,综上,面向对象程序设计是将数据及数据的操作封装在一起,成为一个不可分割的整体,同时将具有相同特征的对象抽象成为一种新的数据类型,类。通过对象间的消息传递使整个系统运转。通过对象类的继承提供代码重用的有效途径。,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4. Java,的类,5.,在,Java,中定义和使用类,6.,域,7.,方法,3.,抽象与封装,Java,是面向对象的语言,类是面向对象技术的关键。在,Java,中,除了前面讲到的基本数据类型外,还有一种由用户定义并实现的复合数据类型,类。,在,Java,中,一切都是对象,任何事物都是对象。不同的对象常常只有一些共性,比如汽车、火车、飞机都有速度属性以及启动、加速、减速、停止等行为,把这些共性抽象出来就是类;类对这些属性和行为进行封装,就成为类的属性和方法。,将一个抽象的类具体化,也就是类的实例化,即生成该类的一个对象。比如将汽车具体为某一辆具体型号的汽车。,3.,抽象与封装,抽象,:是一种研究方法,即去除掉研究对象中与主旨无关的次要部分,或是暂时不予考虑的部分,仅仅抽取出与研究工作有关的实质性的内容加以考察。,3.,抽象与封装,软件开发方法中的抽象有两类:过程抽象和数据抽象。,过程抽象:将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。,面向过程的软件开发方法,采用这种抽象方法。使用过程抽象有利于控制、降低整个程序的复杂度,但是这种方法本身自由度较大,难于规范化和标准化,操作起来有一定难度,在质量上不易保证。,数据抽象:把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包含了针对这些数据的操作,是更为严格、也更为合理的抽象方法。,面向对象的软件开发方法,采用了数据抽象的方法来构建程序的类、对象和方法。,3.,抽象与封装,例如:处理有关银行日常业务的问题,最核心的问题就是所有的资金、账目往来。根据与此核心问题有关的操作,可以建立一个表示账户的抽象数据类型,作为考察的重点。,如果处理银行人力资源的问题,则系统最核心的问题是银行职员的信息,如工号、职位、入职时间,以及职员的出勤、招聘解聘、升职降职、请销假等事件,而不是银行的经营业务(如开户、转账、中间业务等),这时建立的则是表示职员的抽象数据类型。,3.,抽象与封装,封装,:利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的操作,才能够与这个抽象数据类型交互。,例如:一个工程师要组装一台电脑,他将各种电脑设备组装起来。如果需要声卡时,不需要用原始的集成电路芯片和材料自己去做,而是去电脑公司买一个符合某种规格的声卡。工程师所关心的是声卡的功能,并不关心声卡内部的工作原理,因为声卡是由电子厂商所提供,是自成一体的。这就是封装性,无需知道封装单元内部是如何工作的。声卡的所有属性都封装在声卡中,不会扩展到声卡之外,用户无需知道其工作原理就可以使用。,3.,抽象与封装,在面向对象语言中,抽象数据类型即是“,类,”,每个类里都封装了相关的数据和操作。,例如,在银行日常业务系统中,建立了“账户”类把账户金额和交易情况封装在类的内部。这样有两个好处:,安全性:系统的其他部分不能直接获取或改变这些数据,只有通过调用类内的方法才能做到,保证数据的安全。如调用查看余额的方法来获知账户的金额,调用存取款的方法来改变金额。,可重用性:封装使得类成为功能明确、接口单一、可在各种合适的环境下都能独立工作的有机整体,可以直接或间接地用于其它的应用系统,缩短开发周期和降低各种费用。,例如,在“银行日常业务系统”中使用的“账户”类,可以应用在业务性质相似的保险公司投保理赔管理系统或者证券公司的证券交易系统中。,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4.,Java,的类,5.,在,Java,中定义和使用类,6.,域,7.,方法,4. Java,的类,Java,程序设计就是定义类的过程。,Java,中的类有两种:,系统自带的类,系统定义好的类,即,Java,类库中的类,用户可以直接使用。,用户自定义的类,用户针对具体问题来定义的类,也就是,Java,程序设计的过程。,4. Java,的类,系统定义的类:即,Java,类库中的类。,Java,类库:类库是,Java,语言的重要组成部分,是一组由其他开发人员或软件供应商编写好的,Java,类,每个类通常对应一种特定的基本功能和任务。用户在编写自己的,Java,程序时如果需要完成某一功能,可以直接利用这些现成的类库,不需要从头编写。,Java,的类库大部分是由,SUN,公司提供的。以下简单介绍,JDK1.5,的类库。,根据实现功能的不同,系统定义好的类可以划分成不同的集合。每个集合是一个包,合称为类库。,Java,的类库是系统提供的已实现的标准类的集合,可以帮助用户方便、快捷地开发,Java,程序。,4. Java,的类,(1),java.lang,包,java.lang,包是,Java,语言的核心类库,包含了运行,Java,程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。每个,Java,程序运行时,系统都会自动地引入,java.lang,包,所以这个包的,加载是缺省,的。,(2),java.io,包,java.io,包是,Java,语言的标准输入,/,输出类库,包含了实现,Java,程序与操作系统、用户界面以及其他,Java,程序做数据交换所使用的类,如基本输入,/,输出流、文件输入,/,输出流、过滤输入,/,输出流、管道输入,/,输出流、随机输入,/,输出流等。凡是需要完成与操作系统有关的较底层的输入输出操作的,Java,程序,都要用到,java.io,包。,(3),java.util,包,java.util,包包括了,Java,语言中的一些低级的实用工具,如处理时间的,Date,类,处理变长数组的,Vector,类,实现栈和杂凑表的,Stack,类和,HashTable,类等,使用它们开发者可以更方便快捷地编程。,4. Java,的类,(4),java.awt,包,java.awt,包是,Java,语言用来构建图形用户界面,(GUI),的类库,它包括了许多界面元素和资源,主要在三个方面提供界面设计支持:低级绘图操作,如,Graphics,类等;图形界面组件和布局管理,如,Checkbox,类、,Container,类、,LayoutManager,接口等;以及界面用户交互控制和事件响应,如,Event,类。利用,java.awt,包,开发人员可以很方便地编写出美观、方便、标准化的应用程序界面。,(5),java.awt.event,包,java.awt.event,包使得程序可以用不同的方式来处理不同类型的事件,使每个图形界面的元素本身可以拥有处理它上面事件的能力。,(6),java.applet,包,java.applet,包是用来实现运行于浏览器中的,Java Applet,的工具类库,它包含几个接口和一个重要的类:,java.applet.Applet,。,4. Java,的类,(7),包,包:实现网络功能。如实现套接字通信的,Socket,类、,ServerSocket,类;编写用户自己的,Telnet,、,FTP,、邮件服务等实现网上通信的类;用于访问,Internet,上资源和进行,CGI,网关调用的类,如,URL,等。利用,包中的类,开发者可以编写自己的具有网络功能的程序。,(8),java.sql,包,java.sql,包:实现,JDBC,,使,Java,程序能够访问不同种类的数据库,如,Oracle,,,Sybase,,,DB2,,,SQLServer,等。只要安装了合适的驱动程序,同一个,Java,程序不需修改就可以存取、修改这些不同的数据库中的数据。,JDBC,的这种功能,再加上,Java,程序本身具有的平台无关性,大大拓宽了,Java,程序的应用范围,尤其是商业应用的适用领域。,4. Java,的类,(9),java.rmi,包,来实现,RMI,功能。利用,RMI,功能,用户程序可以在远程计算机,(,服务器,),上创建对象,并在本地计算机,(,客户机,),上使用这个对象。,(10),java.security,包,对,Java,程序加密,提供更完善的,Java,程序安全性控制和管理。,4. Java,的类,使用类库中系统定义的类:,继承系统类:在用户程序里创建系统类的子类,例如每个,Java Applet,的主类都是,java.applet,包中的,Applet,类的子类。,创建系统类的对象:例如在图形界面程序中要接受用户的输入,可以创建一个系统类,TextField,类的对象来进行。,直接使用系统类:例如向系统标准输出输出字符串时使用的方法,System.out.println,(),就是系统类,System,的静态属性,out,的方法。,import,java.applet,.*;,import,java.awt,.*;,import,java.awt.event,.*;,public class,AppletInOut,extends Applet implements,ActionListener,Label,prompt;,TextField,input,output,;,public void init(),prompt = new Label(,请输入您的名字,: );,input = new TextField(6);,output = new TextField(20);,add(prompt,);,add(input,);,add(output,);,input.addActionListener(this,);,public void,actionPerformed(ActionEvent,e),output.setText(input.getText,()+,,欢迎你!,);,继承系统类,创建系统的类对象,导入系统类,4. Java,的类,使用系统类的前提条件:该系统类是用户程序可见的类。为此用户程序需要用,import,语句引入它所用到的系统类或系统类所在的包。,例如:,分别引入,java.awt,包和,java.awt.event,包的所有类。,类库中的程序都是字节码形式的类,利用,import,语句将一个包引入到程序里,相当于在编译过程中将该包中所有系统类的字节码加入到用户的,Java,程序中,这样用户程序就可以使用这些系统类及其中的各种功能。,import,java.awt,.*;,import,java.awt.event,.*;,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4. Java,的类,5.,在,Java,中定义和使用类,6.,域,7.,方法,5.,在,Java,中定义和使用类,系统定义的类实现了许多常见的功能,但是在程序设计过程中,程序员仍然需要针对特定问题的特定逻辑来定义自己的类。,用户程序定义自己的类有定义类头和定义类体两个步骤,其中类体又由属性,(,域,),和方法组成。,public class,PhoneCard, long,cardNumber,;,private,int,password;,double balance;,String,connectNumber,;,boolean,connected;,boolean,performConnection(long,cn,int,pw),if(,cn,=,cardNumber,& pw = password ), connected = true;,return true; ,else connected = false;,return false; ,double,getBalance,(),if(connected,),return balance;,else,return -1;,void,performDial,(),if(connected,),balance -= 0.5;,类头,静态属性,-,域,动态属性,-,方法,类体,类定义,5.,在,Java,中定义和使用类,类的定义:即类的声明。通过类,用户可以定义自己需要的数据类型。,定义类的语法为:,其中,,class,关键字标明此定义为类,中括号里的内容为可选内容。,例:,public class,AppletInOut,extends Applet implements,ActionListener,类修饰符, class,类名,extends,父类名, implements,接口名序列,5.,在,Java,中定义和使用类,类修饰符:,abstract,:抽象类,说明该类不能被实例化。,final,:最终类,说明该类不能被继承,即没有子类。,public,:公共类,说明该类可以被所有的类访问和引用。,类修饰符, class,类名,extends,父类名, implements,接口名序列,5.,在,Java,中定义和使用类,抽象类:没有具体对象的概念类,表示一个抽象的概念,不能实例化。,“动物”:多细胞生物,有固定的身体结构,可生长、运动、发声等等,“人”是一种“动物”,“马”是一种“动物”,“鸟”是一种“动物”,抽象类的作用:表示抽象的概念;建立类之间的关系,在产生子类的同时为子类定义好某些特定的属性和方法。,不存在某个动物,既不是人,也不是马,又不是鸟,,.,5.,在,Java,中定义和使用类,最终类:,final,修饰,不能被继承,即没有子类。,通常是一些有固定作用、用来完成某种标准功能的类。,例如:,5.,在,Java,中定义和使用类,类体:定义了该类所有的属性,(,域,),和该类所提供的方法。,定义类体的语法:,修饰符,变量类型 属性名,1,;,修饰符,变量类型 属性名,2,;,修饰符,返回类型 方法名,1(,参数列表,) throw ,异常列表, ,/,方法体,修饰符,返回类型 方法名,2(,参数列表,) throw ,异常列表, ,/,方法体,5.,在,Java,中定义和使用类,使用类,:创建该类的对象。,格式:,含义:首先说明新建对象所属的类名,然后说明新建对象的名字,最后用,new,为新建对象开辟内存空间,并调用构造函数对对象进行初始化。,像声明变量需要为变量开辟内存空间保存数据一样,创建对象也需要为对象开辟内存空间保存该对象的数据。,例:,PhoneCard,myCard,= new,PhoneCard,();,类名 对象名 ,new,构造函数,( ),;,5.,在,Java,中定义和使用类,访问或调用某个对象的属性或方法:,例如:,myCard.balance,= 50.0;,myCard.performConnection(1234L,5678);,对象名,.,属性名,/,方法名,(,参数,),5.,在,Java,中定义和使用类,构造函数,:创建对象时将调用这个对象的构造函数完成对象的初始化工作。声明变量时可以用赋值语句为它赋初值,而一个对象可能包括若干个域,需要若干个赋值语句,把若干个赋初值的语句组合成一个方法在创建对象时一次性同时执行,这个方法就是构造函数。,构造函数的名字与类相同,,new,算符开辟了新建对象的内存空间之后,将调用构造函数对新建对象进行初始化。,5.,在,Java,中定义和使用类,构造方法是一种特殊的方法,具有以下特点: (,1,)构造方法的方法名必须与类名相同。 (,2,)构造方法没有返回类型,也不能定义为,void,,在方法名前面不声明方法类型。 (,3,)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。 (,4,)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。 (,5,)构造方法可以重载,以参数的个数、类型或排列顺序区分。,(,6,)构造方法不能由编程人员调用,而要系统调用。,public class,PhoneCard, long,cardNumber,;,private,int,password;,double balance;,String,connectNumber,;,boolean,connected;,PhoneCard(,long,cn,int,pw, double,b,String,s,),cardNumber,=,cn,;,password =,pw,;,balance = b;,connectNumber,= s;,connected = false;,boolean,performConnection(long,cn,int,pw),double,getBalance,(), ,void,performDial,(),PhoneCard,newCard,= new,PhoneCard(,12345678L,1234,50.0,”300”,);,如果用户自定义类未定义类的构造函数,系统将为这个类缺省定义一个空构造函数,没有形式参数,也没有任何具体语句,不完成任何操作。,if(pw=123456), System.out.println(“too simple”);,System.exit(1); ,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4. Java,的类,5.,在,Java,中定义和使用类,6.,域,7.,方法,6.,域,域,:是类和对象的静态属性,通常描述类的状态。,定义域的语法:,变量类型:基本数据类型、类、数组、接口,定义域的操作就是说明变量或创建对象的操作。,例:,修饰符,变量类型 属性名;,long,cardNumber,;,private,int,password;,double balance;,String,connectNumber,;,boolean,connected;,6.,域,域修饰符:,public,:说明该属性在任何地方可见,private,:该属性只在本类中可见,protected,:该属性在本包和子类中可见,static,:静态域,该属性为类的属性,final,:该属性的值在程序执行过程中保持不变,修饰符,变量类型 属性名;,6.,域,静态域,:用,static,修饰符修饰,特点:是类的域,不属于任何一个类的具体对象。它不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元。,对于该类的任何一个对象而言,静态域是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值;同样任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作。,class PhoneCard200,static String,connectNum,= 200;,static double,additoryFee,;,long,cardNum,;,private String password = *;,double balance;,public class,TestStaticFiled,public static void,main(String,args,) ,PhoneCard200 card1 = new PhoneCard200();,PhoneCard200 card2 = new PhoneCard200();,card1.additoryFee = 0.1;,System.out.println(card1,的附加费:,+card1.additoryFee);,System.out.println(card2,的附加费:,+card2.additoryFee);,System.out.println(PhoneCard200,的附加费:,+,PhoneCard200.additoryFee,);,card2.additoryFee = 0.2;,System.out.println(card1,的附加费:,+card1.additoryFee);,System.out.println(card2,的附加费:,+card2.additoryFee);,System.out.println(PhoneCard200,的附加费:,+,PhoneCard200.additoryFee,);,6.,域,最终域,:用,final,修饰,取值在程序的整个执行过程中都不会改变。,例如:,用,final,修饰符声明域时,需要注意:,(1),需要说明该最终域的数据类型。,(2),需要指出该最终域的具体取值。,(3),由于所有类对象的最终域的数值都固定一致,通常声明为,static,。,class PhoneCard200,static final String CONNECT_NUM = 200;,static double,additoryFee,;,class PhoneCard200,static final String,connectNum,= 200;,static double,additoryFee,;,long,cardNum,;,private String password = *;,double balance;,public class,TestFinalField,public static void,main(String,args,) ,PhoneCard200 card1 = new PhoneCard200();,System.out.println(PhoneCard200,的,connectNum:+PhoneCard200.connectNum);,card1.connectNum = 201;,1.,面向对象思想,2.,面向对象的优点,3.,抽象与封装,4. Java,的类,5.,在,Java,中定义和使用类,6.,域,7.,方法,7.,方法,方法,:类的动态属性,说明类具有的功能和操作。,定义方法的语法格式:,例:,修饰符,返回类型 方法名,(,参数列表,) throw,异常列表,方法体各语句;,public static void,main(String,args,) ,PhoneCard200 card1 = new PhoneCard200();,System.out.println(PhoneCard200,的,connectNum,);,7.,方法,定义方法的目的:定义具有相对独立和常用功能的模块,使程序结构清晰,利于模块在不同场合的重复利用。,public class,PerfectNum,public static void,main(String,args,) ,for (,int,i = 1; i 1000; i+),if (,isPerfect(i,),),System.out.print(i,+,String.valueOf(t,);,System.out.println,();,static,boolean,isPerfect(int,x) ,int,y = 0;,for (,int,i = 1; i x; i+),if (x % i = 0),y += i;,if (y = x) return true;,else return false;,调用方法,7.,方法,方法修饰符:,public,:共有方法,该方法可被任何类中的方法访问,private,:私有方法,只能被本类中的方法访问,protected,:可被本类和子类中的方法访问,abstract,:抽象方法,必须在子类中重载,static,:类方法,final,:最终方法,不能被子类改变(不能重载),native,:本地方法,synchronized,:同步方法,7.,方法,抽象方法,:,abstract,修饰,仅有方法头,而没有具体的方法体和操作实现的方法。,例如 “动物”:多细胞生物,有固定的身体结构,可生长、运动、发声,“人”是一种“动物”,“马”是一种“动物”,“鸟”是一种“动物”,可以为抽象类,Animal,定义一个没有方法体的抽象方法:,abstract void sound ( ) ;,至于方法体的具体实现,则留到当前类的不同子类在它们各自的类定义中完成。也就是说,各子类在继承了父类的抽象方法之后,分别在子类中用不同的语句和方法体来重新定义它,形成若干个名字相同,返回值相同,参数列表也相同,目的一致但是具体实现不同的方法。,统一接口,7.,方法,抽象方法,:必须存在与抽象类之中,在非抽象类中出现抽象方法是非法的。也即,一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。,abstract class,AClass,int,a1;,float a2;,abstract void a1();,public void a2(), ,abstract void a3();,abstract class,BClass,extends,AClass,void a1(),abstract void a3();,class,CClass,extends,AClass,void a1(),void a3(),7.,方法,静态方法,:用,static,修饰,是属于整个类的类方法。,使用静态方法注意:,调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;,非,static,的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而,static,的方法是属于整个类的,将随着类的定义分配和装载,不被任何一个对象专有;,由于,static,方法是属于整个类的,只能处理属于整个类的成员变量,不能操纵和处理属于某个对象的属性,即,,static,方法只能处理,static,域,。,public class,TestStaticMethod,public static void,main(String,args,) ,Integer i = new Integer(25);,System.out.println(i.intValue,()*2);,System.out.println(i.floatValue,();,System.out.println(i,=+,i.toString,();,System.out.println(Integer.parseInt(100)*2);,System.out.println(100*2=+Integer.toString(100*2);,System.out.println(Integer.valueOf(100).intValue()*2);,System.out.println(Integer.MAX_VALUE,);,System.out.println(Integer.MIN_VALUE,);,public,int,intValue,(),public static,Integer,valueOf,(,String,s) throws,NumberFormatException,7.,方法,最终方法,:用,final,修饰,功能和内部语句不能被更改,即是不能被子类重新定义。,在面向对象的程序设计中,子类可以把从父类继承的某个方法改写并重新定义,形成同父类方法同名、解决的问题也相似、但具体实现和功能却不一致的方法,这个过程称为重载。,如果类的某个方法被,final,修饰符所限定,则该类的子类就不能再重新定义与此方法同名的自己的方法,只能使用从父类继承来的方法。,作用:固定这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证程序的安全性和正确性。,类、属性、方法的,访问控制符,:限定类、域或方法是否可以被程序里的其他部分访问和调用。,无论修饰符如何定义,一个类总能够访问和调用它自己的域和方法,但是这个类之外的其他部分能否访问这个域或方法,要看域和方法以及它所属的类的访问控制符。,类的访问控制符只有一个,public,,域和方法的访问控制符有四个,分别为,public,、,private,、,protected,,和“缺省,”,。,类的访问控制,:,包:是类的一种松散的集合,,Java,通过包的概念来组织类的。,处于同一个包中的类可以不需任何说明地互相访问和引用。,在不同包中的类,一般说来,它们相互之间不能互相引用。,public,公有类可以通过,import,语句被其他包中的类访问,其他包中的类在程序中使用,import,语句引入,public,类,就可以访问这个类。,缺省(无访问控制符),public,同一包中的类,可访问,可访问,不同包中的类,不可访问,可访问(需要,import,),属性和方法的访问控制,:规定了属性和方法可否被本类之外的其他类访问。,public,成员:可以被所有类访问(需要,import,),private,成员:不能被任何其它类访问(只能被本类访问),protected,成员:可以被子类、同一包中的类、本类访问,缺省成员:可以被同一包中的类、本类访问,public,类中,属性和方法的访问控制,:规定了属性和方法可否被本类之外的其他类访问。,public,成员:可以被同一包中的类访问,private,成员:不能被任何其它类访问(只能被本类访问),protected,成员:可以被同一包中的类访问,缺省成员:可以被同一包中的类访问,缺省类中,package1,public,ClassA,ClassB,public TestP1,public,int,a;,private,int,b;,protected,int,c;,int,d;,public,int,a;,private,int,b;,protected,int,c;,int,d;,package2,public,ClassC,ClassD,public,int,a;,private,int,b;,protected,int,c;,int,d;,public,int,a;,private,int,b;,protected,int,c;,int,d;,ClassA,classA,;,ClassB,classB,;,ClassC,classC,;,ClassD,classD,;,classA.a,;,classA.b,;,classA.c,;,classA.d,;,classB.a,;,classB.b,;,classB.c,;,classB.d,;,classC.a,;,classC.b,;,classC.c,;,classC.d,;,classD.a,;,classD.b,;,classD.c,;,classD.d,;,
展开阅读全文