Java程序设计基础 课件 第6章 OOP-p1_第1页
Java程序设计基础 课件 第6章 OOP-p1_第2页
Java程序设计基础 课件 第6章 OOP-p1_第3页
Java程序设计基础 课件 第6章 OOP-p1_第4页
Java程序设计基础 课件 第6章 OOP-p1_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

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

文档简介

第6章面向对象程序设计(上)1教学目标(1) 理解面向过程抽象与面向对象抽象(2) 理解面向对象三大特征(3) 理解类与对象的关系,能够定义类、创建对象和访问对象成员(4) 理解UML类图(5) 理解静态成员概念,能使用静态成员(6) 理解模块、包、public、private等对访问权限的影响(7) 理解数据域封装(8) 理解变量作用域(9) 理解和应用对象作为方法参数和作为方法返回值,能使用var定义局部变量。(10) 理解对象数组,能使用对象数组(11) 理解this关键字的含义,能使用this引用隐藏数据域和调用构造方法(12) 能使用基本数据类型包装类、BigInteger类、BigDecimal类、Date类2动机在信息技术发展过程中,早期的软件规模较小,面向过程的软件开发方法就能很好地解决。随着,软件规模越来越大,问题越来越复杂,面向过程的软件开发方法不足以应对大规模和复杂性高的软件系统开发。面向过程的编程是对任务的过程分解,解决问题的思路是“走一步,看一步,遇到问题,解决问题”。面向对象解决问题并不关心问题处理过程,而是关注解决问题过程中都有哪些对象参与,给参与的对象分配相应的职责即可。3引入面向对象程序设计!!!内容46.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类内容56.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.1面向对象概述面向对象(ObjectOriented,简称OO)是一种软件开发方法,也是一种编程范式,还是一种对现实世界进行理解和抽象的方法把相关的数据和方法封装成一个整体,以更加自然的方式对现实世界进行建模三大特征:封装继承多态66.1面向对象概述76.1.1面向过程与面向对象的抽象6.1.2封装6.1.3继承6.1.4多态6.1面向对象概述86.1.1面向过程与面向对象的抽象6.1.2封装6.1.3继承6.1.4多态6.1.1面向过程与面向对象的抽象抽象:透过事物的表面现象抽取事物本质特征,同时舍弃事物非本质特征的过程面向过程的抽象功能分解数据和过程是分离的,两者关系由程序员维护多个过程可能修改和使用同一数据96.1.1面向过程与面向对象的抽象人类观察现实世界时,会把现实世界的事物分为一个个实体,每个实体能做什么,它和其他实体协作做了什么,从而理解现实世界的运作。面向对象抽象从现实世界问题域抽象出一个个相互独立的对象,表示现实世界的实体,弄清楚每个实体具有什么属性,具有哪些动态特征,会与哪些实体进行交互等面向对象抽象将数据和操作封装到一个个能动的对象中,数据和操作之间的对应关系不再由程序员来维护,而由系统自动维护106.1.1面向过程与面向对象的抽象复杂性解决:在面向对象系统中,一些独立的对象依据某种构造结合在一起,能形成新的、特有的属性和功能,可以形成一个更大更复杂的对象。这个更大更复杂的对象也可以成为另一个更大对象的一个组成部分,从而构造出一个更为庞大的系统例:一辆汽车一般由发动机、底盘、车身、电气设备等组成,而一个发动机、一个底盘、一个车身、一个电气设备等本身也是一个对象,它们装配在一起可以形成更为复杂、具有独特功能的一个汽车对象116.1.1面向过程与面向对象的抽象三大特征:封装性:从对象的外部来看,除了它用来与外界进行交互的接口之外,对象内部就是一个黑匣子,外部看不到对象的实现细节继承性:对象可以衍生出后代,后代对象将拥有父辈的全部能力多态性:一个对象变量在程序运行的不同时刻可以具有多种不同形态,即指向不同类型的对象,从而具有不同的功能12136-1面向对象的特征不包括()封装性继承性多样性多态性ABCD提交单选题1分6.1面向对象概述146.1.1面向过程与面向对象的抽象6.1.2封装6.1.3继承6.1.4多态6.1.2封装封装(Encapsulation):把从现实世界中抽象出来的客观实体封装成类,并且类可以隐藏自己内部的实现细节,让外界不可见,并把需要提供给外界的接口向外发布封装体现了信息隐藏(informationhiding)在程序设计中,类(class)是创建对象的模板,是一组对象公共属性和行为的抽象。一个类的实例就是该类的一个对象在抽象一组对象(属于某一类)的公共属性和行为时,要考虑现实世界问题域。大学生对象在不同的问题域中属性和行为是不一样的当问题域是高校教务管理系统时,大学生对象的属性可以包括:学号、姓名、年龄、籍贯、入学年份、专业、学分绩、已修课程等,其行为可以包括:查询学号、查询专业、查询学分绩、转专业、选课、退课、退学等当问题域是高校财务管理系统时,大学生对象的属性可以包括:学号、姓名、当前应缴费用、是否缴纳、历史缴费记录等,其行为可以包括:查询应缴费用清单、查询缴费状态、查询历史缴费记录、生成当前缴费收据等156.1面向对象概述166.1.1面向过程与面向对象的抽象6.1.2封装6.1.3继承6.1.4多态6.1.3继承继承(Inheritance)是指一个类可以无需重新编写现有类的代码而具备现有类的所有功能,并在此基础上可以扩展通过继承所创建的新类被称为“派生类”、“子类”、“扩展类”被继承的类被称为“基类”、“父类”、“超类”继承体现了现实世界的分类体系,表达了“是一种”关系,符合人类的思维方式继承可以分为单继承和多继承。单继承就是一个类只有一个直接父类。而多继承是指一个类有多个直接父类。Java语言是单继承语言,C++语言是多继承语言176.1.3继承继承(Inheritance)是指一个类可以无需重新编写现有类的代码而具备现有类的所有功能,并在此基础上可以扩展186.1面向对象概述196.1.1面向过程与面向对象的抽象6.1.2封装6.1.3继承6.1.4多态6.1.4多态多态(Polymorphism)是指一个对象引用变量在程序运行的不同时刻具有多种形态具体来讲,就是一个父类类型的引用变量能够指向其任何不同子类的一个实例,从而表现出相应子类实例的行为。假设定义了一个引用变量vehicle指向一个交通工具类,该引用变量可以在程序运行的某个时刻指向陆地交通工具类的一个实例,也可以指向水上交通工具类或空中交通工具类的一个实例,还可以指向火车类、汽车类等的一个实例当一个方法的形式参数是交通工具类对象时,那么该方法可以接受的实际参数可以是其任一子类的对象。这样,相同的方法可以接受不同类型的参数,表现出不同的行为。换句话说,这就是同一操作作用于不同类的实例,产生不同的执行结果。这也是多态性的一种外在表现。20内容216.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.2类与对象对象(Object):代表现实世界问题域中可明确标识的一个实体。客观存在的事物,如:一个学生、一辆小轿车等。抽象事件,如一场比赛、一次会议等每个对象都有自己独特的标识、状态、行为。对象标识(又称为对象ID):是程序中唯一标识一个对象的有效标识符对象属性(state,又称为特征或状态):由具有当前值的数据域来表示的。如一个矩形对象的数据域:宽度width为5.5和高度height为7.5,它们描述了该矩形对象的当前属性或状态对象行为(behavior,亦称为对象操作):对象操作体现了对象的能动性和功能,在程序设计语言中,对象操作由方法(或函数)来定义。如矩形对象:getArea()、getPerimeter()。类(class):一组具有相同属性和行为的对象的抽象。类是创建对象的模板。226.2.1类的定义6.2.2对象创建6.2.3对象访问6.2类与对象类是一个模板,用来定义一组相同类型对象具有的属性和行为。一个对象是类的一个实例(instance),对象和实例具有相同含义创建实例的过程称为实例化(Instantiation)类的定义包括:属性(数据域):用变量定义,成员变量行为(动作):用方法定义,成员方法构造方法:用于创建与初始化一个对象类定义一般形式236.2.1类的定义6.2.2对象创建6.2.3对象访问6.2类与对象示例:程序清单6-1SimpleRect.java246.2.1类的定义6.2.2对象创建6.2.3对象访问在面向对象分析和设计过程中,程序员可以使用UML(UnifiedModellingLanguage,统一建模语言)的图形符号进行建模,协助程序员进行可视化分析256-2()表示一个在真实世界中能被明确区分的实体。一个类一个对象一个方法一个数据域ABCD提交单选题1分6.2类与对象对象可以先声明后创建,声明的一般形式是:类名对象名;创建对象的一般形式是:对象名=new类名(实参列表);对象的声明和创建也可以结合在一起,其一般形式是:类名对象名=new类名(实参列表);示例:266.2.1类的定义6.2.2对象创建6.2.3对象访问SimpleRectrect1;rect1=newSimpleRect(3.5,4.5);SimpleRectrect1=newSimpleRect(3.5,4.5);6.2类与对象对象的创建涉及引用类型、构造方法、数据域默认值1、引用类型用户定义的类是一种用户自定义的数据类型,也是一种引用类型(referencetype)。引用类型的变量是一个合法的标识符,被称为对象引用变量(referencevariable),也被称为对象名。对象实体:‘new构造方法’在内存堆中为新创建的对象分配一块内存并初始化该对象的数据域,这个初始化之后的内存块被称为对象实体。276.2.1类的定义6.2.2对象创建6.2.3对象访问引用类型变量代表的内存位置存储的值是一个引用值基本数据类型变量代表的内存位置存储的值是基本类型的值6.2类与对象286.2.1类的定义6.2.2对象创建6.2.3对象访问基本类型变量赋值将一个基本数据类型变量a赋给另一个基本数据类型变量b时,即b=a,可以直接将a的值赋给b。例如,假设已知i为2,j为0,执行j=i,这时,直接将i的值2赋给j,j也变为2赋值前赋值后6.2类与对象296.2.1类的定义6.2.2对象创建6.2.3对象访问引用变量赋值6.2类与对象2、构造方法(1)构造方法必须与所在类同名,大小写一致。(2)构造方法没有返回值类型,也不能加void关键字。(3)构造方法只能在创建一个对象时由关键字new调用。构造方法允许重载,可以有多个同名但是方法签名不一样的构造方法。示例:程序清单6-1SimpleRect.java通常,一个类会提供一个没有形式参数的构造方法(例如:SimpleRect()),这样的构造方法被称为无参构造方法。306.2.1类的定义6.2.2对象创建6.2.3对象访问316-3以下有关构造方法的说法,正确的是:()一个类的构造方法可以有多个构造方法在类声明时被调用构造方法只能由对象中的其它方法调用。构造方法可以和类同名,也可以和类名不同ABCD提交单选题1分6.2类与对象提问:如果一个类没有定义构造方法,那么能不能创建该类的对象呢?能。这是因为Java编译器对源程序进行编译后,会给一个没有明确定义任何构造方法的类自动提供一个默认构造方法(defaultconstructor)。默认构造方法是一个方法体为空的无参构造方法当一个类明确定义了一个或多个构造方法时,默认构造方法就不再被自动提供326.2.1类的定义6.2.2对象创建6.2.3对象访问6.2类与对象3、数据域默认值当一个类通过默认构造方法(方法体为空)创建对象时,该类的数据域是如何初始化的?在Java语言中,一个类的数据域是有默认值的。数值类型数据域的默认值是零值布尔类型数据域的默认值是false字符类型数据域的默认值是\u0000引用类型数据域的默认值是null示例:程序清单6-2Person.java、程序清单6-3TestPerson.java对象成员访问操作符(objectmemberaccessoperator),通过“对象名.成员变量”的方式访问person对象的各个数据域,得到其默认值。336.2.1类的定义6.2.2对象创建6.2.3对象访问6.2类与对象在对象创建之后,每个对象具有自己的数据域,可以通过对象成员访问操作符.来访问对象自身的数据域和调用方法,对象成员访问操作符使用的一般形式是:对象引用变量.数据域;对象引用变量.方法(实参列表);示例:程序清单6-4TestSimpleRect.java实例成员变量(实例变量):变量的值依赖于某个具体实例实例成员方法(实例方法):只能被具体的实例所调用,并能使用具体实例的数据域调用对象(当前对象):调用实例方法的对象实例成员:实例变量和实例方法346.2.1类的定义6.2.2对象创建6.2.3对象访问356-4对象成员访问操作符是

