04类和对象基本语法和语义.docx
《04类和对象基本语法和语义.docx》由会员分享,可在线阅读,更多相关《04类和对象基本语法和语义.docx(15页珍藏版)》请在冰豆网上搜索。
04类和对象基本语法和语义
第4章类和对象----基本语法和语义
本部分主要讨论JAVA语言有关类的声明、属性、方法的语法和语义。
1类的定义
(1)语法
JAVA语言定义类最简单的语法是这样的:
class类名
{//属性的定义….
//方法的定义….
}
class是JAVA的关键字,“类名”是用户自定义的标识符,作为编程风格的约定,“类名”首字母应大写。
例1:
classCar
{
intspeed;//属性
floatweight,height;
voidchangeSpeed(intnewSpeed)//方法声明
{//……..}//方法体
floatgetWeight()
{returnweight;}
floatgetHeight()
{returnheight;}
}
(2)语义
●类是对“一类事物”的抽象描述,“类名”(比如Car)是这类事物的名字
●“类名”是用户自定义的抽象类型名(而不是一个变量名),“类名”的级别与int,float,char等是同级的,它们都代表“一类事物”。
●类是引用类型的,在赋值和方法(函数)传参上体现的是“地址”特性。
●属性描述这类事物的静态特性(是什么),一般是名词性的。
●方法描述这类事物的动态特性(做什么),一般是动词性的。
●“一类事物”的属性集,和围绕该属性集进行的操作(方法集),聚合成了一个类,类描述了“一类事物”。
例2:
一个“人员管理类”,该类有3个属性2个方法。
classPerson
{
Stringid;//属性,身份证号
Stringname;//属性,姓名
Stringaddress;//属性,住址
//方法,增加一个人员记录
voidaddPerson(Stringid,Stringname,Stringaddress)
{//方法体……..}
//方法,修改一个人员记录
voidmodifyPerson(Stringid,Stringname,Stringaddress)
{//方法体……..}
}
2类的属性和方法
类由属性和方法聚合而成,属性又叫类的成员变量,方法又叫类的成员方法。
(1)属性(成员变量):
语法:
成员变量可以是基本类型的,也可以是引用类型的,还可以使用关键字final修饰为常量(作为编程风格的约定,常量名字应该大写)。
例3:
classEngine{//…..}//声明另一个类
classCar
{
intspeed;//属性,基本类型
floatweight,height;//属性,基本类型
finalintMAX=100;//属性,常量,定义时要直接赋值
int[]a;//属性,数组,引用类型
Enginee;//属性,e是引用类型
//类的其它部分……
}
语义:
属性描述这类事物的静态特性(是什么),一般是名词性的。
注意:
●类的成员变量是在类的成员方法之外定义的,参见本课件【例1—例3,】,成员变量的作用域(有效范围)是类,JAVA语言没有“全局变量”的概念。
●方法体内定义的变量不是类的成员变量,其作用域仅限于定义它的方法内。
●JAVA语言任何的变量和常量,只能在类、方法、语句块内定义,不能在类以外定义。
例4:
classCar
{
intspeed=80;//属性,作用域在Car内
floatweight,height;
voidchangeSpeed(intnewSpeed)//方法声明
{newSpeed++;//newSpeed只在方法内有效
speed++;//speed在Car内有效
}
floatgetWeight()
{weight=1008;//weight在Car内有效
returnweight;
}
floatgetHeight()
{returnheight;}
}
(2)方法
定义方法最基本的语法是:
返回类型方法名(形参类型形参名。
。
。
。
)
{
//方法体的代码。
。
return返回类型;//返回方法的运行结果,
//如“返回类型”是void,则不必写return
}
JAVA方法的语法与C/++“函数”语法的基本一样。
JAVA方法的形参不仅可以是基本类型的,还可以是引用类型的(数组,对象等)----这一点在JAVA实际编程中很常用。
比如:
在方法内查询数据库的表,返回若干条记录,这就需要方法返回引用类型,在课件PART3中将讲解引用类型作为方法参数的若干问题。
语义:
●方法描述这类事物的动态特性(做什么),一般是动词性的。
●方法代表类的一个操作,有时是简单操作(比如赋值),有时实现一个算法(比如排序),但无论如何,从软件设计的角度(不是语法角度),一个方法应该实现一个“单一功能”,而不是多个功能。
注意:
JAVA语言的方法只能在类的内部定义,换句话说,方法必需从属于某个类。
JAVA语言的方法不需要像C语言函数那样“先声明后实现”。
重要问题:
重视写函数的能力:
编程初学者最重要的是要学会两件事:
一是要学会使用循环语句,适应计算机解题的“思路”。
二是要学会写方法(函数),实现对功能单一的算法的“封装”,并正确使用形参和实参。
另外,当遇到一个编程问题时,不要先想语法如何如何(解数学题时是想想解题办法还是先想怎样使用数学符号?
),而是要脱离具体编程语言,先去做一个“设计”,要先想程序应完成什么功能,如果是复杂程序,将其分解为多个函数,分而治之,上机一点点调试出来。
(3)main()方法
一个JAVA程序可能有一个或多个类,多个类可能放在同一个或不同的源程序文件中,程序从main()方法开始启动。
如果一个项目中含有多个源程序文件和多个main()方法,程序将从(用户指定的)当前源程序文件的main()方法开始启动。
main()方法也是类的一个成员方法,只是该方法有几点特殊性而已,以后将陆续介绍。
3对象的实例化
类是抽象的概念,是对“一类问题”的解决方案。
对象是具体的概念,是对“一类问题”下的某个具体问题的解决方案。
可以用代数作类比,数学公式表示对“一类问题”的解决方案,当给公式具体的值时,解决一个具体的值,由此可见,公式表示抽象的问题,具体的值解决具体问题。
类是用户自定义的类型(表示抽象的问题),将类的属性集赋不同的初值,可以得到不同的对象,解决一个个不同的具体问题。
也可以认为,类是对象的模板,从类中可以“复制”出对象,这个复制过程叫对象的实例化。
(1)对象实例化的语法
类名对象名;//首先定义一个对象,类名是类型,
//对象名是“类的变量”
对象名=new构造方法名();//实例化对象,new是关键字
上面两步可以合并成一步:
类名对象名=new构造方法名();
例5:
classMyClass//该类有一个属性两个方法
{intz;
intm1(intx,inty){returnx+y;}
intm2(intx){returnx*x;}
//其它代码。
。
。
}
MyClassc1=newMyClass();//用默认构造方法,实例化对象c1
MyClassc2=newMyClass();//用默认构造方法,实例化对象c2
(2)对象实例化的语义
●对象是实体,new表示给对象在堆中分配内存,构造方法用于给对象初始化(比如,为属性赋初值)。
●虽然c1,c2的z值都为0,但c1和c2不相等(不是同一个对象),因为对象是引用类型,对象名代表其引用(对象在内存中的首地址),由于c1和c2分别用new实例化,因此占用不同的内存空间。
(3)类是用户自定义的类型,而对象是类的变量。
这对理解类和对象的概念特别重要。
下面的代码:
inta;a=10;语义是什么?
答:
int是JAVA预定义的基本数据类型,同时也是抽象类型,表示“整数”这一类事物,而a是表示“整数”这一类事物下面一个具体整数,应该有值。
换句话说,int可以看作是一个“类”,而a是int类的一个对象。
下面的代码:
MyClassc1;c1=newMyClass();语义是什么?
答:
MyClass是用户自定义的抽象类型,表示“MyClass”这一类事物,c1是表示这一类事物下面一个具体事物。
4使用对象的属性和方法
对象的属性和方法就是它所属的类的属性和方法,但由于类不是实体,所以不能直接使用类的属性和方法(static属性和方法例外,以后会讲到),而要通过对象去调用它们。
使用对象的属性和方法要用到“.”操作符。
语法是:
对象名.属性名;
对象名.方法名;
例6:
classMyClass
{intz;
intm1(intx,inty){returnx+y;}
intm2(intx){returnx*x;}
publicstaticvoidmain(){
MyClassc1=newMyClass();//用默认构造方法,实例化对象
MyClassc2=newMyClass();
inta,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:
下面的代码执行后是什么效果?
MyClassc1=newMyClass();
MyClassc2=newMyClass();
c1=c2;
答:
前2句代码c1和c2是不同对象,当c1=c2后,c1和c2是不同名字的同一个对象,原有的c1被JAVA垃圾自动回收机制销毁了。
对象的引用特性是JAVA语言的重点和难点,要抓住“对象的引用就是对象在内存中的首地址”这个要点学习。
6构造方法和析构方法
每一个JAVA类都含有两种特殊的方法:
构造方法和析构方法。
(1)构造方法语法:
●构造方法没有返回类型,方法名与类名相同。
●构造方法可以重载,重载规则同普通方法(下一章再作讲解)。
●构造方法只能在实例化对象时调用,与new配套使用,见【例6】,【例7】。
(2)构造方法语义:
●类是个抽象类型,类的属性不能有具体的初值(常量属性除外,)而对象是具体的“类变量”,必需要有初值。
构造方法用于给对象初始化(属性初值),从而产生某个具体的对象。
例7:
下面是构造方法的样例