Java课件1第4章 类与对象_第1页
Java课件1第4章 类与对象_第2页
Java课件1第4章 类与对象_第3页
Java课件1第4章 类与对象_第4页
Java课件1第4章 类与对象_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

4.1编程语言的几个发展阶段

4.1.1面向机器语言4.1.2面向过程语言4.1.3面向对象语言使用机器语言编程也称作面向机器编程。20世纪50年代出现了汇编语言,在编写指令时,用一些简单的容易记忆的符号来代替二进制指令,但汇编语言仍是面向机器语言,需针对不同的机器来编写不同的代码。语言把代码组成叫做过程或函数的块。每个块的目标是完成某个任务,例如,一个C的源程序就是由若干个书写形式互相独立的函数组成。面向对象语言中,最核心的内容就是“对象”,一切围绕着对象。1.封装性面向对象编程核心思想之一就是将数据和对数据的操作封装在一起,形成一般的概念,比如类的概念。2.继承继承体现了一种先进的编程模式。子类可以继承父类的属性和功能。3.多态多态是面向对象编程的又一重要特征,是编写出易维护,易扩展程序的保障。4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题类的定义包括两部分:类声明和类体。基本格式为:class

类名

{

类体的内容}class

是关键字,用来定义类。“class类名”是类的声明部分,类名必须是合法的Java标识符。两个大括号以及之间的内容是类体。例如:classPeople

{…}class

动物

{…}如果类名使用拉丁字母,那么名字的首字母使用大写字母,如Hello,Time,Dog等。2.类名最好容易识别、见名知意。当类名由几个“单词”复合而成时,每个单词的首字母使用大写,如BeijingTime,AmericanGame,HelloChina等。4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题类的关键是抓住事物的两个方面:属性和行为,即数据以及在数据上所进行的操作,因此类体的内容由如下所述的两部分构成:class

梯形

