java类的数据成员第3章.ppt

上传人:max****ui 文档编号:11496868 上传时间:2020-04-25 格式:PPT 页数:194 大小:2.90MB
返回 下载 相关 举报
java类的数据成员第3章.ppt_第1页
第1页 / 共194页
java类的数据成员第3章.ppt_第2页
第2页 / 共194页
java类的数据成员第3章.ppt_第3页
第3页 / 共194页
点击查看更多>>
资源描述
第3章类的数据成员,3.1类的数据成员概述3.2简单数据类型的使用方法3.3简单数据类型的包装类3.4字符串数据类型的使用方法3.5数组数据类型的使用方法3.6J2SDK帮助文档的使用3.7Java标识符命名规范,第3章类的数据成员学习目标掌握标识符与关键字的概念;掌握简单数据类型byte、short、int、long、float、double、char和boolean等的使用方法;掌握简单数据类型对应的包装类的使用方法;掌握String类型及其常用的操作方法;掌握数组的声明与实例化,理解数组的一些高级操作;学会J2SDK帮助文档的使用方法;理解软件开发中Java语言各种标识符的命名规则。,类是一种由用户定义的新型数据类型,与整型或实型数据相比,类是一种复杂的数据类型,所以也称为构造类型。一个类由表示对象状态的属性和对属性数据进行操作的方法组成,即类是数据成员与方法成员的封装体。本章介绍类的数据成员。,3.1类的数据成员概述数据成员是一个类的核心内容。设计类的主要内容是设计数据成员,同类的对象之所以互不相同,是由于它们有不同的属性值(即数据)。,3.1.1数据成员的定义格式类的数据成员也叫属性成员,或叫字段(field)。在设计类时,定义数据成员的简单格式为数据成员类型数据成员名;例如intsum;intmath,english;/注意在程序设计实践中,一般在一行只定义一个属性,数据成员还可在定义时进行赋值初始化,例如:intsum=0;注意:如果一个数据成员在定义时进行了赋值初始化,在执行构造函数时对该数据成员也进行了初始化,则该数据成员的值为执行构造函数时所赋的值。,3.1.2数据成员的修饰符数据成员的类型前面还可以加修饰符,数据成员的修饰符可分为存取性修饰符和存在性修饰符两类。1)存取性修饰符:有publicprivateprotectedpackage2)存在性修饰符:有staticfinal,final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final不能用于修饰构造方法。注意:被final修饰的数据成员在定义时,一定要同时赋初值,不能在程序的其他地方进行修改。否则会出现编译错误。如已有这样的声明“finalfloatPI;”,然后在程序的其他地方有赋值语句PI=3.12,这是不允许的。finalfloatPI=3.14f;(但可以初始化对象的时候再赋初值),publicclassTest3finalfloatPI;/PI空白/PI=3.14f;Test3()PI=3.14f;publicstaticvoidmain(Stringargs)Test3t=newTest3();System.out.println(t.PI);,final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。一旦给final变量赋初值,值就不能再改变。final变量定义的时候,可以先声明,而不给初值,这种变量也称为final空白,但是无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。,classTestprivatefinalStringS=final实例变量S;privatefinalintA=100;publicfinalintB=90;publicstaticfinalintC=80;/可理解为“全局常量”,一旦给值就不可修改,并且通过类名可以访问。privatestaticfinalintD=70;publicfinalintE;/final空白,必须在初始化对象的时候赋初值publicTest(intx)E=x;,publicstaticvoidmain(Stringargs)Testt=newTest(2);/t.B=91;/出错,final变量的值一旦给定就无法改变/t.C=81;/出错,final变量的值一旦给定就无法改变System.out.println(t.S);System.out.println(t.A);System.out.println(t.B);System.out.println(Test3.C);System.out.println(Test3.D);/System.out.println(Test3.E);/出错,因为E为final空白,依据不同对象值有所不同.且E不是静态的,不能用类名直接访问。System.out.println(t.E);Testt1=newTest(3);System.out.println(t1.E);/final空白变量E依据对象的不同而不同t1.test1();,publicvoidtest1()finalinta;/final空白,在需要的时候才赋值finalintb=4;/局部常量-final用于局部变量的情形a=3;System.out.println(a);System.out.println(b);,3.2简单数据类型的使用方法数据是一个类的核心,类中定义的数据要有确定的数据类型。数据类型可以是简单类型(如整型、实型等),也可以是复杂类型(如类类型、字符串、数组等)。本节介绍简单数据类型。,3.2.1简单数据类型简单数据类型在Java语言中也叫原始数据类型或基本数据类型。Java语言中定义了四类(八种)基本数据类型:整型:byte、short、int和long浮点型:double和float字符型:char逻辑型:boolean,每一种数据类型有该类型的常量与该类型的变量。每种数据类型只能进行一些确定的运算,如逻辑型只进行逻辑运算。注意:所有Java编程语言中的整数类型都是带符号的数。1.整型整型数据类型分为四种:byte、short、int和long。这些不同整型数据类型的意义在于它们所占用的内存空间大小不同,这也表明它们所能表示的数值范围不同。每种整型数据类型的取值范围如表3-1所示。,表3-1整数类型数据,整数类型的数据可以使用十进制、八进制或十六进制表示,具体表示方法如下:十进制:用非0开头的数值表示,如100和-50等;八进制:用0开头的数值表示,如017等;十六进制:用0 x或0X开头的数值表示,数字1015分别用字母“A、B、C、D、E和F表示”(也可以使用小写字母af),如0 x41、0Xabc等。,问题:017=()100123=()100 x41=()100Xff=()10,注意1:Java缺省的整数常量类型为int类型。如果要表示long类型整数常量,则需要给整数加后缀L或l,表示为长整数。例如123456L,如果直接写为123456,则系统会认为是int类型数据。注意2:与其他语言(如C语言)不同,Java语言每种整数类型的长度(即占用的字节数)在任何系统中都是一样的。这也是为了保证Java语言的跨平台性。,2.实型实数数据类型是带小数部分的数据类型,也叫浮点型。Java语言中包括两种浮点型数据:float:单精度实数,长度为4字节(即32位);double:双精度实数,长度为8字节(即64位)。实型数据还可以用科学计数法表示,如123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数。如12.3e3,123E2,1.23e4,e-5,1.2E-3.5,注意1:Java缺省的浮点型常数为double型。如果要表示float型常量,则要给数据加后缀F或f。例如12.34f,若直接写为12.34,则系统认为是双精度实数。在程序中,如果写floatf=3.14;将产生编译错误。注意2:如果要表示double型,则要给数据加后缀D或d(由于系统默认的浮点型常数为double型,因此也可以不加后缀D或d),如-0.23453D,1.4E+30d。,3.逻辑型逻辑值有两种状态,即人们常说的“开”和“关”、“成立”和“不成立”、“是”和“否”等。在Java语言中,这样的值用boolean(布尔)类型来表示。其有两个值,即true和false,分别表示“真”和“假”。布尔型变量在程序中的使用方法举例说明如下:booleanaBooleanVar;/说明aBooleanVar为boolean型变量booleanisStudent=false;/说明变量isStudent是boolean型,并赋以初值false注意:Java语言中不可将布尔类型看成整型值(这与C和C+语言不同)。,4.字符型字符型是用单引号括起来的一个字符,程序中使用char类型表示。占两个字节。正因为如此,字符型的数据在书写时,可用以u开头的4位十六进制数表示,范围从u0000到uFFFF。,具体一个字符型的量,在程序中可以用下面几种方式表示:(1)用Unicode码表示。如字符型变量letter的值为A,则可以写为charletter=u0041;(2)用ASCII码表示。对于字符型的量,由于大多数计算机系统使用ASCII码表示,而Unicode码中包含了ASCII码,因此在Java程序中,为了简便,大多数程序员仍使用ASCII字符的书写习惯,如字符型变量letter的值为A,则可以写为charletter=A;它与上面用Unicode码书写的语句是等价的。,(3)用整数表示字符。因为字符型的量在计算机内本质上保存的是一个两个字节的整数,所以字符型变量的取值也可以使用整型常数(注意不能使用整型的变量),如字符型变量letter的值为A,则可以写为charch=65;但要注意,下面的程序片段是错误的:inta=65;charch=a;,如要正确编译,只有使用强制类型转换:inta=65;charch=(char)a;注意:在将一个整数赋给一个字符变量时,整数的取值范围要在065535之间(即两个字节可以表示的无符号数据范围)。如果超出这个范围,将产生编译错误。,(4)用转义字符。Java语言也允许用转义字符表示一些特殊的字符。之所以叫转义字符,是因为以反斜杠()开头,将其后的字符转变为另外的含义。如用字符变量Tab表示制表符,则可以写为chartab=t;/而不是字符t表3-2是几个常用的转义字符。,表3-2常用的转义字符,5.数据类型转换在同一表达式中,有不同的数据类型要参与运算时,要进行数据类型转换。(1)自动类型转换。整型、实型、字符型数据可以混合运算,例如:floata=65+a+23.23f;运算过程中,不同类型的数据会自动转换为同一种数据类型(如上面语句中的数都将转换为float类型),然后进行运算。自动转换的数据类型要兼容,并且转换后的数据类型比转换前的数据类型表示的数值范围大。自动转换按低级类型数据(指数据范围小、精度低)转换成高级类型数据(指数据范围大、精度高)的规则进行。转换规则如表3-3所示。,表3-3转换规则,注意1:boolean类型量不能与其他类型量之间相互转换。注意2:byte和short类型的数据计算结果为int型。(2)强制类型转换。在两种情况下,需要使用强制类型转换:高级别数据类型要转换成低级别数据类型。为了提高运算结果的精度。如有程序段:,inta=15;intb=7;floatc=a/b;/运算结果为c=2.0floatd=(float)a/b;/运算结果为c=2.142857强制类型转换的一般格式为:,(类型名)表达式如有程序段:inti=356;byteb;b=(byte)i;/强制转换后丢失一部分数据,使得b的值为100注意:使用强制类型转换可能会导致数值溢出或数据精度的下降,应尽量避免使用。,3.2.2数据的运算符数据的运算符表示对数据要进行的运算方式。运算符按其要求的操作数个数分为:一元运算符:参加运算的操作数有一个;二元运算符:参加运算的操作数有两个;三元运算符:参加运算的操作数有三个。运算符按其功能分为七类:算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符、赋值运算符以及一些其他的运算符。,1.算术运算符算术运算符用于对整型数和实型数进行运算,按其要求的操作数的个数分为一元运算符和二元运算符两类。(1)一元运算符(+、-)。一元运算符可以位于操作数的前面,如+x或-x,也可以位于操作数的后面,如x+、x-等。无论一元运算符位于操作数的前面或后面,操作数完成运算后,都把结果赋给操作数变量。注意:+x或x+整体参加表达式运算时,表达式的值是不一样的,这与C语言类似。,(2)二元运算符。二元运算符有+、-、*、/和%,如两个操作数都是整型,则结果为整型,否则为实型。注意1:%运算符表示求整除的余数,它要求两边的操作数均为整型,结果也为整型。注意2:对于/运算,如果两个操作数是整数时,则结果也为整数,如17/5=3,5/12=0。如果操作数中有一个是实数,则运算结果为实数。,2.关系运算符Java语言的关系运算符共有七种:=、!=、=和instanceof。关系运算符用于关系表达式中,一个关系表达式的结果类型为布尔型,即关系式成立为true,不成立为false。对象运算符instanceof用来判断一个对象是否属于某种类类型,如HelloinstanceofString结果为true,表示Hello是一个字符串类型的量。注意1:除了整型数和实型数可以混合出现在关系运算符两边外,在一个关系运算符两边的数据类型应保持一致。,注意2:因为一个实数在内存中只能用近似值来存储,所以应该避免将两个实数进行“=”比较。如下面的判断语句:if(23.12121f=23.121211f)System.out.print(23.12121=23.121211);读者可上机测试一下是否会输出“23.12121=23.121211”。,3.逻辑运算符逻辑运算符有六个,它们是:!(非)、intMyInteger=-1;MyInterger=MyByte;MyByte=(byte)MyInteger;,5.条件运算符条件运算符是“?:”,它要求有三个操作数,其格式如下:?:第一个操作数必须是布尔表达式,其他两个操作数可以是数值型或布尔型表达式。条件运算符的含义是:当的值为真时,结果为的值,否则为的值。例如:,inta=12;intb=34;intmax=(ab)?a:b;则程序运行后,max变量中存放a和b中较大的一个数。,6.位运算符位运算是对操作数以二进制位为单位进行的运算,位运算的操作数和结果都是整型量。位运算有七个,它们是:、/11000011c=3,7.其他运算符()和运算符:括号运算符()的优先级是所有运算符中最高的,它可以改变表达式运算的先后顺序。在有些情况下,它可以表示方法或函数的调用。括号运算符是数组运算符(见3.5节)。运算符:用于访问对象的成员属性或成员方法。new运算符:用于创建一个新的对象。,8.运算符的优先级运算符的优先级由高到低的规律是:.()单目运算算术运算关系运算逻辑运算?:=详细情况见表3-4。,表3-4运算符的优先级别,3.2.3【案例3-1】解方程1.案例描述设计表示一元一次方程(ax+b=0)的类,并能根据a的系数情况求解方程。2.案例效果案例程序的执行效果如图3-1所示。图中从第2行开始,输出了4个不同方程及其解的情况。,图3-1案例3-1的显示效果,3.技术分析为了求解一元一次方程ax+b=0,要定义一个表示一元一次方程的类,其数据是a和b,可以进行的操作是判断方程是否有解,如果有解,则求方程的解,并输出方程式和解的情况。根据以上分析,设计的表示一元一次方程的类应该有两个私有数据成员a和b(对于私有数据,一般应有设置器setXXX和读取器getXXX),有判断方程是否有解、求解和输出方程与解的方法成员。因此,该类的设计要点是:,class方程私有数据a;私有数据b;构造方法a的设置器a的读取器b的设置器b的读取器判断方程是否有解的方法求方程解的方法输出方程与解的方法,4.程序解析下面是根据上面的分析设计的一元一次方程类Equation,程序中定义的TestEquation类对Equation类进行了测试。程序如下:01/*02/案例:3.1程序名:TestEquation.java03/功能:表示一元一次方程ax+b=0类04/*05,06/一元一次方程类07classEquation08/方程的两个系数定义为私有成员09privatefloata;10privatefloatb;1112/无参数的构造方法13publicEquation()1415/有参数的构造方法16publicEquation(floata,floatb)17this.a=a;18this.b=b;19,2021/系数a的设置器22publicvoidsetA(floata)23this.a=a;242526/系数a的获取器27publicfloatgetA()28returna;2930,31/系数b的设置器32publicvoidsetB(floatb)33this.b=b;343536/系数b的获取器37publicfloatgetB()38returnb;3940,41/判断方程是否有根的私有方法42privatebooleanhasRoot()43returna!=0;444546/求方程根的私有方法47privatefloatroot()48return(-b)/a;4950,51/输出方程式和根的公有方法52publicvoidshowEquation()53if(hasRoot()54if(b0)55System.out.println(n方程式是:+a+x+b+“=0,t其解为x=+root();56elseif(b0)57System.out.println(n方程式是:+a+x-+Math.abs(b)+=0,t其解为x=+root();58else59System.out.println(“n方程式是:”+a+“x=0,tt其解为x=+0);60,61else62System.out.println(“n因为系数a=0,tt方程式无效!);63646566classTestEquation67publicstaticvoidmain(Stringargs)68/建立一个方程对象e1,其方程式为1.4x+2.8=069Equatione1=newEquation(1.4f,2.8f);70/调用showEquation方法,输出e1对象表示的一元一次方程式和根,71e1.showEquation();7273/建立一个方程对象e2,其方程的系数a和b的初始值都为074Equatione2=newEquation();75/将系数b设置为4,即对象e2表示的方程式为0 x-4=0,是一个无效的方程76e2.setB(-4);77/调用showEquation方法,输出e2对象表示的一元一次方程式和根78e2.showEquation();79,80/改变e2对象的系数a,将其设置为e1对象的系数b,即对象e2表示的方程式变为2.8x-4=081e2.setA(e1.getB();82e2.showEquation();8384/改变e2对象的系数b,将其设置为0,即对象e2表示的方程式变为2.8x=085e2.setB(0);86e2.showEquation();8788,该程序有着比较详细的注释,读者参考注释,应该很容易读懂程序。程序中使用了实型数据和布尔型数据,有简单的关系运算与算术运算。关于this关键词的含义在下面有详细的说明。在程序的55行、57行、59行和62行等多处使用了转义符n和t,转义符n在程序中起到换行的作用,转义符t在程序中起到输出制表符的作用(类似于按Tab键的功能)。因此,程序在输出一个方程后即换到下一行,并能将方程的解对齐输出,如图3-1所示。,第57行使用了一个对数据求绝对值的数学函数Math.abs。类Math中定义的方法都是静态的。最后要说明的是,在面向对象程序设计中,如果属性和方法是在类的内部使用,则应该说明为private的,以防止外部访问,避免因对程序的非法操作而使程序出错。如42行判断方程是否有根的方法privatebooleanhasRoot()和47行求方程根的方法privatefloatroot(),都因只在类Equation的内部使用,所以定义为私有方法。而类的构造方法、设置器、获取器和输出方程与解的方法,由于在类的外部要使用,因而被定义为公共的(public)。在面向对象程序设计中,对外的接口全部应用public修饰,即定义为公共的。,3.2.4【相关知识】this关键字的功能在案例3-1的程序中的多个方法中使用了关键词this,如1619行的代码中,给方程的系数a和b提供初值的构造方法:16publicEquation(floata,floatb)17this.a=a;18this.b=b;19,这里的参数floata和floatb是构造方法Equation(floata,floatb)的局部变量,其有效范围(也叫作用域)是方法Equation(floata,floatb)的内部,因此,在Equation类中定义的方程系数a和b(在案例3-1的第09行和第10行)在方法Equation(floata,floatb)中被隐藏了。也就是说,在该方法中直接用a和b,则表示使用的是方法参数中定义的局部变量a和b。当一个对象在调用Equation(floata,floatb)方法时,如果要使用属于该对象的属性a和b(也就是在类中定义的a和b),则要在属性a和b前面加一个表示对象中a和b的标记,这个标记就是this关键字。,在Java语言中,this代表当前对象,主要用来以“this.成员”的方式引用当前对象的成员。如在案例程序3-1的85行,有一个方法调用“e2.setB(0);”,因为是通过e2对象去调用方法setB(),所以表明当前对象是e2,即这里的this代表e2对象。被调用的方法setB()的程序段如下:32publicvoidsetB(floatb)33this.b=b;34,则33行的this就代表了对象e2,因此“this.b=b;”就表示将给e2对象的系数b赋一个值,这个值就是由实参提供的局部变量b的值。其实,在类中定义的方法,如果使用了属性字段,则在属性字段的前面都有一个默认的this,如程序的第28行有一条“returna;”语句,本质为“returnthis.a;”,表示返回当前对象的a值,只是由于在27行定义的方法“publicfloatgetA()”中,没有使用局部变量a,直接写a不会造成混乱,所以省略了a前面的this。当然,也可以在程序中避免使用this,如该类的构造方法也可以写成如下的形式:,16publicEquation(floatp,floatq)17a=p;18b=q;19这种形式很好理解,但它不符合面向对象的编程特点。所以,建议还是使用案例3-1中定义的方式。,this还有一种用法,就是调用该类的其他构造方法,其格式是:this(参数);如果没有参数,则调用无参的构造方法。看下面的示例程序:01classPoint02intx;03inty;0405Point(intx),06this.x=x;070809Point(intx,inty)10this(x);11this.y=y;1213程序的第10行使用this调用了该类的带一个参数的构造方法“Point(intx)”。,注意1:如果在一个类的构造方法中,使用this调用了该类的其他构造方法,则this调用只能放在程序的第一行。如果将上述示例程序的第10行和第11行进行交换,则程序将发生编译错误。注意2:一个类的静态方法体中不能使用this关键词。,3.3简单数据类型的包装类在面向对象程序设计中“一切皆对象”,而前一节介绍的简单数据类型就不是以对象的形式出现的,这从本质上来说不符合面向对象程序设计的思想。但是,简单数据类型易于理解,可以简化程序的书写,所以简单数据类型在Java语言中有其存在的合理性。尽管如此,有时在程序中还是要使用以对象形式表示的简单数据类型(如一个方法只能接收以对象为参数的调用),Java语言已经考虑到了这个问题,对每一种简单数据类型都提供了一个与之对应的类,这就是所谓简单数据类型的包装类,本节将介绍这些包装类的知识。,3.3.1包装类的使用在Java语言类库中,为每一种简单数据类型提供了一个与之对应的类。从本质上来说,这些类就是包装了一个简单类型的数据,并提供了一些对数据进行操作(主要是类型转换)的方法。1.简单数值类型的包装类简单数值类型有double、float、byte、int、long和short共6种,它们对应的包装类如表3-5所示。,表3-5简单数值类型的包装类,基本数据类型的包装类还提供了很多非常有用的方法:(1)将一个包装类对象转换为任意一种简单数据。Byte、Double、Float、Integer、Long和Short类都能使用表3-6所示的方法,将其包装的数值转化为byte、double、float、int、long和short等简单数据类型中的任何一种。,表3-6包装类转换为简单数据的方法,如将整数2包装为一个整型类对象:IntegerI=newInteger(2);使用下面的语句可将其赋给一个实型变量:floatf=I.floatValue();/f=2.0(2)使用toString()方法可以将一个包装类中的数据转化为字符串。如将实数232.34包装为一个实型类对象:FloatF=newFloat(232.34f);使用下面的语句可将其赋给一个字符串变量:Stringstr=F.toString();,(3)可以将一个由数字组成的字符串转化为简单类型数据。如将字符串232转化为一个整数:inti=Integer.parseInt(232);由于这些转换方法都是静态方法(即类方法,以static修饰),因此在程序中可以通过类名直接使用,例如:floatf=Float.parseFloat(232.12);doubled=Double.parseDouble(267832.1772);shorts=Short.parseShort(232);longl=Long.parseLong(24532);byteb=Byte.parseByte(24);,(4)将一个十进制整数转化为其他数制表示的字符串。Integer类中定义了将一个十进制整数转化为其他数制表示的字符串的方法:toBinaryString(inti):以二进制无符号整数形式返回一个整数参数的字符串表示形式;toHexString(inti):以十六进制无符号整数形式返回一个整数参数的字符串表示形式;toOctalString(inti):以八进制无符号整数形式返回一个整数参数的字符串表示形式。,此外,Byte、Double、Float、Integer、Long和Short类都提供了其所对应的简单数据类型所能表示的最大值和最小值的字段(即类的数据成员),字段名分别为MAX_VALUE和MIN_VALUE,这些字段均为静态的(以static修饰)。如下面的语句可分别输出float型数据和short型数据的最大值和最小值:System.out.println(Float.MAX_VALUE);System.out.println(Float.MIN_VALUE);System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE);,2.布尔类型的包装类BooleanBoolean类将基本类型为boolean的值包装在一个对象中。一个Boolean类型的对象只包含一个类型为boolean的字段。此外,此类还为boolean和String的相互转换提供了许多方法,如:parseBoolean(Strings):将字符串参数分析为boolean值;toString():返回表示该布尔值的String对象。,3.字符类型的包装类CharacterCharacter类在对象中包装了一个基本类型为char的值。此外,该类提供了一些方法,以确定字符的类别(小写字母、数字等),并提供了将字母由大写转换成小写或由小写转换成大写的方法。常用的方法有:charValue():返回此Character对象包装的字符值;isLowerCase(charch):确定指定字符是否为小写字母;isUpperCase(charch):确定指定字符是否为大写字母;isDigit(charch):指定字符是否为数字;isLetter(charch):指定字符是否为字母。,举例如下:System.out.println(Character.isLowerCase(A);/输出falseSystem.out.println(Character.isUpperCase(A);/输出trueSystem.out.println(Character.isDigit(A);/输出falseSystem.out.println(Character.isLetter(A);/输出true,3.3.2创建包装类对象创建包装类对象非常简单,归纳起来有如下几种方法:(1)使用每个包装类的构造方法直接创建。例如:Booleanb3=newBoolean(true);Characterc3=newCharacter(a);Integeri3=newInteger(2);,(2)Java的每个包装类都提供了一个叫valueOf()的静态方法,使用该静态方法可以很方便地产生包装类的对象。例如:Booleanb4=Boolean.valueOf(true);Characterc4=Character.valueOf(a);(3)使用JDK5.0的“自动打包”功能创建。在JDK5.0以后的版本中,为了简化包装类的使用,提供了从基本数据类型到包装类对象的自动转化功能,这就是所谓的“自动打包”。例如:Integeri4=3;Booleanb4=true;,同时,也提供了从包装对象到基本数据类型的自动转化功能,这就是所谓的“自动解包”。例如:Floatf4=3.34f;System.out.println(f4*34);按照Java语言的语法,一个对象f4是不能与一个整数34相乘的,但“自动解包”功能可以将对象f4中包装的实型数3.34取出,然后完成与另外一个数相乘的运算。,3.3.3【案例3-2】数制转换器1.案例描述编写一个将十进制整数转换为其他进制整数的类。程序执行时,输入一个整数后,将其分别转换为二进制、八进制和十六进制后输出。2.案例效果案例程序执行的效果如图3-2所示(注意,窗口中第1行所示的内容)。在执行程序时,从命令行输入的十进制数为99,第2次执行程序时输入的十进制数为78446。,图3-2案例3-2的执行结果,3.技术分析编写该程序时,可以自己定义一个包装整数的类,在类中定义一个私有成员,存放将要转换的整数,设计一个用于将十进制整数转换为二进制、八进制和十六进制数的方法。4.程序解析下面是案例3-2的程序代码。,01/*02/案例:3.2程序名:IntWrap.java03/功能:将一个整数以不同的数制输出04/*0506publicclassIntWrap07privateinti;0809publicIntWrap()10,11publicIntWrap(inti)12this.i=i;131415publicStringshowNumber()16returnn二进制:+Integer.toBinaryString(i)+17n八进制:+Integer.toOctalString(i)+18n十六进制:+Integer.toHexString(i);1920,21publicstaticvoidmain(Stringargs)22/从命令行输入的整数,被自动保存在字符串数组args中,其中第1个字符串保存在args0中23intt=Integer.parseInt(args0);24IntWrapc=newIntWrap(t);25System.out.println(十进制:+t+c.showNumber();2627该程序比较简单,请读者自己分析。,3.3.4【相关知识】包本节介绍了简单数据类型的包装类,这些类是Java语言标准类库中已经定义好的,可以在程序中直接使用。为了方便用户编程,Java语言不但定义了简单数据类型的包装类,还定义了大量的、各种功能的其他类,这些类的组织与管理是Java语言中一个很重要的内容。,1.为什么要使用包首先,不同功能的类可能使用了相同的类名,这样会引起混乱。如一个类的类名为Table,一个编程人员用它表示一个有关表格类的类名,而另一个编程人员用它表示一个有关桌子的类。其次,如果将标准类库中的几千个类放在同一个文件夹中,则不便于用户查找与使用。因此,在Java语言中,标准类库中的类都被放在一个个包中,也就是说每一个类都属于一个特定的包,如简单数据类型的包装类位于java.lang包中。,2.什么是包包(Package)是将一组相关类组织起来的集合。使用包的好处是:(1)使得功能相关的类易于查找和使用(同一包中的类通常是功能相关的)。(2)避免了命名的冲突(不同包中,可以有同名的类)。(3)提供一种访问权限的控制机制(一些访问权限以包为访问范围,在第5章中介绍)。包在操作系统下其实与文件目录相对应,如图3-3所示的简单数据类型的包装类在java.lang包中,则对应操作系统下相应java目录中的lang目录,在lang目录中有Boolean、Byte等类。,图3-3包结构示意图,3.包的创建创建一个包很简单,只需在定义了类的源程序文件的第一行使用package语句即可。其格式为package包名;程序中使用了该语句后,在当前文件夹下就应该创建与该包名对应的目录结构,以存放这个包中定义的所有类编译后的字节代码文件(.class文件)。例如,在下面的Java程序中定义了两个类A和B(类的内容可以为空,这在Java程序中是允许的):,01packagea.b.c;02classA03publicstaticvoidmain(Stringargs)04System.out.println(packageexample.);050607classB程序文件名为A.java时,直接使用下面的编译命令将不能创建与包名对应的目录结构:javacA.java,在这种情况下,需要用户手工创建与包名对应的目录结构,并将编译后的字节代码文件复制到相应的目录中。使用下面带参数“-d”的编译命令:javac-d.A.java在编译通过后,会自动建立与包名对应的目录结构,并将字节代码文件放入包中,如图3-4所示。,图3-4包结构图,使用包时要注意以下问题:(1)编译包的命令为“javac-d要创建包的父目录*.java”(该例中用“.”代替程序文件所在的当前目录)。(2)包名中的层次要用“.”分隔。(3)一个包创建好后,在执行时要带包名。如执行上面程序的命令为:javaa.b.c.A(4)前面所有的案例中都没有创建包(即省略了package语句),则Java系统认为类在默认包中,即当前目录。所以,可以认为任何一个Java类都在某个包中。,(5)package语句只能是一个源程序文件中的第1条语句(程序中的注释和空行除外)。也可以这样说,一个源程序文件中只能有一条package语句。(6)在工程实践中,包名常用公司名或公司的网址,这样可以保证全世界Java程序员设计的类不会发生命名冲突,如com.sun.swing、com.borland.jdbc等。,4.包中类的引用方法在一个程序中若要使用另一个包中的类,则可以使用如下两种方式:(1)长类名方式(longname)。长类名方式要在类名前加上包名称,其格式如下:包名.类名如要使用MyPackage包中的Circle类,则可以使用MyPackage.Circle。(2)短类名方式(shortname)。短类名方式需要在程序的前面加上import语句,其格式如下:import包名.类名;,或使用如下格式:import包名.*;前一种格式只引入了一个指定的类。如在程序的开始部分使用了下面的import语句,则程序中只能使用MyPackage包中的Circle类:importMyPackage.Circle;如果在程序中要使用MyPackage包里的任何一个类,则可以使用如下的语句:importMyPackage.*;注意:java.lang包中的类在程序中会被自动引入,不需要使用import语句。,3.4字符串数据类型的使用方法Java语言中的复杂数据类型,其实就是类类型。前面介绍过,类是一种新型数据类型,在面向对象程序设计中,经常会遇到一个类的成员变量属于某种类类型的情况。前面介绍的案例中多次使用到了String类型,String类型就是一种常用的类类型。,3.4.1字符串的创建与操作1.字符串的概念字符串是由Unicode字符集中的字符组成的字符序列,如“Thisisanapple.”。在Java语言中,字符串不是基本数据类型,而是一个类。由于在程序中经常使用字符串这种类类型,因此在Java语言中已经定义了字符串类型,类名为String,用户可以在程序中直接使用String类型定义一个字符串。,2.创建字符串由于字符串也是对象,因此创建一个String类的实例可以用如下的格式:格式1:StringstrName1=newString(Thisisanapple.);也可以写成如下的简单格式:格式2:StringstrName2=Thisisanapple.;在Java语言中,可以创建一个空字符串:StringstrName3=;,表示strName3字符串的长度为0,即不包含任何字符。字符串变量其实是一个对象类型的变量。任何一个对象类型的变量,都保存着一个内存地址,这个地址指向存放该实例对象数据的内存区,如对于“格式1”中创建字符串的过程,可以用图3-5表示。,图3-5创建字符串对象的过程,执行格式1语句的过程是,声明一个字符串变量strName1,Java虚拟机就为该变量分配一个用于保存指向字符串常量的内存地址(这个内存地址也叫一个引用),如图3-5(a)所示,目前该内存的内容为空。在创建字符串的语句newString(Thisisanapple.)执行后,Java虚拟机先在内存中创建一个字符串常量Thisisanapple.,如图3-5(b)所示(图中假设分配给该字符串常量的内存地址从十六进制数0X1AFB开始),然后让字符串变量strName1指向Thisisanapple.对象,即将地址0X1AFB填入strName1变量中,完成格式1中语句的执行过程。,Thisisanapple.对象在内存中创建后,其值不能被改变,也就是说,其中的任何一个字符不能被改动,即创建的是一个字符串常量。格式2创建字符串变量strName2的过程是,在声明字符串变量strName2后,Java虚拟机就查找内存中有没有一个Thisisanapple.字符串常量,如果有,则让它直接指向该常量。由于格式1中已经创建了Thisisanapple.字符串常量,因此strName2也指向了Thisisanapple.字符串常量,如图3-5(b)中strName2实线所指的内容。,如果在程序中又执行了一条如下的语句:strName2=HelloJava.;则由于在内存中没有HelloJava.字符串常量,因此Java虚拟机就创建一个HelloJava.字符串常量,然后strName2对象会指向这个新的字符串常量,如图3-5(b)虚线所指的内容。由以上分析可知,String类型的对象所指向的字符串内容不能被改变(如Thisisanapple.对象中,不能修改其中任何一个字符),所以,有些资料将String类型的字符串叫常量字符串。但要注意,String类型的对象变量本身可以根据程序执行的情况指向不同的字符串常量,如上面提到的strName2,在不同的时刻指向了不同的字符串常量,前面指向了Thisisanapple.对象,后面指向了HelloJava.对象。,3.字符串常用的方法(1)字符串连接。字符串连接用“+”或concat(Srtingstr)。例如:strName3=strName1+isthenameofan+strName2;strName3=strName3.concat(welcome);(2)求字符串的长度。求字符串的长度用length()。例如:intnumLength=strName2.length();(3)取子串。取一个字符串的子串用substring()。它有两种格式:Stringsubstring(intbeginIndex);,该方法返回一个新字符串,此字符串从指定的beginIndex处开始,一直到字符串结束。Stringsubstring(intbeginIndex,intendIndex);该方法返回一个新字符串,此字符串从指定的beginIndex处开始,一直到endIndex-1处的字符结束,因此,该子字符串的长度为endIndex-beginIndex。例如:Strings1=computer;Strings2=s1.substring(3);/s2为puterStrings3=s1.substring(3,6);/s3为put,(4)字符串比较。比较两个字符串常用如下的两种方法:intcompareTo(StringanotherString);如果参数字符串等于此字符串,则返回0值;如果按字典顺序此字符串小于字符串参数,则返回一个小于0的值;如果按字典顺序此字符串大于字符串参数,则返回一个大于0的值。如果在比较字符串时不考虑字母的大小写,则可以使用如下的方法:booleanequalsIgnoreCase(StringanotherString);,将此String与参数中所给的另一个String进行比较,比较时不考虑字母的大小写。如果两个字符串的长度相等,并且两个字符串中的相应字符都相同(忽略大小写),则认为这两个字符串是相等的。例如:System.out.println(put.equalsIgnoreCase(PUT);/输出的结果为true,(5)判断字符串的前缀和后缀。判断字符串的前缀和后缀是否与参数中指定的字符串相同:booleanstartsWith(Stringprefix);booleanendsWith(Stringsuffix);例如:System.out.println(computer.startsWith(com);/输出true,(6)查找字符串中的一个字符(找到则返回出现的位置,没找到则返回-1)。intindexOf(int)ch);/(int)为强制类型转换intindexOf(int)ch,intfromIndex);/从fromIndex位置开始查找intlastIndexOf(int)ch);/从字符串的结尾开始向前查找intlastIndexOf(int)ch,intfromIndex);/从fromIndex位置开始向前查找,(7)查找字符串中的一个子串(找到返回出现的位置,没找到返回-1)。intindexOf(Stringstr);intindexOf(Stringstr,intfromIndex);/从fromIndex位置开始查找intlastIndexOf(Stringstr);/从字符串的结尾开始向前查找intlastIndexOf(Stringstr,intfromIndex);/从fromIndex位置开始向前查找,(8)其他的一些常用方法。charcharAt(intindex);/取得指定位置的字符Stringreplace(charoldChar,charnewChar);/返回结果为一个用新字符替换旧字符后的字符串,/原字符串对象不变StringtoLowerCase();/返回值为将此字符串中的所有字母都转换为小写/后的字符串,原字符串对象不变StringtoUpperCase();/返回值为将此字符串中的所有字母都转换为大写/后的字符串,原字符串对象不变Stringtrim();/取掉字符串前后的空格并生成新串,在String类中提供了很多非常有用的方法,这里只列举了一些比较常用的,目的是为了说明在Java语言的类库中所定义的大部分类都提供了功能齐全的操作方法。使用时一定要查找JDK帮助文档,关于帮助文档的用法见3.6节。注意1:与C语言和C+语言不同,String不以0作为结束标志。注意2:字符串中第1个字符的序号为0,而不是1。,3.4.2【案例3-3】身份证号码中的秘密1.案例描述一个身份证号码中包含着本人所在地区、出生日期、性别等重要信息。在开发一个软件的过程中,要从身份证号码中取出一个人的生日和性别信息。2.案例效果案例程序的执行效果如图3-6所示。图中第3行输出了一个身份证号码,第4行和第5行分别输出了该身份证号码中所包含的生日和性别信息。,图3-6案例3-3的执行结果,3.技术分析由于身份证号码是由数字组成的字符串,且长度固定,个人的有关信息被包含在这个字符串中。可以使用本节介绍的有关字符串操作的方法取出身份证中包含的有关信息。该程序的主要问题是设计一个身份证号码类,该类中要定义一个私有数据成员(即身份证号码)、一个从身份证号码中取出生日的方法和一个从身份证号码中取出性别的方法。,4.程序解析下面是案例3-3的程序代码。01/*02/案例:3.3程序名:TestIdentityCard.java03/功能:从一个身份证号码中取出个人信息04/*0506/身份证号类,07classIdentityCard08privateStringidentityNumber;0910/无参数的构造方法11publicIdentityCard()1213/有参数的构造方法14publicIdentityCard(StringidentityNumber)15this.identityNumber=identit
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!