《单元05 面向对象基本概念.docx》由会员分享,可在线阅读,更多相关《单元05 面向对象基本概念.docx(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单元05面向对象基本概念描述“人类”信息程序设计5.1类与对象的概念与关系,描述“人类”信息程序设计单元目标 理解类和对象的概念以及两者之间的关系; 掌握类的结构和定义过程; 掌握对象的创建过程。 掌握类中方法的定义和使用; 掌握构造方法的定义和意义; 理解方法重载的思想; 掌握方法重载的实现方式和特征; 能够分辨出变量作用域的范围并正确使用变量 理解类的封装意义; 掌握类的封装实现步骤; 掌握各种访问修饰符的访问范围; 能够准确使用访问修饰符控制对象使用。学习任务01任务描述人是这个社会的主体,在系统开发过程中经常涉及到人类。人的信息包括姓 名、年龄、性别、体重、家庭地址等。要求使用Java
2、语言对“人类”进行描述 并进行实例化。运行结果知识准备对象(Object)是现实世界中实际存在的某个具体实体。一般对象是有形的, 例如,电视机对象拥有着自己的样式、颜色、大小等等和放映、开关和设置等功 能(行为);也可以是无形的,例如五子棋的输赢规则。对象包含特征和行为, 特征指对象的外观、性质、属性等;行为指对象具有的功能、动作等。而面向对【经验】如果类中显性的定义了构造方法,那么系统不再提供默认的不带参的方法体为空 的构造方法。若对一个已完成的程序进行扩展,因某种需要而添加了一个类的构 造方法,由于很多其他类原先使用默认构造方法,这势必会导致找不到构造方法 的错误。解决的方法就是把默认的构
3、造方法显性的写出来。当构造方法定义完毕后就可以通过创建对象来对属性进行初始化操作。一般情况下需要结合new实例化操作,使用传递实参的形式进行。【实例2-4使用构造方法对Person类的两个属性进行初始化,并打印各个对象的属性值。public class Person=/-一f A借书卡程序设计String name;一int age;public Person。默认的构造方法需要显性的写出来)public Person(String myNameJnt myAge)带参的构造方法来初始化属性name= myName;age= myAge;)public class TestNewPerson
4、public static void main(String args)/通过new操作并传入实参来实现属性的初始化和对象的实例化Person p1=new Person (张三”,20);Person p2=new Person (李四30);)程序运行结果如下:我是:张三,今年:20岁我是:李四,今年:30岁5. 6方法重载方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同。例如,参数的个数不同,参数类型不同,参数的顺序不同等。当一个重载方法被调用时,Java根据参数的类型和(或)数量来表明实际调用的重载方法。参数不同是区分重载方法的关键因素,参数不同主要包括以下方面的不同:(
5、1)参数类型不同。例如: public void method(String s); public void method(int s);(2)参数个数不同。例如: public void method(String s,int i); public void method(String s);(3)参数顺序不同。例如: public void method(String s,int i); public void method(int i5String s);【注意】参数顺序不同的情况中一定要注意指的是参数全体,而不是简单的参数名,参数名在参数中其实没有实际意义,只是一个代号。例如: pub
6、lic void method(String s,int i); public void method(String i,int s);上面的例子是不属于顺序不同的,因为只是互换了参数的名字,参数的类型并没有互换。【实例2-5】求圆形的面积,要求用户输入任何类型的数据后都要能得到最终的 面积值。public class Methodoverloading 二号double calArea(double r) V 借书卡程序设计return PI * r * r;)float calArea (float r) return PI * r * r;)float calArea(int r) re
7、turn PI * r * r;)folat calArea (String r) return PI * i * i;)public static void main(String args) MethodOverloading mo = new MethodOverloading();面积是:+01。丛2(10);/调用参数为曷的方法面积是:+mo面积是:+mo”面积是:H+mo.calArea(M10H);可以发现方法重载主要目的是为了满足在不同输入的情况下依然可以得到 进行相同或相似的处理。在编程上有些麻烦,但是在使用性和灵活性得到了加强。 由于实现了Java在编译时的方法的多种状态,
8、所以有时也成为静态多态。在Java里,不仅普通方法可以重载,构造方法也可以重载。构造方法的重 载是为了让实例化对象和初始化变量更为方便。【实例2-61利用构造函数重载创建对不同变量初始化的对象public class Rectangle 二double width;借书卡程序设计double length;Rectangle () 直接初始化为数值width = 1;length=5;)Rectangle (double x)把两个变量初始化为相同传入值width = x;length =x;)Rectangle (double w,double len) 分别对两个属性初始化不同的值widt
9、h = w;length=len;)public void prnt()/省略方法体;)public class ConstructOverLoad public static void main(String args) Rectangle Rectanglei = new Rectangle (10,20);Rectangle Rectangle2 = new Rectangle ();Rectangle Rectangles = new Rectangle(7);省略其他语句)在实例中有三个Rectangle ()构造函数,当new执行时根据指定的参数多少 调用适当的构造函数。5. 7变
10、量的作用域变量声明的位置决定变量作用域。Java变量的范围有四个级别:类级、对 象实例级、方法级、块级。 类级变量又称全局级变量,在对象产生之前就已经存在,即用static修饰的属性。 对象实例级,就是属性变量。 方法级:就是在方法内部定义的变量,就是局部变量。 块级:就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如k for语句的块。【实例2-7】变量作用域演示程序设计public class Testvariable 2;private static String name =类级=类级借书卡程设计private int i; /对象实例级/属性块,在类初始化
11、属性时候运行intj = 3;/ 块级)public void testl () int j = 4;/方法级if (j = 4)int k = 5;/ 块级/这里不能访问块级的变量,块级变量只能在块内部访问public static void main(String args) TestVariable t = new TestVariable();Testvariable t2 = new TestVariable();程序运行结果如下:name=类另 i=0,j=4若局部变量与类的成员变量同名,则类的成员变量被隐藏。下面的例子说明 了局部变量Z和类成员变量Z的作用域是不同的。【实例2-8
12、】同名变量作用域测试程序设计借书卡程序设计public class Variable int x = 0, y = 0, z = 0;/类的成员变量 void init(int x, int y) int z = 3;/局部变量)public class VariableTest public static void main(String args) Variable v = new Variable();););运行程序结果如下。* *before init*x=O y=0 z=0* * in init *x=10 y=15 z=3* *after init*x=10 y=15 z=05.
13、8定义包和导入包的关键字Java中为了便于管理各种类,将多个具有类似功能的类方法组成一个组, 这个组就称之为包(package)o伴随着包的出现,同时解决了命名冲突、引用 不方便、安全性等问题。程序员在协同编写程序时很多时候是完全不知道别人使 用的类名,如果使用了相同的类名则会产生冲突,若使用包的机制,即使不同包 中的两个同名文件也不会冲突。这就类似于不同文件夹下允许建立相同名称的文 件。Java通过关键字package来定义包。package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包。格式如下:package 包名注释:1 .包名的命名规范是若干个标识符加分割而成。例如
14、:package5如果几个类分别属于不同的包,为了能够使用某一个包的成员,需要在Java程序中使用import关键字语导入该包。格式如下:import package1.package2.(classname|*);注解:1 . Java源文件中import语句应位于package语句之后,所有类的定义 之前。2 . *操作符表示导入包中所有的类。3 .使用Eclipse等开发工具编程时,工具会及时提醒需要导入的包。4 .导入的包可以是Java类库中的包或类,也可以是自定义的包和类。经验为了方便很多时候会使用*关键字来导入整个包,这样会增加编译时间特别 是在引入多个大包时。因此明确命名想要用到
15、的类而不是引入整个包是一个好的 方法。然而,星号形式对运行时间性能和类的大小绝对没有影响。任务实施1 .实现思路Java中的方法描述了类的行为。本任务中的行为有借书、还书和查询。在BookCard 类分别定义了 3 个方法:borrow(int);TheReturn(int);query()0 打开 Eclipse,创建 BookCard 类; 在类大括号内进行属性定义; 在类的大括号内定义3个方法,表示借书、还书和查询; 在BookCard类的main方法中,创建一个BookCard类的对象; 利用创建的BookCard对象,用对象名方法的形式调用方法,完成具体的功能; 运行程序。 .程序代
16、码public class BookCard 借书卡程序设计省略属性赋值,属性有:账号、持卡人姓名、已借书数、可借书数 public void borrow(int cash) if (Remain = cash) Remain = Remain - cash;省略输出语句public BookCard() )public BookCard(String cardnum, String name, String idname, int borrowsnumjnt returnnum, int remain) 省略属性赋值语句)public void TheReturn(int cash) Re
17、main = Remain + cash;省略输出语句public void query() public class Task02 public static void main(String args) / 程序的入口 BookCard wang = new BookCard(); / 创建类的对象 /省略属性赋值语句任务拓展一般方法都是需要有返回值的,并且调用方法后都需要使用返回值进行下一 步执行的开始,及时一些方法没有明显的返回也可以使用Boolean类型作为返 回值来说明方法执行完毕与否。下面对任务进行扩展让borrow(int). TheRetum(int)方法都具有返回值,现在改
18、为正确借书、还书后,返回true,否 则返回falseopublic class Bookcard2 A借书卡程序设计省略属性赋值public boolean borrow(int cash) if (Remain = cash) Remain = Remain - cash;return true;)return false;)public boolean TheReturn(int cash) if (cash 0) Remain = Remain + cash;return true;)return false;)public void query() )public static vo
19、id main(String args) / 程序的入口BookCard wang = new BookCard(); / 创建类的对象省略属性赋值语句ifif(wang. TheReturn(1)任务实训1 .实训目的 掌握类的方法定义和使用; 掌握定义包和导入包; 掌握变量作用域;掌握注释使用方法。、2.实训内容/ $借,卜程序设计编写一个程序,实现设置上月电表读数、设置本月电表赢、显示上月电表 读数、显示本月电表读数、计算本月用电数、显示本月用电数、计算本月用电费 用、显示本月用电费用的功能。学习任务03任务描述在现实中,人的年龄和体重都不能小于0;更恐怖的是如果忘记给名字赋值 就会成为
20、无名氏。要求使用封装完成对属性的控制,当年龄输出错误时提示出错。运行结果知识准备v一F|保护人的“隐私”程序设计 封装的概念封装是JAVA面向对象的一种特性,也是一种信息隐蔽技术。它有两个含 义:一是指把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在 一个不可分割的独立单位(即对象)中。另一层含义指“信息隐蔽”,把不需要 让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用, 但不允许更改,而另一些属性或行为,则不允许外界知晓;或只允许使用对象的 功能,而尽可能隐蔽对象的功能实现细节。Java中的封装不是为了做一个完全不能对外开放的类,这种类也没有任何 存在意义。封
21、装只是为了对类中的属性更好进行控制,因此要实现封装需要属性 私有化,这样可以保证属性不会被其他类改动。然后使用公有方法把私有的属性 暴露出去,在方法中对属性进行有效读写控制,也把这些方法称之为访问器。封 装的实现需要提供三项内容:1. 一个私有的属性(变量),使用private来声明私有变量。例如: private String name;2. 一个公有的读操作访问器,使用getter方法来完成。例如: public String getName() 方法体3. 一个公有的写操作访问器,使用setter方法来完成。例如:public void setName(String name) 方法体【
22、实例2-9】使用封装技术模拟对学生借书的过程,要求学生最多只能借10 本书。学生类中只有一个整数型变量count,为书的数量,对count设置时不能 大于10,获得count值时不能获得一个负数。public class Student 二private int count;修保护人的“隐私”程序设计public void setCount(int myCount) if(myCount10) elsecount= myCount;public int getCount() if(count protected 等。Java的非访问先支付包括:static、final、abstract nat
23、ive volatile、 synchronized 等。1 .public修饰符public修饰符表示公有,可以修饰类、属性和方法。如果使用了 public访问 控制符,则它可以被包内其他类、对象以及包外的类和对象方法使用。注意每个Java程序的主类都必须是pub I ic类。若在一个Java源文件中定义了多 个类,只能有一个类是公有类。一般的构造方法都会使用publ ic来修饰。2 .private修饰符phvate修饰符只能修饰成员变量和成员方法。若使用private声明的变量和 方法则只能由它所在类本身使用,其他的类和对象无权使用该变量和方法。封装 中就是利用了这一点特性让属性私有化。
24、如果一个类的构造方法声明为private, 则其它类不能生成该类的一个实例。3 .protected 修饰符protected修饰符表示受保护,只能用来修饰成员变量和成员方法,不能修 饰类。受保护的变量和方法的访问权限被限制在类本身、包内的所有类和定义它 的类派生出的子类(可以在同一个包中,也可以在不同包)范围内。(子类在下 一任务中详细介绍)4 .默认(friendly)修饰符如果一个类、方法或变量名前没有使用任何访问控制符,就称这个成员所拥 有的是默认的访问控制符。默认的访问控制成员可以被这个包中的其它类访问, 及称之为包访问特性。friendly并不是Java的关键字,只是对默认修饰符的
25、一种 字符形式上的定义,一般不会出现在程序中。各访问修饰符的作用效果如表2-8所示。被访问范 围PublicProtecte d默认修饰 符Private类本身VVVV包内,子类VVV包内,非子类VVV包外,子类VV包外,非子类V【实例2-10访问权限实例,在一个类中声明4中不同访问权限的方法,然 后分别在包内和包外对着4个方法进行访问。public class VisitP 刁“保护人的“隐私”程序设计private void priMethod()protected void proMethod() )public void pubMethod() )void friMethod()注解:
26、1. private void priMethod(),访问权限为私有权限,只能在Vis计P 中使用;2. protected void proMethod(),访问权限为受保护,能被类本身和 定义它的类的子类访问;3. public void pubMethod(),访问权限为公有,可以被任何类使用;4. void friMethod(),访问权限为默认(友好),可以被与定义它的 类在同一包中的所有类使用。任务实施1 .实现思路本任务中要使用包来进行Java程序中类的组织。把需要在一起工作的类放 在同一包里,除了 public修饰的类能够被所有包中的类访问外,缺省修饰符的 类只能被其所在包中
27、的类访问,不能在其包外访问。包的这种组织方式把对类的 访问封锁在一定的范围,体现了 Java面向对象的封装性。 打开Eclipse,创建一个包,在包内定义一个类;在类的大括号内定义属性,在所有属性定义前都加private关键字;在类的大括号内输入private属性的getter。和setter。方法的定义;在类的大括号内定义相应的功能方法;定义测试类,运行程序。2 .程序代码public class Person 彳呆护人的“隐私”程序设计String name;int age;double weight;public String getName() return name;)public
28、void setName(String name) public double getWeight() return weight;public int getAge() return age;public void setAge(int age) if (age static和final,通过这 些修饰符来保证成员变量的被访问范围以及创建的过程。例如:public表示该成 员变量可以被自己和其他类访问到,而static表示为静态变量创建过程不需要实 例化对象,具体在后面的单元中会详细讲解。类的方法又被称为成员方法(函数),用来描述动作、行为和功能,因此大部 分方法是以动词形式出现,如:吃、学
29、习、启动等。方法包括方法名、方法返回 值、方法参数三个要素,以及修饰符和一段用来完成某项动作或功能的方法体。 具体在后面的单元中会详细讲解。5. 3创建对象5类是对象的模板,对象是由类实例化得到,这是创建对象的依据。类也是数 据类型,可以使用这种类型来创建该种类型的对象,而Java提供的关键词为 newo格式为:类名 对象名=new 类名(参数1,参数2);例如,上面实例【2-1】中,已创建Car类,下面定义由类产生对象的语句:Car truck;声明一个Car类的对象trucktruck = new Car(); /是用new关键字实例化Car对象并赋值给truck由上面例子得出,创建属于某
30、类的对象,可以通过两个步骤来实现:1 .声明该类类型的一个变量,实际上它只是一个能够引用对象的简单变量。2 .利用new创建对象,并指派给先前所创建的变量。即在内存中划分一块区域存放创建出来的对象,并把该内存空间指向对象的引用。当然也可以把声明和实例化的过程通过一个语句完成,这种形式为:Car truck = new Car();对象实例化的过程在内存中的存在形式如图2-2:图2-2对象实例化过程的内存创建示意图创建类的对象目的是为了能够使用在这个类中已经定义好的成员变量和成 员方法。通过使用运算符对象可以实现对自己变量的访问及对自己方法的调用。对象访问格式如下:变量访问:对象名.成员变;I
31、J |=1:名;方法访问:对象名.成员方法名(参数1,参数2例如:创建2个实例2-1中的Car对象,对象名分别为truck、bus,然后 对这两个对象进行属性赋值。Car truck = new Car();二Car bus = new Car();勺 描述“人类”信息程序设计-truck与bus各自占有一块内存空间,有自己的属性值,所以truck、bus不会互相影响。这也就是说由一个类实例化出的对象相互间没有直接的关系,各自 都有着独立的存储空间,修改自己的属性是不会影响到其他对象的。图2-3由Car类实例化得到的truck和bus对象内存分配图任务实施1 .实现思路(1) 打开 Eclip
32、se,创建 Person 类;(2) 在类大括号内进行属性定义;(3) 利用创建的Person对象,使用“对象名属性名”形式进行赋值, 并输出对象的各个属性值。2 .程序代码包名-口)描述“人类”信息程序设计public class Person 省略属性声明public static void main(String args) Person p1 = new Person () ; / 声明并实例化一 Person 对象 p1Person p2 = new Person (); 声明并实例化一 Person 对象 p2 给p1的属性赋值/给p2的属性赋值p2.sex=w;省略输出语句 )
33、任务拓展任务中对类Person的测试是在类中的main。方法中进行的。但在实际的 项目中每一个有代表含义的类都是要单独存在,而测试使用的main()方法也应当 放在一个单独的类中,对上面的任务进行拓展要求新建一个PersonTest测试类, 对类Person进行测试。每个类单独为一个源代码文件。包名public class Person .省略属性声明1 A 描述“人类”信息程序设计public class PersonTest public static void main(String args) /声明并实例化一 Person对象p1Person p1 = new Person ();声
34、明并实例化一 Person对象p2Person p2 = new Person ();省略给p1的属性赋值省略给p2的属性赋值省略输出语句运行结果如下所示:任务实训1 .实训目的掌握类的定义;掌握创建类对象的方法;.掌握使用对象的步骤。n2实训内容1 峪、描述“人类”信息程序设计编写一个手机类,其中属性包括手机品牌、手机型号;方法包括显示手机信息,并编写测试 类进行对象创建。学习任务02借书卡是学生日常生活重要组成部分。每张借书卡信息包含账号、持卡人姓 名、身份证号码、地址、已借书数、可借书数、本次借书数、本次还书数。方法 有借书、还书和查询。要求根据持卡人不同操作,显示不同信息。当借书操作后
35、, 显示本次借书数及己借书数;当还书操作时,显示本次还书数和已借书数。运行结果知识准备5. 4类的方法(借书卡程序设计5类中的方法又称之为成员方法或成员函数,用来描述类所具有的功能和操 作,是一段完成某种功能或操作的代码段。方法定义的格式:访问修饰符 修饰符 返回值类型方法名称(参数列表)方法体注解:1 .返回值类型。表示方法返回值的类型。如果方法不返回任何值,它必须声 明为void(空)。对于不返回void类型的方法必须使用retun语句。方法返回 值类型必须与return语句后面的表达式数据类型一样。例如,方法中含有语句 return Java;那么方法的返回值类型必须是String类型。2 .方法名称:可以是任何Java合法标识符,一般要求方法名字要有意义, 并且首字母小写。例如:定义一个获得姓名的方法名,可以写作getNameO。3 .参数列表:参数是方法接收调用者信息的唯一途径,Java允许将参数值 传递到方法中。多个参数用逗号分开,每一个参数都要包含数据类型和参数名。 方法中的参数一般称为形式参数(简称形参),而由调用者传入的参数称之为实 际参数(简称实参)。【注意】(1)形参和实参的类型必须要一致,或