[填空1]

作答填空题1分内容366.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.3静态成员classclassName{

成员;

构造方法;}37成员实例成员实例变量实例常量实例方法静态成员静态变量静态常量静态方法在有些场景中,有些信息需要被一个类的所有实例共享,或者在调用成员方法时,直接使用类名调用。在这些场景中,类的静态成员需要被使用。6.3静态成员classclassName{

成员;

构造方法;}38成员实例成员实例变量实例常量实例方法静态成员静态变量静态常量静态方法属于某个具体实例6.3静态成员classclassName{

成员;

构造方法;}39成员实例成员实例变量实例常量实例方法静态成员静态变量静态常量静态方法通过类的一个实例调用6.3静态成员classclassName{

成员;

构造方法;}40成员实例成员实例变量实例常量实例方法静态成员静态变量静态常量静态方法被该类的所有实例共享6.3静态成员classclassName{

成员;

构造方法;}41成员实例成员实例变量实例常量实例方法静态成员静态变量静态常量静态方法通过类名即可调用,无须与类的某个实例绑定。6.3静态成员classclassName{

成员;

构造方法;}42成员实例成员实例变量实例常量实例方法静态成员静态变量静态常量静态方法静态成员,也称为类成员。要将成员声明为静态的,使用关键字static6.3静态成员程序演示:程序清单6-6TestRectStaticDemo.java43建议:静态成员最好用类名来访问,即使用“类名.静态变量”的方式访问静态变量,使用“类名.静态方法(实际参数列表)”的方式访问静态方法。这不仅可以避免编译警告错误,而且可以很容易地识别出类中的静态成员。6.3静态成员44调用实例方法访问实例数据域调用静态方法访问静态数据域实例方法静态方法实例方法VS静态方法6.3静态成员45publicclassTestStatic{inti=1;staticintj=2;publicstaticvoidmain(String[]args){intk1=i;//错误,静态方法不能访问实例变量imethod1();//错误,静态方法不能调用实例方法method1

intk2=method2(2);//正确,静态方法可以调用另一个静态方法

}//实例方法可以访问静态变量和静态方法publicvoidmethod1(){i=i+j+method2(i);

}//静态方法可以访问静态变量publicstaticintmethod2(intk){returnk*j;

}}6.3静态成员46publicclassTestStatic{inti=1;staticintj=2;publicstaticvoidmain(String[]args){

intk1=i;//错误,静态方法不能访问实例变量imethod1();//错误,静态方法不能调用实例方法method1

intk2=method2(2);//正确,静态方法可以调用另一个静态方法

}//实例方法可以访问静态变量和静态方法publicvoidmethod1(){i=i+j+method2(i);

}//静态方法可以访问静态变量publicstaticintmethod2(intk){returnk*j;

}}6.3静态成员47publicclassTestStatic{ inti=1; staticintj=2; publicstaticvoidmain(String[]args){ TestStaticobj=newTestStatic(); intk1=obj.i;//正确,静态方法访问的是对象obj的实例变量i obj.method1();//正确,静态方法调用的是对象obj的实例方法method1 intk2=method2(2);//正确,静态方法可以调用另一个静态方法 } //实例方法可以访问静态变量和静态方法 publicvoidmethod1(){ i=i+j+method2(i); } //静态方法可以访问静态变量 publicstaticintmethod2(intk){ returnk*j; }}正确访问形式486-5能被一个类的所有实例共享的变量称为()公有变量私有变量实例变量类变量ABCD提交单选题1分496-6请勾选可以添加static的位置:()publicclassTest{intcount;public[A]voidmain(String[]args){…}public[B]intgetCount(){returncount;}public[C]intfactorial(intn){intresult=1;…;returnresult;}}staticstaticstaticABC提交多选题2分内容506.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.4可见性修饰符516.4.1包6.4.2模块module6.4.3public、private、包私有访问权限6.4.1包包(package)可以将一组相关的类或接口组织在一起每个包具有一个独一无二的包名,形成自己的命名空间,有助于防止命名冲突。具体来讲,在两个不同包中出现类名相同的类,是不会产生冲突的。包声明语句要求是程序的第一条非注释和非空白行的语句,而且必须是某源文件的第一条语句,使用关键字package,其语法形式:packagepackageName;packageName(包名)既可以是由一个合法标识符确定的名称,也可以是由多个合法标识符用“.”(点号)连接而成的一个名称。如果一个类在定义时,没有声明包,那么表示该类被放在默认包中。一个包的成员包括类、接口、子包。其中,一个包的类和接口在该包的编译单元中,而一个包的子包拥有自己的编译单元和子包。需要注意的是,包与子包是两个独立的编译单元。在导入语句中,导入一个包,并不表示导入了其子包。52importjavafx.scene.*;可以导入javafx.scene包中类和接口,但是不能导入javafx.scene的子包javafx.scene.layout中的类和接口,因此,不能代替如下导入语句:importjavafx.scene.layout.*;6.4.1包一个包中不能包含两个具有相同名字的成员。即,一个包内的类名、接口名、子包名不能重复出现。例1:包java.awt有一个子包image,因此它不能包含一个以image命名的类或接口。例2:一个命名为chapter6的包,拥有一个接口Print,那么就不能定义一个包名为chapter6.Print或chapter6.Print.doc的包。Eclipse环境创建演示536.4可见性修饰符546.4.1包6.4.2模块module6.4.3public、private、包私有访问权限6.4.2模块module模块(module)用于组织一组相关包。如果一些包具有较强的相关性,那么可以将这些包分组为一个模块。项目、模块、包之间的关系如下图所示。556.4.2模块module一个模块能够通过两个关键字requires和exports,对自身所依赖(requires)的模块和自身导出(exports)的包(package)进行声明。一个模块只能使用其他模块导出(exports)的包(package),其他模块也只能使用该模块导出(exports)的包(package)。一个模块能将它的部分包或全部包分类为exported(导出的),这意味着这些被导出包的类和接口可以通过模块外部的代码访问。如果一个模块的某个包没有被该模块导出,那么只有模块内部的代码可以访问该包的类和接口。如果一个模块中的代码想要访问另一个模块导出的包,那么第一个模块必须显式依赖于第二个模块。通常,新版本的集成开发环境(如Eclipse、IntellijIDEA等)在创建一个Java项目时,均可选择创建一个模块及其模块描述文件module-info.java。为了不引入复杂性,本书后续的内容和示例不讨论模块的使用以及模块对访问特性的影响566.4可见性修饰符576.4.1包6.4.2模块module6.4.3public、private、包私有访问权限6.4.3public、private、包私有访问权限可见性修饰符:用于确定一个类以及它的成员的可见性。放置在类、方法和数据域前:public,private,protectedpublic:类、方法和数据域可被任何包中的任何类访问。可以修饰类与类的成员。private:数据域或方法只能被声明的类访问。只能修饰类的成员。包内访问或包私有:如果未使用可见性修饰符,则默认类、方法和数据域可被同一包中的任何类访问。58在局部变量上使用public可以吗?在局部变量上使用private可以吗?6.4.3public、private、包私有访问权限private访问特性示例59606-7如果一个类的成员变量只能在所在类中使用,则该成员变量必须使用的修饰符是()publicprotectedprivatestaticABCD提交单选题1分6.4.3public、private、包私有访问权限如果没有使用可见性修饰符放置在类、方法和数据域前,那么这些类、方法、数据域默认具有包私有访问权限,可以被同一个包中的成员访问,但是不能被其他包中的成员访问。一个类的方法和数据域无论使用哪个可见性修饰符,该类总是可以访问自身所有的数据域和方法。因此,可见性修饰符用于指明一个类的数据域和方法是否能在该类之外被访问。616.4.3public、private、包私有访问权限可见性修饰符修饰数据域和方法的示例626.4.3public、private、包私有访问权限可见性修饰符修饰类的示例63内容646.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.5数据域封装如果数据域是公有访问权限,这些数据域被修改的可能性会扩展到其他任何类。这有可能导致如下两个问题:非私有的数据域可以被其他类篡改程序的可维护性变差数据域封装:为了避免外部其他类对一个类的数据域直接进行修改,可以使用private修饰符将数据域声明为私有的私有数据域在类的外部不能直接被访问,为了访问私有数据域的值,可以提供公有的访问方法供外部其他类调用。为了获取私有数据域的值,提供一个获取方法(getter)返回数据域的值为了修改私有数据域的值,提供一个设置方法(setter)为数据域设置新值656.5数据域封装获取方法的签名一般形式如下:public返回值类型getPropertyName()如果返回值类型是boolean类型,一般如下定义获取方法:pulibcbooleanisPropertyName()设置方法的签名如下:publicvoidsetPropertyName(数据类型propertyValue)示例:程序清单6-7Rect_v1.java注意:除非有特殊要求,在设计一个类时,应该将其所有的数据域设置为私有的,其所有的构造方法和方法应该被声明为公有的。66676-8下面哪个说法不正确()可使用private修饰符封装数据域封装数据域使得程序易于维护封装数据域使得程序变短封装数据域帮助防止程序错误ABCD提交单选题1分内容686.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.6变量作用域无论类的成员变量在类的何处声明,其作用域是整个类。类的成员变量和成员方法可以在类中以任意顺序出现。69当类的一个成员变量基于类的另一个成员变量来进行初始化时,则另一个成员变量必须先声明706-9“一个类的成员变量的定义顺序是任意的。”

这句话是否正确()正确错误AB提交单选题1分6.6变量作用域变量隐藏:如果一个局部变量和类的成员变量同名,那么局部变量优先,而同名的类的成员变量将被隐藏(hidden)71课堂思考:下面程序的输出是什么?72{内容736.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.7对象与方法746.7.1对象作为方法的形参6.7.2对象作为方法的返回值6.7.3var声明对象作为方法的局部变量6.7.1对象作为方法的形参当对象作为方法的形参时,实参将自己的引用值传递给形参,形参和实参会引用同一片内存区域,因此形参对内存区域的改变也会影响到实参。在Java语言中,参数传递本质上仅有一种方式,即值传递。无论一个方法的形参是基本数据类型或是引用数据类型,实参传递给形参的都是实参的值。示例:程序清单6-8TestPassValue.java756.7.1对象作为方法的形参76776-10当向一个方法传递对象参数时,()被传递给方法。对象的内容对象的一个copy对象的引用值对象的一个copy,这个copy对象的引用值ABCD提交单选题1分6.7对象与方法786.7.1对象作为方法的形参6.7.2对象作为方法的返回值6.7.3var声明对象作为方法的局部变量6.7.2对象作为方法的返回值当一个对象类型作为方法返回值,需要使用类名作为方法的返回值类型。示例:程序清单6-9TestCreateRect.java796.7对象与方法806.7.1对象作为方法的形参6.7.2对象作为方法的返回值6.7.3var声明对象作为方法的局部变量6.7.3var声明对象作为方法的局部变量在方法中声明一个对象作为局部变量,有两种方式,例如:Rect_v1rect1=newRect_v1(3.0,5.0);//方式1:常规方式varrect2=newRect_v1(3.0,5.0);//方式2:var声明方式var声明方式可以使用关键字var替代类名,使得代码更简洁。局部变量的类型通过赋值语句右边的表达式进行推断。该声明方式从Java10开始出现,如果可以从变量的初始值推导出它们的类型,那么可以用var关键字声明局部变量,而无需指定其类型。使用关键字var还需注意:关键字var只能用于方法中的局部变量定义,不能用于形式参数声明。816.7.3var声明对象作为方法的局部变量在如下情况使用关键字var会发生编译错误:(1)多个变量声明在一起。(2)变量声明时没有进行初始化。(3)变量声明时,赋值操作符左边存在一个或多个方括号对。(4)变量初始化是一个数组初始化列表。(5)变量声明在初始化时包含一个对自身的引用。Jshell验证:826.7.3var声明对象作为方法的局部变量836.7.3var声明对象作为方法的局部变量846.7.3var声明对象作为方法的局部变量85866-11下面对var关键字使用正确的是()

varobj=null;varf={3,4}varlist=newdouble[5];vari=1,j=2;ABCD提交单选题1分内容876.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.8对象数组当数组元素是某种类型的对象时,这样的数组可被称为对象数组。例如,下面的语句声明并创建具有5个矩形对象的数组:Rect_v1[]rects=newRect_v1[5];初始化:示例:程序清单6-10CalMultiRectAreajava88for(inti=0;i<rects.length;i++)rects[i]=newRect_v1();内容896.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.9ArrayList对象数组是长度固定的,如果用于存储个数不定的对象,就会出现问题:如果对象数组长度不够,那么不能存储所有对象如果对象数组长度太大,那么浪费存储空间Java语言提供了一个数组列表类ArrayListArrayList(位于java.util包中),用来存储不限定个数的某类对象。ArrayList是一种泛型类,具有一个泛型类型E。在创建一个ArrayList对象时,可以用一个具体的引用类型来替代E。例如:ArrayList<String>nameOfUniversities=newArrayList<String>();906.9ArrayList从JavaSE7开始,ArrayList构造方法中不再要求给出具体引用类型的名称,具体地,语句如下:91ArrayList<具体引用类型>nameOfUniversities=newArrayList<具体引用类型>();ArrayList<具体引用类型>nameOfUniversities=newArrayList<>();简化6.9ArrayList数组列表类ArrayList有三个构造方法:(1)无参构造方法:ArrayList(),创建一个初始容量为10的数组列表对象。(2)指定初始容量的构造方法:ArrayList(intinitialCapacity),创建一个指定初始容量的数组列表对象。(3)从其他集合对象创建的构造方法:ArrayList(Collection<?ExtendsE>c),创建一个数组列表对象容纳指定集(Collection)对象c926.9ArrayList936.9ArrayList94示例:程序清单6-11ArrayListDemo1.java6.9ArrayList有时候需要从一个对象数组创建一个列表,或者相反。虽然可以通过循环实现,但是代码不够简洁,可以使用Java语言提供的API更加容易地实现。使用方法Arrays.asList()可以实现从一个对象数组创建一个数组列表对象,例如:String[]nameArray={"法正","郭嘉","诸葛亮"};ArrayList<String>nameList=newArrayList<>(Arrays.asList(nameArray));使用ArrayList的实例方法toArray()可以实现从一个数组列表对象创建一个对象数组,例如:String[]nameArray1=newString[nameList.size()];nameList.toArray(nameArray1);95966-12假设一个数组列表对象包含{"red","red","green"},在执行下面代码之后list的值是多少?(){"red","red","green"}{"red","green"}{"green"}{}ABCD提交Stringelement="red";for(inti=0;i<list.size();i++)if(list.get(i).equals(element))list.remove(element);单选题1分976-13假设一个数组列表对象包含{"red","red","green"},在执行下面代码之后list的值是多少?{"red","red","green"}{"red","green"}{"green"}{}ABCD提交

Stringelement="red";for(inti=0;i<list.size();i++)if(list.get(i).equals(element))if(list.get(i).equals(element)){list.remove(element);i--;}单选题1分内容986.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.10this引用关键字this用于一个对象引用自身。通过关键字this,可以引用对象的实例成员。通常,关键字this是被隐式使用的。this隐式使用示例:下一页this引用在两种情况下是必须显式使用的:需要引用被方法或构造方法的参数所隐藏的数据域时需要调用一个重载的构造方法时996.10this引用this引用隐式使用1006.10this引用1016.10.1this引用被隐藏数据域6.10.2this调用构造方法6.10.1this引用被隐藏数据域通常,使用数据域作为构造方法或设置方法的参数是一个好方法,这可以使得代码易于阅读,并且避免创建不必要的名字。然而,由于参数与数据域同名,在构造方法或设置方法中,需要显式使用关键字this来引用被隐藏的数据域名称。1026.10.1this引用被隐藏数据域被隐藏的实例变量,可以通过this引用来访问。被隐藏的静态变量,可以通过类名来访问。其访问形式为:类名.静态变量。1036.10this引用1046.10.1this引用被隐藏数据域6.10.2this调用构造方法6.10.2this调用构造方法关键字this可以在一个类的构造方法中使用,用于调用该类的另一个构造方法。需要注意的是,在一个构造方法使用this调用其他构造方法时,this调用其他构造方法的语句应该是该构造方法的第一条语句。105示例:讨论题下面代码有无错误?如有,请指出哪一行有错误。106publicclassMain{privatedoubleintrst;publicvoidf1(){rst=12;}publicvoidf2(){Mrst

=

12.5;}}内容1076.1面向对象概述6.2类与对象6.3静态成员6.4可见性修饰符6.5数据域封装6.6变量作用域6.7对象与方法6.8对象数组6.9ArrayList6.10this引用6.11Java常用类6.11Java常用类1086.11.1基本数据类型的包装类6.11.2BigInteger类和BigDecimal类6.11.3Random类6.11.4Date类6.11.1基本数据类型的包装类Java语言的所有基本类型都有其对应包装类。byte——Byte、short——Short、int——Integer、long——Long、float——Float、double——Double、char——Character、Boolean——Boolean)Java语言为什么既提供基本数据类型,又提供对应的包装类呢?一方面,Java语言提供基本数据类型是为了性能,如果把基本数据类型作为对象使用的,那么处理对象时,Java语言是需要额外的系统开销的。另一方面,Java语言提供的一些数据结构和方法需要将引用类型作为参数,于是,为了让这些数据结构和方法能对基本数据类型的值进行处理,Java语言提供基本类型对应的包装类。例如,ArrayList<E>是一个动态的对象数组,如果要让该数据结构存储整数,那么必须将整数转化成对应的整数类类型。1096.11.1基本数据类型的包装类数值包装类(Byte、Short、Integer、Long、Float、Double)的使用非常相似,都具有方法:byteValue()、shortValue()、intValue()、longValue()、floatValue()、doubleValue()。这些方法可将对象转化为基本数据类型值。基本数据类型包装类都是最终类(7.4节介绍),意味着所有包装类的实例一旦创建,就都是不可变的,即包装类实例包含的值就不能再改变了。所有基本数据类型包装类的构造方法从Java9开始成为过时方法,在未来的版本中会被移除。为了提升性能,构建基本数据类型包装类对象,建议采用静态的工厂方法valueOf(工厂模式是一种设计模式,这里不展开介绍)进行创建1106.11.1基本数据类型的包装类Integer、Double创建对象示例:通过数值创建Integer、Double对象示例1116.11.1基本数据类型的包装类通过字符串创建Integer、Double对象示例1121136-14下面语句是否正确,“Integer对象最好通过构造方法创建”()正确错误AB提交单选题1分6.11.1基本数据类型的包装类基本数据类型最大值、最小值示例1146.11.1基本数据类型的包装类每个数值包装类包含一些共有方法:doubleValue()、floatValue()、longValue()、intValue()、shortValue()、byteValue()1156.11.1基本数据类型的包装类数值包装类都有一个compareTo方法,用于比较两个数值:1166.11.1基本数据类型的包装类每个数值包装类都提供了相应的静态解析方法parseXXX(Strings)(XXX代表Byte、Short、Int、Long、Float、Double中的任意一个),将字符串转换成相应的基本数据类型。1176.11.1基本数据类型的包装类对于整数包装类,Java还提供了一个重载的解析方法parseXXX(Strings,intradix),提供第2个参数(radix)指定基数为2、8、16,可将数值字符串解析为以指定值为基数的数值。1186.11.1基本数据类型的包装类数值包装类还有静态方法toString和实例方法toString,用于将相应的数据类型值转换成字符串表示。1196.11.1基本数据类型的包装类基本数据类型和其包装类类型之间可以自动转换。基本数据类型值被转换为包装类对象的过程被称为装箱(boxing),与之相反的过程被称为拆箱(unboxing)。如果一个基本数据类型值出现在需要使用对象的上下文环境中,Java编译器会对基本数据类型值进行自动装箱。如果一个包装类对象出现在需要使用基本数据类型值的上下文环境中,Java编译器会对包装类对象进行自动拆箱。示例:1206.11.1基本数据类型的包装类由于基本数据类型和其包装类类型之间可以自动进行转换,所以使用ArrayList类可以创建存储不定个数的数值(整数或浮点数等)的列表。例如,下面创建一个存储整数的列表,并对列表进行操作,代码如下:ArrayList<Integer>intList=newArrayList<>();intList.add(4); //整数4自动转换为Integer对象intList.add(5); //整数5自动转换为Integer对象inti1=intList.get(0);//索引为0的Integer对象自动转换为整数4inti2=intList.get(1);//索引为1的Integer对象自动转换为整数5虽然基本数据类型和其包装类类型之间可以自动转换,但是这并不表示在创建ArrayList对象时能用基本类型代替包装类。例如,下面语句是错误的:ArrayList<int>intList=newArrayList<>();这是因为泛型类型E必须是引用类型,int是基本数据类型。1211226-15下列哪些语句将一个字符串s转换为一个double值d?()d=Double.parseDouble(s);d=(newDouble(s)).doubleValue();d=Double.valueOf(s).doubleValue();以上都对ABCD提交单选题1分6.11.1基本数据类型的包装类程序清单6-12的实例展示了ArrayList存储不定个数浮点数的情况,模拟了一个购物结算场景。程序演示:程序清单6-12ArrayListDemo2.java123这时Java编译器会报错。其原因在于100是int型值不能自动装箱为Double对象第9行的代码会把int型值自动转换double型值,然后double型值会自动装箱成Double对象。假如在程序清单6-12第13行空行加一条语句是否正确,语句如下:prices.add(100);程序清单6-12所示程序在执行时,用户输入数据也输入了整数3、4,为什么程序没有报错呢?6.11.1基本数据类型的包装类Integer类124数据域说明privateintvalue当前Integer对象对应的int值publicstaticfinaldoubleMAX_VALUE正的最大double值,(2-2-52)·21023publicstaticfinaldoubleMIN_VALUE正的最小double值,2-1074构造方法说明public

Integer(int

value)以指定值value构建一个Integer对象。从Java9开始,这个构造方法将成为过时的方法。静态方法valueOf(int)是一个更好的选择,具有更好地空间和时间性能。public

Integer(String

s)以字符串表示的浮点值构建一个Integer对象。从Java9开始,这个构造方法将成为过时的方法。使用静态方法parseInteger(String)将String转换为int值,或使用静态方法valueOf(String)将一个String对象转换成一个Integer对象6.11.1基本数据类型的包装类Integer类125常用方法说明public

byte

byteValue()返回当前Integer对象的byte值public

short

shortValue()返回当前Integer对象的short值public

int

intValue()返回当前Integer对象的int值public

long

longValue()返回当前Integer对象的long值public

float

floatValue()返回当前Integer对象的float值public

double

doubleValue()返回当前Integer对象的double值publicstatic

Integer

valueOf(inti)基于给定的int值返回一个Integer对象publicstatic

Integer

valueOf(String

s)返回一个Integer对象,参数s是该对象拥有的int值的字符串表示publicstatic

Integer

valueOf(String

s,intradix)返回一个Integer对象,该对象保存从指定字符串中提取的值,解析指定字符串s时,使用第二个参数给定的基数。publicstatic

int

parseInt(String

s)返回一个新的有符号十进制int值,该值通过解析指定字符串s获得publicstatic

int

parseInt(String

s,intradix)返回一个新的有符号int值,该值通过解析指定字符串s获得,解析字符串s时,使用第二个参数给定的基数6.11.1基本数据类型的包装类Integer类126常用方法说明publicstatic

int

parseUnsignedInt(String

s)自Java8开始提供该方法,把字符串s解析为无符号十进制整数,并返回该整数值publicstatic

int

parseUnsignedInt(String

s,int

radix)自Java8开始提供该方法,把字符串s解析为以第二个参数为基数的无符号整数,并返回该整数值publicstatic

Integer

valueOf(String

s,int

radix)基于第二个参数给定的基数,把字符串s解析为无符号整数,并返回该整数值publicstatic

String

toString(inti)基于十进制,返回一个int值i的字符串表示publicstatic

String

toBinaryString(int

i)返回整数参数i的字符串表示,这个字符串表示是参数i对应的以2为基数的无符号整数publicstatic

String

toOctalString(int

i)返回整数参数i的字符串表示,这个字符串表示是参数i对应的以8为基数的无符号整数publicstatic

String

toHexString(inti)返回整数参数i的字符串表示,这个字符串表示是参数i对应的以16为基数的无符号整数publicstatic

String

toUnsignedString(int

i)自Java8开始提供该方法,返回参数i的字符串表示,这个字符串表示是参数i对应的十进制无符号数。6.11.1基本数据类型的包装类Integer类127常用方法说明publicstatic

long

toUnsignedLong(int

x)将参数x转换为无符号的long类型值public

String

toString()返回当前Integer对象的字符串表示public

int

compareTo(Integer

anotherInteger)当前Integer对象与给定的Integer对象anotherInteger进行比较,比较两个对象包含的数值,当前者大于、等于、小于后者时,分别返回1、0、-16.11.1基本数据类型的包装类Double类128数据域说明privatedoublevalueDouble对象对应的double值publicstaticfinaldoubleMAX_VALUE正的最大double值,(2-2-52)·21023publicstaticfinaldoubleMIN_VALUE正的最小double值,2-1074构造方法说明public

Double(double

value)以指定值value构建一个Double对象。从Java9开始,这个构造方法将成为过时的方法。静态方法valueOf(double)是一个更好的选择,具有更好地空间和时间性能。public

Double(String

s)以字符串表示的浮点值构建一个Double对象。从Java9开始,这个构造方法将成为过时的方法。使用静态方法parseDouble(String)将一个String转化为一个double值,或使用静态方法valueOf(String)将一个String对象转换成一个Double对象6.11.1基本数据类型的包装类Double类129常用方法说明public

byte

byteValue()返回当前Double对象的byte值public

short

shortValue()返回当前Double对象的short值public

int

intValue()返回当前Double对象的int值public

long

longValue()返回当前Double对象的long值public

float

floatValue()返回当前Double对象的float值public

double

doubleValue()返回当前Double对象的double值publicstatic

Double

valueOf(double

d)基于给定的double值返回一个Double对象publicstatic

Double

valueOf(String

s)返回一个Double对象,参数s是该对象拥有的double值的字符串表示publicstatic

double

parseDouble(String

s)返回一个新的double值,该值由指定字符串s表示publicstatic

String

toString(double

d)返回一个double值d的字符串表示publicstatic

String

toHexString(double

d)返回一个double值d的十六进制字符串表示public

String

toString()返回当前Double对象字符串表示public

int

compareTo(Double

anotherDouble)当前Double对象与给定的Double对象anotherDouble进行比较,比较两个对象包含的数值,当前者大于、等于、小于后者时,分别返回1、0、-16.11Java常用类1306.11.1基本数据类型的包装类6.11.2BigInteger类和BigDecimal类6.11.3Random类6.11.4Date类6.11.2BigInteger类和BigDecimal类java.math包中提供了BigInteger类和BigDecimal类。它们都是最终类,可以分别用于表示任意大小和精度的整数和十进制数,支持非常大的数的计算或者高精度浮点值的计算。BigInteger类的publicstaticfinalBigInteger数据域131数据域说明ZEROBigInteger常量0ONEBigInteger常量1TWOBigInteger常量2TENBigInteger常量106.11.2BigInteger类和BigDecimal类BigInteger类的部分构造方法与常用方法132方法头说明public

BigInteger(String

val)将一个BigInteger的十进制字符串表示翻译成一个BigInteger对象public

BigInteger(String

val,int

radix)将一个BigInteger、以指定基数radix的字符串表示翻译成一个BigInteger对象public

BigInteger

add(BigInteger

val)返回当前对象与给定对象val的和public

BigInteger

subtract(BigInteger

val)返回当前对象减去给定对象val的差public

BigInteger

multiply(BigInteger

val)返回当前对象与给定对象val的乘积public

BigInteger

divide(BigInteger

val)返回当前对象除以给定对象val的商public

BigInteger

remainder(BigInteger

val)返回当前对象除以给定对象val的余数public

BigInteger

pow(int

exponent)返回当前对象的exponent次幂public

BigInteger

sqrt()返回当前对象的平方根public

BigInteger

gcd(BigInteger

val)返回当前对象与给定对象val的最大公约数public

BigInteger

abs()返回一个BigInteger对象,其值是当前BigInteger对象的绝对值public

BigInteger

negate()返回一个BigInteger对象,其值是对当前BigInteger对象取反(-this)1336-16表示任意大小和精度的十进制数类是

[填空1]

作答填空题1分6.11.2BigInteger类和BigDecimal类BigInteger类使用示例1346.11.2BigInteger类和BigDecimal类BigDecimal类的publicstaticfinalBigInteger数据域135数据域说明ZEROBigDecimal常量0,scale为0ONEBigDecimal常量1,scale为0TENBigDecimal常量10,scale为06.11.2BigInteger类和BigDecimal类BigDecimal类的部分构造方法和常用方法136方法头说明public

BigDecimal(String

val)将一个BigDecimal的字符串表示翻译成一个BigDecimal对象public

BigDecimal(BigIntegerval)将一个BigInteger翻译成一个BigDecimal对象,其scale为0。public

BigDecimal(double

val)将双精度值val转换为一个BigDecimal对象,该对象是双精度二进制浮点值的精确十进制表示。public

BigDecimal(long

val)将一个long类型值val翻译成一个BigDecimal对象,其scale为0。public

BigDecimal(int

val)将一个int类型值val翻译成一个BigDecimal对象,其scale为0。public

BigDecimal

add(BigDecimal

val)返回当前对象与给定对象val的和public

BigDecimal

subtract(BigDecimalval)返回当前对象减去给定对象val的差public

BigDecimal

multiply(BigDecimal

val)返回当前对象与给定对象val的乘积public

BigDecimal

divide(BigDecimal

val)返回当前对象除以给定对象val的商public

BigDecimal

remainder(BigDecimal

val)返回当前对象除以给定对象val的余数public

BigDecimal

pow(int

n)返回当前对象的n次幂public

BigDecimal

sqrt()返回当前对象的平方根public

BigDecimal

abs()返回一个BigDecimal对象,

温馨提示

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

评论

0/150

提交评论