{

float上底,下底,高,ladderArea;//变量声明部分

float计算面积(){//方法定义

ladderArea=(上底+下底)*高/2.0f;

returnladderArea;

}

void修改高(floath){//方法定义

高=h;

}}变量的声明:用来存储属性的值(体现对象的属性)。方法的定义:方法可以对类中声明的变量进行操作,即给出算法(体现对象所具有的行为功能)。4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题类体分为两部分:一部分是变量的声明,变量声明部分所声明的变量被称作类的成员变量。另一部分是方法的定义,在方法体中声明的变量和方法的参数被称作局部变量。成员变量在整个类内都有效,局部变量只在声明它的方法内有效。方法参数在整个方法内有效,方法内的局部变量从声明它的位置之后开始有效。成员变量的有效性(在各个方法内有效)与它在类体中书写的先后位置无关。例如,前述的梯形类也可以写成:class梯形{float上底,ladderArea;//成员变量的定义

float计算面积(){ladderArea=(上底+下底)*高/2.0f;returnladderArea;}float下底;//成员变量的定义

void修改高(floath){//方法定义高=h;}float高;//成员变量的定义}4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题成员变量又分为实例变量和类变量。在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量),例如:classDog{

floatx;

//实例变量

staticinty;//类变量}如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。例如:classTom{

intx=98,y;

voidf(){

intx=3;//局部变量x和成员变量x名字相同

y=x;//y得到的值是3,不是98。如果方法f中没有

“intx=3;”,y的值将是98

}}变量的名字除了符合标识符规定外,名字的首单词的首字母使用小写;如果变量的名字由多个单词组成,从第2个单词开始的其它单词的首字母使用大写.4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题方法的定义包括两部分:方法声明和方法体。一般格式为:方法声明部分

{

方法体的内容}写一个方法和C语言中写一个函数完全类似,只不过在面向对象语言中称作方法,因此如果有比较好的C语言基础,编写方法的方法体已不再是难点。例如:intgetSum(intn){intsum=0;//声明局部变量

for(inti=1;i<=n;i++){//for循环语句

sum=sum+i;}returnsum;//return语句}方法起名字的习惯和给变量起名字的习惯类似,首写字母使用小写,如果名字由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写。4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题方法重载是多态性的一种,例如,你让一个人执行“求面积”操作时,他可能会问你求什么面积?所谓功能多态性是指可以向功能传递不同的消息,以便让对象根据相应的消息来产生相应的行为。对象的功能通过类中的方法来体现,那么功能的多态性就是方法的重载。方法重载的意思是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是某个参数的类型不同。classArea{floatgetArea(floatr){return3.14f*r*r;}doublegetArea(floatx,inty){returnx*y;}floatgetArea(intx,floaty){returnx*y;}doublegetArea(floatx,floaty,floatz){return(x*x+y*y+z*z)*2.0;}}Area类中getArea方法是一个重载方法:4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型,构造方法也可以重载。例如:class梯形{float上底,下底,高;

梯形(){//构造方法上底=60;

下底=100;

高=20;}

梯形(floatx,inty,floath){//构造方法上底=x;

下底=y;

高=h;}}4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题类中的方法(非构造方法)可分为实例方法和类方法。方法声明时,方法类型前面不加关键字static修饰的是实例方法、加static修饰的是类方法(静态方法):classA{inta;floatmax(floatx,floaty){//实例方法

…}

staticfloatjerry(){//类方法

…}

staticvoidspeak(Strings){//类方法

…}}4.2类

4.2.1类声明4.2.2类体4.2.3成员变量和局部变量4.2.4方法4.2.5方法重载4.2.6构造方法4.2.7类方法和实例方法4.2.8两个值得注意的问题1.对成员变量的操作只能放在方法中,方法可以对成员变量和该方法体中声明的局部变量进行操作。在声明类的成员变量时可以同时赋予初值,如:classA{inta=12;floatb=12.56f;}classA{inta;floatb;

a=12;//非法,这是赋值语句(语句只能出现方法体中),不是变量的声明

b=12.56f;//非法}2.实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作。实例方法可以调用该类中的实例或类方法;类中的类方法只能调用该类的类方法,不能调用实例方法但是不可以这样做:4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体类是面向对象语言中最重要的一种数据类型,可以用类来声明变量。在面向对象语言中,用类声明的变量被称为对象构造方法是类中的一种特殊方法(见4.2.6,其名字和类名相同且没有类型),当程序用类创建对象时需使用它的构造方法。1.默认的构造方法

如果类中没有编写构造方法,系统会默认该类只有一个构造方法,该默认的构造方法是无参数的,且方法体中没有语句。2.自定义构造方法如果定义了一个或多个构造方法,那么Java不提供默认的构造方法,例如,下列Point类有两个构造方法。classPoint{Point(){}Point(inta,intb){}}4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体3.构造方法没有类型需要特别注意的是,构造方法没有类型,下列Point类中只有一个构造方法,其中的voidPoint(inta,intb)和intPoint()都不是构造方法。classPoint{intx,y;Point(){//是构造方法

x=1;y=1;}voidPoint(inta,intb){//不是构造方法(该方法的类型是void)

x=a;y=b;}intPoint(){//不是构造方法(该方法的类型是int)

return12;}}4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体1.对象的声明一般格式为:类的名字对象名字;如:

Pointp;创建一个对象包括对象的声明和为对象分配变量两个步骤。2.为声明的对象分配变量使用new运算符和类的构造方法为声明的对象分配变量,即创建对象。如果类中没有构造方法,系统会调用默认的构造方法,默认的构造方法是无参数的,且方法体中没有语句。简单的例子1。例子1classXiyoujiRenwu{floatheight,weight;Stringhead,ear;voidspeak(Strings){System.out.println(s);}}publicclassExample4_1{publicstaticvoidmain(Stringargs[]){

XiyoujiRenwuzhubajie,sunwukong;//声明对象

zhubajie=newXiyoujiRenwu();//为对象分配变量

sunwukong=newXiyoujiRenwu();}}4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体3.对象的内存模型用XiyoujiRenwu类声明一个变量zhubajie,即对象zhubajie时(如例子1)XiyoujiRenwuzhubajie;内存模型如图所示。zhubajie的内存中还没有任何数据,称这时的zhubajie是一个空对象。4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体3.对象的内存模型

newXiyoujiRenwu()就会做下列两件事。(1)为height,weight,head,ear各个变量分配内存并初始化这些变量的值,然后执行构造方法中的语句。(2)计算出一个称作引用的值(该值包含着这些成员变量内存位置及相关的重要信息),即表达式

newXiyoujiRenwu()

是一个值。如果把该引用赋值给zhubajie:zhubajie=newXiyoujiRenwu();那么Java系统分配的height,weight,head,ear的内存单元将由zhubajie操作管理,称height,weight,head,ear是属于对象zhubajie的实体,即这些变量是属于zhubajie的。所谓创建对象就是指为对象分配变量,并获得一个引用,以确保这些变量由该对象来操作管理。分配变量后的对象的内存模型如图所示。当使用一个类创建一个对象时,也称给出了这个类的一个实例。4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体3.对象的内存模型使用new运算符可以创建多个不同的对象,这些对象的变量将被分配不同的内存空间。创建对象zhubajie时,XiyoujiRenwu类中的成员变量height,weight,head,ear被分配内存空间,并返回一个引用给zhubajie;当再创建一个对象sunwukong时,XiyoujiRenwu类中的成员变量height,weight,head,ear再一次被分配内存空间,并返回一个引用给sunwukong。sunwukong的变量所占据的内存空间和zhubajie的变量所占据的内存空间是互不相同的位置。内存模型如图所示。zhubajie=newXiyoujiRenwu();sunwukong=newXiyoujiRenwu();4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体1.对象操作自己的变量(体现对象的属性)对象创建之后,就有了自己的变量,即对象的实体。对象通过使用点运算符“.”(点运算符也称引用运算符或访问运算符)访问自己的变量,访问格式为:

对象.变量;

2.对象调用类中的方法(体现对象的行为)对象创建之后,可以使用点运算符“.”调用创建它的类中的方法,从而产生一定的行为(功能),调用格式为:

对象.方法;3.体现封装当对象调用方法时,方法中出现的成员变量就是指分配给该对象的变量。在讲述类的时候讲过:类中的方法可以操作成员变量。当对象调用方法时,方法中出现的成员变量就是指分配给该对象的变量。对象调用方法时,方法中的局部变量被分配内存空间。方法执行完毕,局部变量即刻释放内存。局部变量没有默认值,因此在使用局部变量之前,要保证该局部变量有值。4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体对于初学者,首先需要掌握在主类的main方法中使用类来创建对象,并让创建的对象产生行为。在例子2中,在主类的main方法中使用Xiyoujirenwu类创建了两个对象:zhubajie、sunwukong,并各自产生了行为。需要三次打开文本编辑器分别编辑、保存:PersonName.java,Xiyoujirenwu.java和Example4_2.java,比如,保存在C:\chapter4目录中,然后分别编译,最后运行主类即可,运行效果如图。例子2PersonName.javaXiyoujiRenwu.javaExample4_2.java当对象调用该方法时,方法中出现的成员变量就是指该对象的成员变量。在例子2中,当对象zhubajie调用过方法speak之后,就将自己的head修改成:“美男头”;同样,对象sunwukong调用过方法speak之后,也就将自己的head修改成:“美女头”。4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体类是体现封装的一种数据类型(封装着数据和对数据的操作),类所声明的变量被称为对象,对象(变量)负责存放引用,以确保对象可以操作分配给该对象的变量以及调用类中的方法。分配给对象的变量被习惯地称作对象的实体。1.避免使用空对象如果对象中没有存放一个引用值,这样的对象就是空对象。空对象没有属于自己的变量,因此避免让空对象去访问变量和调用方法。Java编译器对空对象不做检查,但空对象去访问变量和调用方法,运行时会触发java.lang.NullPointerException异常。2.重要结论一个类声明的两个对象,一旦二者具有相同的引用,二者就具有完全相同的变量(实体)。4.3对象

4.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体对于下列Point类:classPoint{intx,y;Point(inta,intb){x=a;y=b;}}如果创建2个对象:Pointp1=newPoint(5,15);Pointp2=newPoint(8,18);p1和p2的引用不同假如在程序中使用了如下的赋值语句:p1=p2;p1和p2的引用相同把p2中的引用赋给了p1,因此p1和p2本质上是一样的了。虽然在源程序中p1和p2是两个名字,但在系统看来它们的名字是一个:0x999,系统将取消原来分配给p1的变量(如果这些变量没有其他对象继续引用)。这时如果输出p1.x的结果将是8,而不是5,即p1和p2有相同的变量(实体)。例子34.3.1构造方法4.3.2创建对象4.3.3使用对象4.3.4对象的引用和实体例子3将对象p2的引用赋给了对象p1,运行效果如图。例子34.4参数传值

4.4.1基本数据类型参数的传值4.4.2引用类型参数的传值4.4.3可变参数4.4.4有理数的类封装方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别,比如,不可以向int型参数传递一个float值,但可以向double型参数传递一个float值Example4_4.java是含有主类的应用程序。在主类的main方法中使用Rect类来创建矩形对象,该矩形对象可以调用setWidth(doublewidth)设置自己的宽,调用setHeight(doubleheight)设置自己的高,因此,矩形对象在调用setWidth(doublewidth)或setHeight(doubleheight)方法时,必须向方法的参数传递值。程序运行效果如图。例子4Rect.javaExample4_4.java4.4参数传值

4.4.1基本数据类型参数的传值4.4.2引用类型参数的传值4.4.3可变参数4.4.4有理数的类封装Java的引用型数据包括前面刚刚学习的对象、第2章学习的数组以及后面将要学习的接口。当参数是引用类型时,“传值”传递的是变量中存放的“引用”,而不是变量所引用的实体。对于两个同类型的引用型变量,如果具有同样的引用,就会用同样的实体,因此,如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化;但是,改变参数中存放的“引用”不会影响向其传值的变量中存放的“引用”,反之亦然。例子5Example4_5.java是主类。在主类的main方法中首先使用Circlet类创建一个“圆”对象:circle,然后使用Circular类再创建一个“圆锥”对象,并将先前Circle类的实例:circle,即“圆”对象的引用传递给圆锥对象的成员变量bottom。程序运行效果如图。Circle.javaCircular.javaExample4_5.java4.4参数传值

4.4.1基本数据类型参数的传值4.4.2引用类型参数的传值4.4.3可变参数4.4.4有理数的类封装可变参数是指在声明方法时不给出参数列表中从某项直至最后一项参数的名字和个数,但这些参数的类型必须相同。可变参数使用“…”表示若干个参数,这些参数的类型必须相同,最后一个参数必须是参数列表中的最后一个参数。比如:publicvoidg(doublea,int...x)那么,方法g的参数列表中,第一个参数是double型,第二个至最后一个参数是int型,但连续出现的int型参数的个数不确定。称x是方法g的参数列表中的可变参数的“参数代表”参数代表可以通过下标运算来表示参数列表中的具体参数,即x[0],x[1]…x[m]分别表示x代表的第1个至第m个参数。例子6中,有两个Java源文件Computer.java和Example2_6.java,其中Computer类的方法getResult()方法使用了参数代表,可以计算若干个整数的平均数,运行效果如图。例子6Computer.javaExample4_6.java4.4参数传值

4.4.1基本数据类型参数的传值4.4.2引用类型参数的传值4.4.3可变参数4.4.4有理数的类封装分数也称作有理数,是我们很熟悉的一种数。有时希望程序能对分数进行四则运算,而且两个分数四则运算的结果仍然是分数(不希望看到1/6+1/6的结果是小数的近似值0.333而是1/3)。有理数Rational.javaMainClass.java用类实现对有理数的封装。有理数有两个重要的成员:分子和分母,另外还有重要的四则运算。Rational(有理数)类应当具有如下属性(成员变量)和功能(方法)。Rational类有2个int型的成员变量,比如,名字分别为numerator(分子)和denominator(分母)。提供Rationaladd(Rationalr)方法,即有理数调用该方法和参数指定的有理数做加法运算,并返回一个Rational对象。提供Rationalsub(Rationalr)方法,即有理数调用该方法和参数指定的有理数做减法运算,并返回一个Rational对象。提供Rationalmuti(Rationalr)方法,即有理数调用该方法和参数指定的有理数做乘法运算,并返回一个Rational对象。提供Rationaldiv(Rationalr)方法,即有理数调用该方法和参数指定的有理数做除法运算,并返回一个Rational对象。4.5对象的组合

一个类的成员变量可以是Java允许的任何数据类型,因此,一个类可以把对象作为自己的成员变量,如果用这样的类创建对象,该对象就将其他对象作为自己的组成部分(这就是人们常说的Has-A,例如,前面4.3节中的例子5中的圆锥对象就将一个圆对象作为自己的成员,即圆锥有一个圆底)。例子7中,一共编写了4个类,分成4个源文件Rectangle.java、Circle.java、Geometry.java和Example4_7.java,需要将这4个源文件分别编辑,并保存在相同的目录中,比如C:\chapter4中。Geometry类有Rectangle类型和Circle类型的成员变量,名字分别为rect和circle,也就是说Geometry类创建的对象(几何图形)是由一个Rectangle对象和一个Circle对象组合而成(如右图所示意)。Rectangle.javaCircle.javaGeometry.javaExample4_7.java例子74.6static关键字

4.6.1实例变量和类变量的区别4.6.2实例方法和类方法的区别类的字节码文件被加载到内存,如果该类没有创建对象,类中的实例变量不会被分配内存。但是,类中的类变量,在该类被加载到内存时,就分配了相应的内存空间。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配内存,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才释放所占有的内存。类变量是与类相关联的数据变量,也就是说,类变量是和该类创建的所有对象相关联的变量,改变其中一个对象的这个类变量就同时改变了其它对象的这个类变量。因此,类变量不仅可以通过某个对象访问,也可以直接通过类名访问。实例变量仅仅是和相应的对象关联的变量,也就是说,不同对象的实例变量互不相同,即分配不同的内存空间,改变其中一个对象的实例变量不会影响其它对象的这个实例变量。实例变量可以通过对象访问,不能使用类名访问。例子8中的Lader.java中的Ladder类创建的梯形对象共享一个下底。例子8Ladder.javaExample4_8.java4.6static关键字

4.6.1实例变量和类变量的区别4.6.2实例方法和类方法的区别类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享。对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。实例方法不能通过类名调用.例子9中,A类中的getContinueSum方法是类方法。例子9如果一个方法不需要操作实例成员变量就可以实现某种功能,就可以考虑将这样的方法声明为类方法。这样做的好处是,避免创建对象浪费内存。实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作。4.7this关键字4.7.1在构造方法中使用this4.7.2在实例方法中使用thisthis是Java的一个关键字,表示某个对象。this可以出现在实例方法和构造方法中,但不可以出现在类方法中。实例方法必须只能通过对象来调用,不能用类名来调用。当this出现实例方法中时,代表正在调用该方法的当前对象。实例方法可以操作类的成员变量,当实例成员变量在实例方法中出现时,默认的格式是:this.成员变量编写代码时可以省略this。I但是,当实例成员变量的名字和局部变量的名字相同时,成员变量前面的“this.”就不可以省略。例子10中,People类的构造方法中使用了this。例子10this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。4.8包

4.8.1包语句4.8.2有包名的类的存储目录4.8.3运行有包名的主类包是Java语言中有效地管理类的一个机制。不同Java源文件中可能出现名字相同的类,如果想区分这些类,就需要使用包名。包名的目的是有效的区分名字相同的类,不同Java源文件中两个类名字相同时,它们可以通过隶属不同的包来相互区分。package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包,即为该源文件中声明的类指定包名。package语句的一般格式为:

package包名;如果源程序中省略了package语句,源文件中所定义命名的类被隐含地认为是无名包的一部分,只要这些类的字节码被存放在相同的目录中,那么它们就属于同一个包,但没有包名。包名可以是一个合法的标识符,也可以是若干个标识符加“.”分割而成,如:packagesunrise;package;一个源文件至多写一条包语句4.8包

4.8.1包语句4.8.2有包名的类的存储目录4.8.3运行有包名的主类假设程序如下使用了包语句:packagetom.jiafei;那么类的字节码文件需要保存在某个形如

…\tom\jiafei的路径中,比如,保存在:

C:\1000\tom\jiafei路径中。为了让类的字节码文件保存在符合规定的路径中,一个简单的办法就是把类的源文件,保存到含有包名对应的路径中,比如,把源文件保存到:C:\1000\tom\jiafei路径中。然后在命令行进入包名对应的路径tom\jiafei的父目录(例如C:\1000),如下编译源文件:C:\1000>javactom\jiafei\源文件那么得到的字节码文件默认地保存在了当前路径中。

对于有包名的源文件,一个好的编程习惯就是进入包名对应的路径的父目录,编译源文件。4.8包

4.8.1包语句4.8.2有包名的类的存储目录4.8.3运行有包名的主类如果主类的包名是tom.jiafei,那么主类的字节码必须存放在某个…\tom\jiefei路径中,那么必须到tom\jiafei的父目录(包名对应的路径的父目录)中去运行主类。假设tom\jiafei的父目录是C:\1000,那么,在命令行如下格式来运行:C:\1000>javatom.jiafei.主类名即运行时,必须写主类的全名。因为使用了包名,主类的全名是:包名.主类名(就好比大连的全名是:中国.辽宁.大连)。

例子11中的Example4_11.java使用包语句比如,可以保存例子11的源文件到c:\ch4\tom\jiafei中,分别编译两个源文件:C:\ch4>

javactom\jiafei\Student.javaC:\ch4>

javactom\jiafei\Example4_1.java也可以用统配符*代替全部源文件的名字,编译全部的源文件:C:\ch4>javactom\jiafei\*.java到tom\jiafei的父目录ch4中运行:C:\ch4>javatom.jiafei.Example4_11例子11Student.javaExample4_11.java4.9import语句4.9.1引入类库中的类4.9.2引入自定义包中的类4.9.3使用无包名的类一个类可能需要另一个类声明的对象作为自己的成员或方法中的局部变量,如果这两个类在同一个包中,当然没有问题。但是,如果一个类想要使用的那个类和它不在一个包中,就需要学习import语句。如果要引入一个包中的全部类,则可以用统配符号:星号(*)来代替,如:

importjava.util.*;表示引入java.util包中所有的类,而importjava.until.Date;只是引入java.until包中的Date类。

在一个Java源程序中可以有多个import语句,它们必须写在package语句(假如有package语句的话)和源文件中类的定义之间。Java类库大约为我们提供了大约130多个包(在后续的章节我们将需要一些重要包中的类)。想使用java.util中的Date类创建对象来显示本地的时间,那么就可以使用import语句引入java.util中的Date类。例子12中的Example4_12.java使用了import语句,运行效果如图。例子124.9import语句4.9.1引入类库中的类4.9.2引入自定义包中的类4.9.3使用无包名的类用户程序也可以使用import语句引入非类库中有包名的类,如:importtom.jiafei.*;1.有包名的源文件包名路径左对齐。所谓包名路径左对齐,就是让源文件中的包名所对应的路径和它要用import语句引入的非类库中的类的包名所对应的路径的父目录相同。2.无包名的源文件包名路径和源文件左对齐。假如用户的源文件没有包名,该源文件想引入的非类库中包名是的类。那么只需将源文件中import语句要引入的非类库中的类的包名路径的父目录和用户的源文件所在的目录相同,即包名路径和源文件左对齐。4.9import语句4.9.1引入类库中的类4.9.2引入自定义包中的类4.9.3使用无包名的类例子13中的Triangle.java含有一个包名是的Triangle类,该类可以创建“三角形”对象。一个需要三角形的用户,可以使用import语句引入Triangle类。比如,将Triangle.java源文件保存到C:\ch4\sohu\com中,并编译通过:C:\ch4>javacsohu\com\Triangle.java例子14中的Example4_14.java中的主类(包名是sun.hello.moon)使用import语句引如包中的Triangle类。Example4_14.java保存在C:\ch4\sun\hello\moon中(因为ch4下有tom\jiafei,即左对齐)例子13例子14注有包名的源文件,无论如何也无法使用无包名的类。4.9import语句4.9.1引入类库中的类4.9.2引入自定义包中的类4.9.3使用无包名的类如果一个无包名类想使用无名包中的类,只要将这个无包名的类的字节麻和当前类保存在同一目录中即可。例子15涉及到两个源文件,A.java和Example4_11.java。A.java省略了包语句,Example4_11.java和A.java存放在同一目录。首先编译A.java,然后编译、运行Example4_15.java例子15A.javaExample4_15.java4.10访问权限

4.10.1私有变量和私有方法4.10.2共有变量和共有方法4.10.3友好变量和友好方法4.10.4受保护的成员变量和方法4.10.5public类与友好类用一个类创建了一个对象之后,该对象可以通过“.”运算符操作自己的变量、使用类中的方法,但对象操作自己的变量和使用类中的方法是有一定限制的。所谓访问权限是指对象是否可以通过“.”运算符操作自己的变量或通过“.”运算符使用类中的方法。访问限制修饰符有private、protected和public,都是Java的关键字,用来修饰成员变量或方法。注:一个类中的实例方法总是可以操作该类中的实例变量和类变量;类方法总是可以操作该类中的类变量,与访问限制符没有关系。4.10访问权限

4.10.1私有变量和私有方法4.10.2共有变量和共有方法4.10.3友好变量和友好方法4.10.4受保护的成员变量和方法4.10.5public类与友好类用关键字private修饰的成员变量和方法称为私有变量和私有方法.对于类的私有成员变量或方法,只有在本类中创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有方法。例子16当我们用某个类在另外一个类中创建对象后,如果不希该对象直接访问自己的变量,即通过“.”运算符来操作自己的成员变量,就应当将该成员变量访问权限设置为private。类应当提供操作数据的方法,这些方法可以经过精心的设计,使得对数据的操作更加合理,如下面的例子17所示意。例子17Student.javaExample4_17.java4.10访问权限

4.10.1私有变量和私有方法4.10.2共有变量和共有方法4.10.3友好变量和友好方法4.10.4受保护的成员变量和方法4.10.5public类与友好类用public修饰的成员变量和方法被称为共有变量和共有方法.当前类在任何一个类中创建了一个对象后,该对象能访问自己的public变量和public方法。不用private、public、protected修饰符的成员变量和方法被称为友好变量和友好方法。当前类在另外一个类中创建对象后,如果这个类与当前类在同一个包中,那么该对象能访问自己的友好变量和友好方法。用protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法当前类在另外一个类中创建对象后,如果这个类与当前类在同一个包中,那么该对象能访问自己的protected变量和protected方法。在后面讲述子类时,将讲述“受保护(protected)”和“友好”之间的区别。4.10访问权限

4.10.1私有变量和私有方法4.10.2共有变量和共有方法4.10.3友好变量和友好方法4.10.4受保护的成员变量和方法4.10.5public类与友好类类声明时,如果在关键字class前面加上public关键字,就称这样的类是一个public类,如:publicclassA{…}可以在任何另外一个类中,使用public类创建对象。如果一个类不加public修饰,如:classA{…}这样的类被称作友好类,那么另外一个类中使用友好类创建对象时,要保证它们是在同一包中。注:①不能用protected和private修饰类(不包括后面讲的内部类Innerclass)。②访问限制修饰符按访问权限从高到低的排列顺序是:public、protected、友好的、private。4.11基本类型的类包装

4.11.1Double和Float类4.11.2Byte、Short、Integer、Long类4.11.3Character类4.11.4自动装箱与拆箱提供了基本数据类型相关的类,这些类在java.lang包中,分别是:Byte、Integer、Short、Long、Float、Double和Character类.可以使用Double类的构造方法:

Double(doublenum)创建一个Double类型的对象;使用Float类的构造方法:Float(floatnum)创建一个Float类型的对象。Double对象调用doubleValue()方法可以返回该对象含有的double型数据;Float对象调用floatValue()方法可以返回该对象含有的float型数据.下述构造方法可以创建Byte、Integer、Short和Long类型的对象:Byte(bytenum)Short(shortnum)Integer(intnum)Long(longnum)

Byte、Short、Integer和Long对象分别调用byteValue()、shortValue()、intValue()和longValue()方法返回对象含有的基本型数据。使用Character类的构造方法:Character(charc)创建一个Character类型的对象。Character对象调用charValue()方法可以返回该对象含有的char型数据例子18中,将一个字符数组中的小写字母变成大写字母,并将大写字母变成小写字母例子184.11基本类型的类包装

4.11.1Double和Float类4.11.2Byte、Short、Integer、Long类4.11.3Character类4.11.4自动装箱与拆箱自动装箱就是允许把一个基本数据类型的值直接赋值给基本数据类型相对应的类的实例,例如:

Integernumber=100;或

intm=100;Integernumber=m;上述语句的装箱过程是:Integernumber=newInteger(m);自动拆箱就是允许把基本数据类型的类的实例当作相应的基本数据类型来使用,例如:number是一个Integer对象,那么允许:

intx=number+number;上述语句的拆箱过程是:intx=Value()+Value();例子19演示了自动装箱和拆箱。例子194.12反编译和文档生成器

4.12.1javap反编译4.12.2javadoc制作文档javap.exe可以将字节码反编译为源码,查看源码类中的public方法名字和public成员变量的名字,例如:

javapjava.util.Date将列出Date中的public方法和public成员变量javadoc.exe可以制做源文件的html格式文档。例如:

javadocExample.java将例子20中的Employee.java保存在c:\c

温馨提示

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

最新文档

评论

0/150

提交评论