




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 类和对象-基本语法和语义 本部分主要讨论JAVA语言有关类的声明、属性、方法的语法和语义。1 类的定义(1)语法 JAVA语言定义类最简单的语法是这样的:class 类名 /属性的定义. /方法的定义. class是JAVA 的关键字,“类名”是用户自定义的标识符,作为编程风格的约定,“类名”首字母应大写。例1: class Car int speed; /属性float weight, height; void changeSpeed(int newSpeed) /方法声明 /. / 方法体 float getWeight() return weight; float getHeight() return height;(2)语义l 类是对“一类事物”的抽象描述,“类名”(比如Car)是这类事物的名字l “类名”是用户自定义的抽象类型名(而不是一个变量名),“类名”的级别与int,float,char等是同级的,它们都代表“一类事物”。l 类是引用类型的,在赋值和方法(函数)传参上体现的是“地址”特性。l 属性描述这类事物的静态特性(是什么),一般是名词性的。l 方法描述这类事物的动态特性(做什么),一般是动词性的。l “一类事物”的属性集,和围绕该属性集进行的操作(方法集),聚合成了一个类,类描述了“一类事物”。例2: 一个“人员管理类”,该类有3个属性2个方法。 class Person String id; /属性,身份证号String name; /属性,姓名String address; /属性,住址/方法,增加一个人员记录void addPerson(String id, String name, String address) /方法体. /方法,修改一个人员记录void modifyPerson(String id, String name, String address) /方法体. 2 类的属性和方法 类由属性和方法聚合而成,属性又叫类的成员变量,方法又叫类的成员方法。(1)属性(成员变量): 语法:成员变量可以是基本类型的,也可以是引用类型的,还可以使用关键字final修饰为常量(作为编程风格的约定,常量名字应该大写)。 例3: class Engine/. /声明另一个类 class Car int speed; /属性,基本类型float weight, height; /属性,基本类型final int MAX=100; /属性,常量,定义时要直接赋值 int a; /属性,数组,引用类型 Engine e; /属性,e是引用类型 /类的其它部分语义:属性描述这类事物的静态特性(是什么),一般是名词性的。注意:l 类的成员变量是在类的成员方法之外定义的,参见本课件【例1例3,】,成员变量的作用域(有效范围)是类,JAVA语言没有“全局变量”的概念。l 方法体内定义的变量不是类的成员变量,其作用域仅限于定义它的方法内。l JAVA语言任何的变量和常量,只能在类、方法、语句块内定义,不能在类以外定义。例4: class Car int speed=80; /属性,作用域在Car内float weight, height; void changeSpeed(int newSpeed) /方法声明 newSpeed+; / newSpeed只在方法内有效speed + ; / speed在Car内有效 float getWeight() weight=1008; / weight在Car内有效 return weight; float getHeight() return height;(2)方法定义方法最基本的语法是: 返回类型 方法名(形参类型 形参名。) /方法体的代码。 return 返回类型;/返回方法的运行结果,/如“返回类型”是void,则不必写return JAVA方法的语法与C/+“函数”语法的基本一样。JAVA方法的形参不仅可以是基本类型的,还可以是引用类型的(数组,对象等)-这一点在JAVA实际编程中很常用。比如:在方法内查询数据库的表,返回若干条记录,这就需要方法返回引用类型,在课件PART3中将讲解引用类型作为方法参数的若干问题。语义:l 方法描述这类事物的动态特性(做什么),一般是动词性的。l 方法代表类的一个操作,有时是简单操作(比如赋值),有时实现一个算法(比如排序),但无论如何,从软件设计的角度(不是语法角度),一个方法应该实现一个“单一功能”,而不是多个功能。注意: JAVA语言的方法只能在类的内部定义,换句话说,方法必需从属于某个类。 JAVA语言的方法不需要像C语言函数那样“先声明后实现”。重要问题:重视写函数的能力: 编程初学者最重要的是要学会两件事: 一是要学会使用循环语句,适应计算机解题的“思路”。 二是要学会写方法(函数),实现对功能单一的算法的“封装”,并正确使用形参和实参。 另外,当遇到一个编程问题时,不要先想语法如何如何(解数学题时是想想解题办法还是先想怎样使用数学符号?),而是要脱离具体编程语言,先去做一个“设计”,要先想程序应完成什么功能,如果是复杂程序,将其分解为多个函数,分而治之,上机一点点调试出来。 (3) main()方法 一个JAVA程序可能有一个或多个类,多个类可能放在同一个或不同的源程序文件中,程序从main()方法开始启动。如果一个项目中含有多个源程序文件和多个main()方法,程序将从(用户指定的)当前源程序文件的main()方法开始启动。 main()方法也是类的一个成员方法,只是该方法有几点特殊性而已,以后将陆续介绍。3 对象的实例化 类是抽象的概念,是对“一类问题”的解决方案。对象是具体的概念,是对“一类问题”下的某个具体问题的解决方案。可以用代数作类比,数学公式表示对“一类问题”的解决方案,当给公式具体的值时,解决一个具体的值,由此可见,公式表示抽象的问题,具体的值解决具体问题。类是用户自定义的类型(表示抽象的问题),将类的属性集赋不同的初值,可以得到不同的对象,解决一个个不同的具体问题。也可以认为,类是对象的模板,从类中可以“复制”出对象,这个复制过程叫对象的实例化。(1)对象实例化的语法 类名 对象名;/首先定义一个对象,类名是类型,/对象名是“类的变量” 对象名=new 构造方法名();/实例化对象,new是关键字 上面两步可以合并成一步:类名 对象名=new 构造方法名();例5:class MyClass /该类有一个属性两个方法 int z;int m1(int x, int y) return x+y; int m2(int x) return x*x; /其它代码。MyClass c1=new MyClass(); /用默认构造方法,实例化对象c1MyClass c2=new MyClass(); /用默认构造方法,实例化对象c2(2)对象实例化的语义l 对象是实体,new表示给对象在堆中分配内存,构造方法用于给对象初始化(比如,为属性赋初值)。l 虽然c1,c2 的z值都为0,但c1和c2不相等(不是同一个对象),因为对象是引用类型,对象名代表其引用(对象在内存中的首地址),由于c1和c2分别用new实例化,因此占用不同的内存空间。(3)类是用户自定义的类型,而对象是类的变量。 这对理解类和对象的概念特别重要。下面的代码:int a; a=10; 语义是什么? 答:int是JAVA预定义的基本数据类型,同时也是抽象类型,表示“整数”这一类事物,而a是表示“整数”这一类事物下面一个具体整数,应该有值。换句话说,int可以看作是一个“类”,而a是int类的一个对象。 下面的代码:MyClass c1;c1=new MyClass();语义是什么? 答:MyClass是用户自定义的抽象类型,表示“MyClass”这一类事物,c1是表示这一类事物下面一个具体事物。4 使用对象的属性和方法对象的属性和方法就是它所属的类的属性和方法,但由于类不是实体,所以不能直接使用类的属性和方法(static属性和方法例外,以后会讲到),而要通过对象去调用它们。 使用对象的属性和方法要用到“.”操作符。语法是: 对象名.属性名; 对象名.方法名;例6:class MyClass int z;int m1(int x, int y) return x+y; int m2(int x) return x*x; public static void main() MyClass c1=new MyClass(); /用默认构造方法,实例化对象 MyClass c2=new MyClass();int a,b; c1.z=20; /调用c1对象的属性z c2.z=20; /调用c2对象的属性z a=c1.m1(100,200); /调用c1对象的方法,a=300 b=c2.m1(100,200); /调用c2对象的方法,b=300如上例所示,实例化对象的语法常写在main()方法体内,因为程序从这个方法内启动, 但实例化对象的语法不是必须要写在main()方法体内,写到其它需要的位置也可以。 5 对象的引用特性 类是引用类型,对象自然也是引用类型的“类的变量”。 对象的引用特性是指:对象的名字代表对象在内存中的首地址。 关于引用类型的特点,在第2章介绍数组的引用特性已讲过一些。下面对照前面的“例6”回答几个问题:问题1:例6中,c1.z=20和 c2.z=20中的z是一回事吗?c1.m1()和c2.m1()呢?答:c1和c2都用了new实例化,是同一个类的不同对象,各自占用不同的内存空间,对c1属性和方法的调用不影响c2,反之依然。问题2:下面的代码执行后是什么效果? MyClass c1=new MyClass(); MyClass c2=new MyClass(); c1=c2;答:前2句代码c1和c2是不同对象,当c1=c2后,c1和c2是不同名字的同一个对象,原有的c1被JAVA垃圾自动回收机制销毁了。 对象的引用特性是JAVA语言的重点和难点,要抓住“对象的引用就是对象在内存中的首地址”这个要点学习。 6 构造方法和析构方法 每一个JAVA类都含有两种特殊的方法:构造方法和析构方法。(1)构造方法语法:l 构造方法没有返回类型,方法名与类名相同。l 构造方法可以重载,重载规则同普通方法(下一章再作讲解)。l 构造方法只能在实例化对象时调用,与new配套使用,见【例6】,【例7】。(2)构造方法语义:l 类是个抽象类型,类的属性不能有具体的初值(常量属性除外,)而对象是具体的“类变量”,必需要有初值。构造方法用于给对象初始化(属性初值),从而产生某个具体的对象。例7:下面是构造方法的样例public class MyDate int year, month, day /类的属性 MyDate(int y, int m, int d) /构造方法声明 year=y; month=m;day=d; /构造方法初始化类的属性 public static void main() MyDate d0=new MyDate(1990,6,12); /调用构造方法初始化对象, /此时,d0.year=1990,d0.month=6,d0.day=12 /注意构造方法调用时,参数个数和类型匹配 MyDate d1=new MyDate(); /错,参数个数不匹配,/MyDate类无此构造方法 int y=1990, m=6,d=12; MyDate d2=new MyDate(y,m,d ); / 正确,参数匹配 /此时,d2.year=1990,d2.month=6,d2.day=12 MyDate d3=new MyDate(y,m ); / 错,参数不匹配 MyDate d4=new MyDate(“龙年”,1,1); / 错,参数个数匹配 /但类型不匹配 问题:该例题成功实例化了2个对象:d0,d2,请注意这2个对象各自占有不同的内存,但它们的属性值year,month ,day是一一相等的。那么:(1) d0=d2; 返回true还是false?(2) d0.year=d2.year; 返回true还是false?(3) d0=d2; d0=d2;返回true还是false?请根据对象的引用特性回答上述问题。(3)其它事项l 程序员可以不写构造方法,这样的话,系统给类默认一个构造方法,该构造方法是无参的。默认构造方法可以给类的属性默认值(例如:属性是数值型的默认为0,引用型的默认为null,null表示一个空对象)。【例6】使用的是默认构造方法。l 当程序员写了构造方法后(有参的或无参的),默认构造方法无效。【例7】使用MyDate d1=MyDate();出现错误,原因一是参数个数不匹配,二是系统认为MyDate()是默认构造方法,由于该程序已经写了一个构造方法MyDate(int y, int m, int d),则默认构造方法无效。l 一般来说,作为程序功能的要求,程序员需要自已写构造方法,尤其是要写无参构造方法,写好构造方法是面向对象编程人员的基本功。 析构方法 调用构造方法可以产生对象,而调用析构方法可以销毁对象,使之不占用内存。(1)析构方法语法: 无论类的名字是什么,析构方法始终是: public void finalize() /析构方法没有形参 /方法体内的其它代码 ; (2)其它事项l 如果程序员不写析构方法,系统自动默认一个析构方法,在大多数类中,都不需要写析构方法。l 对于初级JAVA程序员来说,如何写析构方法不是必需掌握的,只需知道析构方法是做什么用的即可。(3)析构方法的调用:可以用: 对象名. finalize(); 的调用方式销毁对象,释放对象占用的内存,但一般不推荐这样调用。因为JAVA有内存自动管理机制,可以自动调用无用对象的析构方法以销毁对象。在实际编程中,如果程序员认为某对象无用,可以调用 对象名. finalize(); 销毁对象,但这样做可能会用副作用,一个更好的办法是,将对象赋值为null(对象名=null),“通知”JAVA的内存自动管理机制,用该机制内置的算法,自动销毁对象。 7 本章综合样例 本章讲解了JAVA语言面向对象部分最基本、最常用的语法和语义,包括: 类、属性、方法的声明; 对象实例化(new操作符和构造方法); 调用对象的属性和方法(“.”操作符); 构造方法和析构方法(系统默认的和自定义的)。 这些内容都非常重要,可以说,本章是课程最重要的一章。 配套的“课件例题”提供了几个关于本章内容的综合性样例程序,供同学们学习。【注:下面第810小节,介绍与面向对象核心概念无关,但比较常用的语法】8 关键字null 在定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值(编译器可能会告警,但不会报错)。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各引用类型(对象、数组)变量自动赋值为null。 程序员也可以把一个对象赋值为null。例如:示例8class A static void main(String args) A a=new A(); /对象a有确定引用,不是null a=null; / a的引用不确定 A aa=new A(); a=aa; /现在 a又确定了在实际编程中,null是很常用但又难以捉摸的,一个对象为null不表示这个对象已被销毁,这个对象可能还是存在的,只是“暗示”垃圾自动回收机制可以销毁它,但是否真的销毁,还要看这个null对象和其他对象的关系。程序员可以把自已认为不再需要的对象设为null,让垃圾自动回收机制去定夺是否可以销毁它,这比程序员直接调用析构方法销毁对象要可靠,本课件前面介绍析构方法时讲过,程序员一般不要自行调用析构方法,而是让垃圾自动回收机制去自动调用。9 关键字static static可以修饰类的属性和方法。例如:例9public class Car static int count=0; /静态属性,统计汽车产量 int speed=0; /普通属性 Car() /构造方法 count+; speed+; static void printcount() /static方法 System.out.println(count=+count); void printspeed() /普通方法 System.out.println(speed=+speed); public static void main(String args) Car car1=new Car(); Car car2=new Car(); Car car3=new Car(); Car.printcount(); /static方法可用类名.方法名调用 car1.printcount(); /static方法也可用对象名.方法名调用 car1.printspeed(); / car2.printcount(); / car2.printspeed(); / car3.printcount(); / car3.printspeed(); / 该程序运行结果是:car1,car2,car3的count值均为3,speed均为1,为什么?(1)static修饰的属性用static修饰的属性叫“静态属性”、“静态成员变量”或“类变量”“类成员”。static属性即可以使用: 对象名.属性名 的方式访问,也可以使用:类名.属性名 的方式访问,此时不需要预先实例化对象。其语义为:无论从类中实例化多个对象,这些对象共享使用该静态属性的值,也就是说,这些对象共享使用该静态属性占用的内存。而非静态属性是独立存放在各个对象各自内存中的。在【例9】中,car1,car2,car3共享static变量count,独享普通变量speed,才造成count=3,speed=1的输出结果。 (2)static修饰的方法用static修饰的方法叫“静态方法”“类成员”。static方法即可以使用: 对象名.方法名() 的方式访问,也可以使用:类名.方法名() 的方式访问,此时不需要预先实例化对象。如【例9】所示。(3)在实际编程中如何使用static: 原则上,static是不推荐使用的,它与面向对象的设计概念有些不符,此外static属性和方法在程序的生命周期内始终占用内存。 只有在一个类的多个对象确实需要维护一个共享变量时,才使用static属性。 如果在一个方法确实被频繁使用,该方法又不占用过多资源时,才把方法声明为static的。(4)关于main()方法的讨论main()方法的原型是:static void main(String args)问题1:为什么main()方法是static的?答:程序从main()方法启动时,还没有实例化任何对象,main()方法只能是static的(不需要对象即可调用),然后在main()方法内执行一些实例化对象的操作。(5)关于static方法的讨论static方法体内(包括main()方法体内)不能调用(未经实例化的)非static方法和属性,比如【例9】的下列方法static void printcount() /static方法 System.out.println(count=+count);改成:static voi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息咨询合同标准文本 英语
- 免烧砖买卖合同标准文本
- 公路机电合同样本
- 个人资金托管合同标准文本
- 中标多家医院项目合同样本
- 产品股权合同样本
- 企业废料收购合同样本
- 个人档案合同标准文本
- 策划调酒师考试的多元练习试题及答案
- 2025上海市郊区土地流转承包合同(I)
- 基坑工程土方开挖支护与降水监理实施细则
- 江苏徐州市深地科学与工程云龙湖实验室社会招考聘用9人模拟试卷【附答案解析】
- 土方回填施工记录表
- 植物根茎叶课件
- 反生产行为讲稿
- 施工现场消防安全技术交底
- 冀教版二年级语文下册看图写话专项加深练习题含答案
- 焊接工艺评定及焊接工艺技术评定管理标准
- 洗衣房各岗位工作流程
- 基于SWOT分析的义乌市现代物流业发展研究
- 基于自适应滤波对音频信号的处理详解
评论
0/150
提交评论