版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
类和对象12问题:爷爷要一个苹果问题解决面向对象范式问题:程序需要从键盘输入“苹果”求解:classT{publicstaticvoidmain(String[]args)Scannersc=newScanner(System.in);Stringapple=sc.next();System.out.print(apple);}}3爷爷孙子设计Java程序的一般步骤Java程序就是一些类的集合。设计Java程序的一般步骤如下:设计类,假设类的名字为A,通常一个类保存到一个.java源文件中,如A.java;使用类A。有三个步骤:声明类型为A的引用类型变量;使用保留字new调用类A的构造方法创建对象;通过引用变量访问对象的成员。设计main方法,运行程序4内容3.1类的声明 3.2创建对象 3.3访问对象 3.4对象的字符串表示 3.5方法的调用和返回 3.6重载 3.7类变量和实例变量 3.8静态方法和实例方法3.9命令行参数 5问题:给定任意一个圆,计算面积6三个圆:三个对象问:什么是圆?现实世界的对象平面形状在一平面内到定点的距离等于定长的点的集合叫做圆(circle)。定点称为圆的圆心。定长称为圆的半径。
7问题:计算任意一个圆的面积
8问题:计算任意一个圆的面积如何让计算机求解?进一步抽象抽:抽取象:感知的事物表象从具体到抽象从个体到一般
9问题:计算任意一个圆的面积10Circleradius:doublegetArea():double类名类的属性类的行为用程序设计语言Java实现111public
classCircle{
2
intradius;
3
doublegetArea(){
4
returnMath.PI*radius*radius;
5}
6}类名成员变量成员方法问题:给定任意一个圆,计算面积12publicclassTestCircle{publicstaticvoidmain(String[]args){//创建圆对象Circlec1=newCircle();c1.radius=1;System.out.println(c1.getArea());
Circlec2=newCircle();c2.radius=2;System.out.println(c2.getArea());}}类与源文件一个类,如Circle,对应一个源文件Circle.java一个源文件(也称为编译单元)中可以有多个类,但至多有一个类为public13类与源文件演示:把类Circle的定义放在源文件TestCircel.java中143.1类的声明类是对象的抽象表示,相当于一个概念;而对象是类的实例,相当于一个具体的事物。例如,“汽车”是一个“类”,包含了品牌、型号、排量、加速、刹车等特征某一辆具体的小汽车就是“汽车”这个类的一个实例。对象具有唯一的标识(identity)、状态(state)、和行为(behavior)对象的状态是由其成员变量(membervariable)以及这些成员变量当前的值表示。成员变量定义了对象的属性。对象的行为由一系列方法(method)来定义。调用对象上的方法意味着请求该对象完成一项工作。15小汽车类Car的声明属性车牌号码licenceNumber车身外廓尺寸长length宽width高height当前行驶速度speed行为加速accelerate外廓尺寸getOverallSize鸣笛honk16声明类Car17成员变量的初值如果在声明成员变量的时候程序员没有显式地给出成员变量的初值,那么Java会自动使用默认的初始值进行赋值。18注意类体中通常会声明若干的成员变量,通常声明为private类体中一般声明若干成员方法,且通常声明为public访问对象成员访问运算符“.”c.radius=2;c.getArea();19访问修饰符成员变量前的访问修饰符private的意思是仅仅在本类中可视,称为类私有变量如果没有访问修饰符,则使用默认的“包私有”可访问性访问修饰符public表示公共访问,没有限制20声明方法<访问修饰符><返回值类型><名字>(<形式参数序列>){<语句序列>}21方法签名<形式参数序列>是若干个逗号隔开的<类型><形式参数名><返回值类型>、<名字>和(<形式参数序列>)合起来称为方法头部(methodhead)方法头部中,<名字>和<形式参数类型序列>合起来称为方法签名(methodsignature),唯一标识了同一类中的方法。<形式参数类型序列>是逗号隔开的若干形式参数类型,不含形式参数名。例如构造方法Car(StringlicenceNumber,intlength,intwidth,intheight,intspeed)的形式参数类型序列是(String,int,int,int,int)。形式参数的名字、<访问修饰符>以及<返回值类型>不在方法签名中。形式参数的个数不同、对应参数类型不同,那么方法签名也不同。使用方法签名名作为方法的标识,使得同一个类中可以声明多个相同名字的方法。22构造方法在类体中一般还需要声明用以实例化对象的构造方法(constructor),也称为构造器。构造方法仅仅在实例化对象的语句中被调用,一般用来初始化成员变量。构造方法的方法头部与一般的成员方法相似,不同之处有二:其一,构造方法没有声明返回值类型;其二,构造方法的名字与类名相同。23构造方法如果在一个类中没有声明构造方法,则是使用默认的无参构造方法;一旦在类中声明了构造方法,无论该构造方法有无参数,该类就不再使用默认的无参构造方法。类Car中声明了一个有参构造方法Car(StringlicenceNumber,intlength,intwidth,intheight,intspeed)24CarDemo.java注意为一个类声明构造方法是可选的。如果在一个类中没有声明构造方法,那么Java会为该类提供一个默认的构造方法。该默认的构造方法是个无参构造方法。一旦在类中声明了构造方法,无论该构造方法有无参数,则Java就不再为该类提供构造方法。25构造方法一般类声明中会有2个以上的构造方法,这样为实例化对象提供的不同的方式。263.2创建对象声明了类就为创建对象准备好了模板。有了类,就可以根据类创建对象了。模板是对一个事物的抽象描述;而对象是具体的一个事物。创建对象意味着在Java的世界里多了一个事物,创建对象也意味着在计算机的存储空间中为对象分配一块区域。在Java程序运行时刻有两块内存区域:一是栈(Stack),在栈中存放方法中定义的基本类型变量和对象的引用变量;另一是堆(Heap),堆里用来存放对象。27创建对象28ObjectCreation.java创建对象创建一个对象需要做三件事情:声明(Declare)引用变量实例化(Instantiate)对象初始化(Initialize)对象。29读作:创建类型为Car的对象,并将其引用赋值给变量a。创建对象声明引用变量意味着在栈空间分配一个变量,并使用一个名字标识该变量;该变量中允许存放指定类型的对象的堆空间引用。实例化的含义是使用运算符new为对象分配堆存储空间。初始化的含义是调用构造方法执行相应的初始化操作。30创建对象31也可以分成两条语句完成对象创建:
Cara;a=newCar(4481,1746,1526);注意new仅仅为允许作为对象成员变量的类中声明的那些成员变量分配存储空间作为新创建对象的存储空间,这些成员变量称为实例变量对象的存储空间中没有成员方法和构造方法构造方法Car(intlength,intwidth,intheight)中的形式参数与成员变量一一对应,称为“全参数构造方法”32访问对象创建了对象并通过a来引用该对象让a所引用的对象执行方法honk()输出字符串“嘀嘀”;让a所引用的对象执行方法getOverallSize()返回并输出汽车的外廓尺寸“4481×1746×1526”33ObjectVisit.java访问对象访问对象的语句:
a.honk();
读作“让对象a执行方法honk”或者读作“调用对象a的方法honk”34访问对象
<对象引用>.<方法名>()如果该方法声明了形式参数,则调用时需要给出相应的实在参数(argument):
<对象引用>.<方法名>(<参数序列>)35访问对象访问对象的成员变量:<对象引用>.<成员变量>通常成员变量声明为类私有的,只能通过成员方法间接访问。36访问对象读写对象的成员变量、执行对象的方法统称为访问对象的成员。访问对象的成员使用成员访问运算符“.”。37访问对象381publicclassObjectVisit{2publicstaticvoidmain(String[]args){3Cara=newCar(4481,1746,1526);4a.honk();5System.out.println(a.getOverallSize());6}7}访问对象在对象的构造方法中和对象的成员方法中如何访问该对象的成员变量呢?第14行到第18行声明了一个构造方法,该方法把长、宽、高三个实在参数赋值给成员变量。在方法体中就需要访问成员变量,此时尚没有对象引用,如何“通过对象引用来访问成员”呢?39保留字thisthis引用“当前对象”当前对象指正在执行本方法的对象40构造方法中的this引用正在由保留字new创建的对象。第3行中的保留字new后面是对第14行构造方法的调用,调用时传递了三个参数,然后控制转移到第15行开始执行,第15行this.length=length把实在参数length赋值给正在创建的对象的成员变量length。ObjectVisit.java保留字this在对象的方法中访问成员变量仍然需要通过对象引用,仍然使用保留字this。例如在第20行的getOverallSize()方法中需要读取三个成员变量,应该写作:41publicStringgetOverallSize(){returnthis.length+"×"+this.width+"×"+this.height;}此时this引用的是在第5行a.getOverallSize()中的a所引用的对象。通常把方法体中的this省略以提高可读性。保留字this通过this()在构造方法中显式地调用一个构造方法。42Car.java在构造方法的方法体中,this()必须是第一条语句3.4对象的字符串表示System.out.pirntln输出:初值为45整型变量a引用字符串对象“ABC”引用类型变量s引用Car对象的引用变量c43ObjectByPrintln.java45ABCCar@28a418fc在内存地址28a418fc处的Car对象期望的输出形如:Car[length:4481,width:1746,height:1526]toString方法那么就需要在Car类中增加一个头部为publicStringtoString()的方法44ObjectByString.javatoString方法语句:System.out.println(a);等价于语句:System.out.println(a.toString());45代词:我在课堂上,师生问答场景任课老师:张三同学请回答什么是正方形?张三:我不会任课老师:李四同学请回答李四:我不会46“我”是张三还是李四?“我”是正在回答问题的同学getter和setter汽车类Car是对现实世界实体的抽象,称为实体类。实体类一般声明为public,并单独保存在一个.java源文件中。实体类的所有成员量声明为private,针对每个私有成员变量都声明一对的public的set()和get()方法用来访问私有成员变量,这些方法称为getter和setter。例如在源文件3.7中第24行至第29行声明了用于访问私有成员变量length的getter和setter。第5行使用setter设置了成员变量的值为4567,第6行通过getter读取变量的值47GetterSetter.javagetter和settergetter和setter方法的名字约定为getXxx和setXxx,其中Xxx是成员变量的名字,首字母大写。当成员变量是boolean类型时,getter方法的名字约定为isXxx。比如假设有boolean类型的成员变量marriaged,那么其getter方法的头部就是booleanisMarriaged()483.5方法的调用和返回调用方法会把控制流转移到被调用的方法体中执行,执行完毕则返回到调用处继续执行后续语句。在进行方法调用时,需要把实在参数传递给形式参数。Java语言仅有“传值”一种方式把实在参数的值赋值给形式参数。49方法的调用和返回方法调用时,给出的参数称为实在参数(arguments);方法声明时,列出的参数称为形式参数(parameters)。实在参数赋值给形式参数的过程称为形实结合。传值(passedbyvalue)的形实结合方式就是把实参的值复制一份存放到形式参数中。形式参数与局部变量一样,当方法执行完毕,返回到调用点时就消失了50方法调用的过程1. 按照从左到右的次序对实在参数计值。允许实在参数是个表达式,所以在进行形实结合之前,首先计算出表达式的值。2. 在栈区分配一块临时的存储区域,用以存储形式参数、局部变量、调用语句下一条语句的地址、当前寄存器信息、以及其它执行方法所需的工作单元等。3. 参数传递。把实在参数的值赋值给相应的形式参数。4. 执行方法体。5. 从方法中返回。当执行了方法体中的return语句,后者执行到了方法体的末尾,释放调用时分配的栈中存储局部变量的空间,控制返回到调用语句的下一条语句处执行。如果方法声明了返回值,则把返回值放在调用者与被调用者约定的存储单元。51例52使用司机对象创建了一个汽车对象调用汽车对象的setSpeed(60)方法把车速设置为60PassingByValue.java调用setSpeed(60)前调用setSpeed(60)后例司机对象的年龄改为4653PassingByValue.java调用zhang.setAge(46)前调用zhang.setAge(46)后注意,变量zhang和汽车对象中的成员变量driver引用的是同一个对象。参数传递由于形式参数与局部变量一样,所以对形式参数的任何改变仅仅在方法体执行期间有效。一旦方法执行完毕,形式参数和局部变量一样,随着临时存储空间的释放而消失了。所以,对应基本数据类型的形式参数,方法体中对其做的任何改变,都将随着方法的返回而丢失。而对于引用类型的形式参数,由于形式参数仅仅从实在参数得到一份对象的引用,使得在方法执行期间,实在参数和形式参数同时引用了同一个对象。即便形式参数随着方法的返回而消失,调用者仍然可以通过实在参数访问对象。54例:交换数组中任意两个元素55ArrayAsParameter.java调用swap前调用swap后例:交换数组中任意两个元素56形式参数由于形式参数与局部变量一样,所以对形式参数的任何改变仅仅在方法体执行期间有效。一旦方法执行完毕,形式参数和局部变量一样,随着临时存储空间的撤销而消失了所以,对应基本数据类型的形式参数,方法体中对其做的任何改变,都将随着方法的返回而丢失57注意而对于引用类型的形式参数,由于形式参数仅仅从实在参数得到一份对象的引用,相当于在方法执行期间,实在参数和形式参数同时引用了同一个对象。即便形式参数随着方法的返回而消失,调用者仍然可以通过实在参数访问对象。58方法的返回方法有两种正常流程的返回方式:方法体中的所有语句全部执行完毕执行return语句。还有一种异常返回方式,即执行方法体期间的某条语句时抛出了异常,而该方法又声明由调用者处理异常。59从方法中返回用于从一个无返回值的方法中返回调用者的return语句形式如下:
return;
如果方法声明需要返回值,那么就把返回值放在return保留字的后面:
return<返回值>;
返回值类型为void的方法没有必要一定通过return语句返回。60从方法中返回方法不仅能够返回一个基本类型的值也能返回一个对象引用613.6方法的重载Java支持方法重载(overloading)即允许在同一个类中声明具有相同名字的方法,但这些方法的签名必须不同62PrintWriter类重载的println()方法java.io.PrintWriter.println()java.io.PrintWriter.println(boolean)java.io.PrintWriter.println(char)java.io.PrintWriter.println(char[])java.io.PrintWriter.println(double)java.io.PrintWriter.println(float)java.io.PrintWriter.println(int)java.io.PrintWriter.println(java.lang.Object)java.io.PrintWriter.println(java.lang.String)java.io.PrintWriter.println(long)63重载方便了使用,使得程序简洁publicstaticvoidmain(String[]args){inti=0;doubled=3.14;longl=1;Circlec=newCircle(2);System.out.println(i);System.out.println(d);System.out.println(l);System.out.println(c);}64否则,65java.io.PrintWriter.println()java.io.PrintWriter.printlnBoolean()java.io.PrintWriter.printlnChar()java.io.PrintWriter.printlndouble()java.io.PrintWriter.printlnFloat()java.io.PrintWriter.printlninteger()java.io.PrintWriter.println(Long)java.io.PrintWriter.printlnObject()java.io.PrintWriter.printlnString()眼花缭乱的程序publicstaticvoidmain(String[]args){inti=0;doubled=3.14;longl=1;Circlec=newCircle(2);System.out.printlnInteger(i);System.out.printlnDouble(d);System.out.printlnLong(l);System.out.printlnObject(c);}66例声明了方法签名为f(int)和f(int,int)的方法二者方法名都是f,但一个参数类型序列是int;另一个参数类型序列是int,int两个序列不同,所以两个方法签名不同后者重载了前者。67OverloadDemo.java例第8行声明的方法虽然与其名字相同,返回值类型不同,但是方法签名是f(int,int),方法签名相同此处会出现编译错误消息第11行声明的方法尽管形式参数名与第5行的方法不同,但方法签名仍然相同所以仍然造成编译错误第20行的方法g与第17行的方法g虽然访问修饰符不同,但方法签名相同所以编译时会出现编译错误信息68注意方法的访问权限、返回类型、抛出的异常、以及方法的异常类型和数目不会对重载造成影响693.7类变量和实例变量Java通过对象协作完成工作在开始协作之前,首先根据类创建对象那么,创建对象之前,就得把类装载到内存当然,类只需装载一次即下次使用该类时,如果已经装载,则不必重新装载。70类变量和实例变量如果类的成员变量特别声明在装载类时为其分配存储而不是创建对象时为其分配存储,则这些成员变量就称为静态变量(staticvariable)或者类变量(classvariable)。类变量随着类的加载而产生,当程序运行结束才消亡。71类变量和实例变量而那些创建对象时才分配存储的变量称为实例变量(instancevariable)。实例变量随着某个对象创建而产生,随着该对象的消亡而消亡。72类变量和实例变量如果在类的成员变量声明语言中使用了static修饰符,则该变量就是静态变量;否则就是实例变量73例74publicclassGlobal{publicstaticintMAX=1024;publicstaticdoublePI=3.141592653589793;}当需要在整个应用程序范围共享某个变量时,可以声明为静态成员变量1publicclassStaticVarDemo{2publicstaticvoidmain(String[]args){3System.out.println(Global.PI);4}5}访问类成员变量类名和成员访问运算符“.”:
<类名>.<静态变量>所属类中访问,可以省略类名75类变量(静态变量)静态变量的初始化一般有两种方式:声明时初始化静态初始化块76静态变量的初始化77publicclassGlobal{publicstaticintMAX=1024;publicstaticdoublePI=3.141592653589793;}publicclassGlobal{publicstaticintMAX;static{MAX=1024;}}静态块中把静态变量MAX初值设置为1024在声明静态变量MAX时就可以将其初值设置为1024实例变量没有使用static保留字修饰的成员变量称为实例变量通过对象引用访问对象成员78实例变量初始化声明时初始化对象创建时初始化通过方法调用初始化79声明时初始化80publicclassA{privateintaMember=1; publicvoidaMethod(){}}创建对象时初始化81classA{privateintaMember;A(inti){aMember=i;}}通过方法调用初始化82classA{intaMember;voidaMethod(inti){aMember=i;}}要点实例变量必须创建对象后才可以通过这个对象的引用变量来访问静态变量则可以直接使用类名来访问静态变量不属于任何对象,而仅属于类,所以也称为类变量只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被访问了。83变量的生命周期静态变量、实例变量和局部变量是Java程序中常见的三种变量。这些变量的生命周期不同:静态变量随着类的加载而产生,随着的类的回收而消失;实例变量随着对象的创建而产生,随着对象的回收而消失。在方法体中声明的局部变量则随着方法的调用而出现在栈中,随着方法的返回而消失。方法的形式参数属于局部变量。84默认初值静态变量和实例变量都是成员变量,具有默认初值局部变量没有默认初值,必须显式初始化85变量的作用域块变量局部于其所在的块块可以嵌套,但不可以交错。可以访问某个变量的块形成了该变量的作用域。86第10行试图访问变量b,则会出现编译错误1classBlockDemo{2staticinta;34{5intb=0;6}78publicstaticvoidmain(String[]args){9System.out.println(a);10System.out.println(b);11}12}共有3个块变量的作用域第11行访问的x是在第2行声明的x,而不是在第6行for循环体中声明的x,因为后者仅作用于for循环体;而前者的作用域是类体,含类体中的所有块。第17行访问的x是在第16行声明的x,而不是在第2行声明的x,这种现象称为“就近原则”。87ScopeOfVariable.javaxintheforloop:5xintheforloop:5xintheforloop:5iisnow:3xintheclass:2xinaMethod:1变量的作用域第6行在for循环语句的循环体里声明了局部变量x,那么这个x就与第2行声明成员变量x是两个不同的变量。按照“就近”原则,该循环体访问x的语句访问的是局部变量x,而不是成员变量x。由于当进入块的时候才创建局部变量,所以在3次循环中的每次循环都创建局部变量x。当块执行完毕,该块中的局部变量消失,所以3次循环中的每次循环结束,x都消失883.8静态方法和实例方法如果在成员变量的声明中增加了sta
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026护理职业考试题及答案
- 2026云南红河州弥勒市紧密型县域医共体江边分院招聘合同制护士及办公室人员3人备考题库附答案详解(a卷)
- 2026安徽黄山市徽城投资集团有限公司招聘3人备考题库附答案详解(精练)
- 2026贵州医科大学招聘专职辅导员(非事业编制)10人备考题库附答案详解(考试直接用)
- 2026年上半年广西体育高等专科学校招聘32人备考题库附答案详解(综合卷)
- 2026山东菏泽市定陶区两夹弦非遗保护传承中心招聘事业工作人员备考题库附答案详解(巩固)
- 2026甘肃兰炭医院招聘2人备考题库附答案详解(综合题)
- 2026中国铁塔夏季校园招聘备考题库附答案详解(突破训练)
- 2026广东江门市五邑通智能卡有限公司招聘1人备考题库及答案详解(有一套)
- 2026广东珠海市香洲凤凰幼教集团上冲园区招聘合同制教职工2人备考题库及参考答案详解一套
- (2025)专家共识:意向性牙再植术课件
- 2025年中国人民人寿保险股份有限公司社会招聘笔试题库附带答案
- 蒋竞雄长身高管理
- 水泥路面施工质量方案
- 2025年数字媒体艺术历年真题及答案
- 四川成都空港兴城投资集团有限公司招聘笔试题库2025
- 民用航空器维修执照考试题库及答案
- 2025四川省公安厅警务辅助人员招聘笔试备考试题及答案解析
- 2026国考与省试题及答案
- 棉纺厂安全考试题及答案
- 装卸工安全责任制
评论
0/150
提交评论