Java语言的类型系统.ppt_第1页
Java语言的类型系统.ppt_第2页
Java语言的类型系统.ppt_第3页
Java语言的类型系统.ppt_第4页
Java语言的类型系统.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

LectureNotesonObject-OrientedProgramminginttotal,average;早期也有一些高级语言通过书写形式确定变量的类型,例如:如IAGE是整数类型、XAVERAGE是浮点类型。,变量的4个要素,名字类型地址值,E.Dijkstra:一旦你理解了在程序设计中变量的使用方法,你就理解了程序设计的精华。,变量的左值(Lvalue)与右值(Rvalue)!,Java语言提供了8种基本数据类型又称原始(primitive)数据类型。Integralchar、byte、short、int、longNumericFloatingfloat、doubleLogicalbooleanJava语言的类型系统(TypeSystem)基本类型数组(array)类型引用类型class用户自定义类型(UDT)interface,3.2Java语言的基本数据类型,特殊值:null,有人也将char另分类为Textual,Primitive,Java不把void作为一种类型故不能用(void)作类型转换,布尔类型,常量true、false变量booleanisMarried;/职工是否已婚booleanhasNext=true;/是否有下一数据需处理,表示方法只需占用1位。Java语言并未规定编译器的实现方式。取值范围true,false可用操作可用:赋值运算、关系运算(仅=和!=)、逻辑运算、位运算(位非除外)、条件运算、.不可用:算术运算、位非运算。,字符类型,常量普通字符:A、9、$、_、.转义(escape)字符:n、t、.7、07、007、.xdd、udddd、.变量charchoice;/用户输入的选择结果charchoice=Y;/用户输入的选择结果Java语言采用Unicode编码(双字节)C和C+语言采用ASCII码(单字节),表示方法采用Unicode编码:/。取值范围类型长度取值范围char2字节(16位)u0000uFFFF065,535可用操作可用:赋值运算、算术运算、关系运算、位运算、条件运算、.不可用:逻辑运算。,整数类型,常量8进制数:0开头,其后只允许出现0至7;例如,0123。16进制数:0 x开头,其后允许出现0至9和A至F;例如,0 x53。10进制数:其余开头。例如,83。整数常量只有int和long类型。默认类型是int;指定long类型必须加后缀L或l:83L、0 x53L。变量byteage;/职工的年龄shortlength;/数组的长度intsize=0;/用户输入数据的大小longmax=0;/所求的最大数目,表示方法与取值范围类型长度取值范围byte1字节(8位)-2727-1(有符号二进制补码,下同)-128+127short2字节(16位)-215215-1-32,768+32,767int4字节(32位)-231231-1-2,147,483,648+2,147,483,647long8字节(64位)-263263-19,223,372,036,854,775,8089,223,372,036,854,775,807可用操作可用:赋值运算、算术运算、关系运算、位运算、条件运算、.不可用:逻辑运算。,C+的short、int和long的取值范围依赖于机器字长,浮点类型,常量小数表示法:3.14、3.14F科学记数法:3.14E-5默认类型是double,指定float类型须加后缀F或f:3.14F。整数后缀D或d成为double类型:15D、3d。变量floatbalance;/信用卡帐户的余额doubleweight=0;/工件的重量编程原则:如果double与float之间的空间效率差别不会对整个程序的效率产生明显影响时,应选用double类型。,表示方法1985年通过的IEEE754标准:阶码采用增码、尾数采用原码;数符位于最左位;尾数规格化,从而可多用1位精度。32位(单精度)浮点数:阶码8位、尾数24位。64位(双精度)浮点数:阶码11位、尾数53位。取值范围类型长度取值范围float4字节(32位)约-3.41038+3.41038double8字节(64位)约-1.810308+1.810308可用操作可用:赋值运算、算术运算、关系运算、位运算、条件运算、.不可用:逻辑运算。,Java允许浮点数取模,与数学意义下实数的区别(1)程序中的浮点数是数学意义下实数的一个子集;(2)程序中的浮点数是离散的而数学意义下的实数是连续的。精度与溢出JRE不执行运行期间的溢出检查。没有C+语言的longdouble类型(10字节80位表示格式)。JDK预定义的类:java.math.BigDecimal。,字符串类型,常量ProgramminginJavaHisnameisJohn.n注意:7n李明正在上课!n变量StringauthorName=;/作者姓名Stringmessage=数据已保存!;/提示信息String不是保留字,而是JDK预定义的可重用类。注意A与A的区别!,注意在Unicode编码中,1个汉字的长度仅占1位,变量的初始化,使用未设置初始值的变量会产生一个编译错误例如:intx;inty=x+1;Java语言的设计比C+语言更注重编程的安全性!,基本数据类型的包装类(wrapper),每一基本数据类型都有一个对应的包装类Java比C+语言更接近纯(pure)面向对象程序设计语言!booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble,所谓常量只是指在程序运行过程其值保持不变,但并不意味着在应用环境中或整个软件生存期会一成不变!,3.3符号常量,编译器可保证符号常量只能初始化,而不能对其赋值。适当使用符号常量可提高程序的可扩充性。,使用符号常量的好处,常量只能进行一次赋值不同于C+语言:既可使用初始化表达式,也可使用赋值。通常在声明的同时进行初始化:finaldoublePI=3.14;/圆周率finalintMAX=100;/学生人数的上限禁止对已有初始值的符号常量再次进行赋值!,符号常量的用法,3.4运算符与表达式,表达式是对程序中数据的最基本操作表达式运算符操作数运算符算术运算、关系运算、逻辑运算、位运算、.一元、二元、三元操作数类型值注意Java语言不将void当作一种类型。,表达式的作用,求值结果类型值由运算符以及参与运算的操作数(类型值)决定。当表达式中有多个运算符时,还取决于运算符之间的优先级与结合性质。副作用(sideeffect):在表达式求值过程中改变操作数的值赋值运算是一种表达式:x=y、x+=y、x+、.方法调用是一个表达式:obj.f(x)指派变量:可作为左值使用C+语言允许条件运算“?:”的结果作为左值;Java语言不允许。,赋值运算,赋值运算符x=expr赋值表达式求值结果:x的值、x的类型。副作用:操作数x的值被改变。,复合与简化写法除方便程序员外,还可生成效率更高的代码!x+=expr、x-=expr、x*=expr、x/=expr、x%=exprx=expr、x=exprx/错误的做法Stringstr2=+3.14;/正确的做法Stringstr3=3.14+;/正确的做法引用类型X转换为字符串类型时,会调用对象的toString()方法。根类Object定义了toString()方法,其他类可以重定义该方法。,优先级与结合性质,不明显的优先关系最好通过括号显式表达。.()RtoL+-+-!instanceofnew(T)*/%+-=!=类型转换并不改变age本身的类型,而是创建age的一个副本!,类型转换的情形,赋值转换(AssignmentConversion)表达式类型转换为某一变量的类型。例子:floatf=i;/设i的类型为int方法调用转换(MethodInvocationConversion)实际参数的类型转换为形式参数的类型。例子:doubled=Math.sin(f);/设f为float,sin()只支持double显式类型转换(CastingConversion)通过类型转换运算符显式地转换表达式的类型。例子:inti=(int)12.5f;字符串转换(StringConversion)允许任何类型转换为String类型。例子:System.out.println(i=+i);数值提升(NumericPromotion)提升数值运算符的操作数类型,从而可执行某一操作。例子:f=f*i;/设i的类型为int,f的类型为float,Java语言有5种类型转换的上下文(Context),类型转换的种类,恒等转换(IdentityConversions)是平凡转换:自身到自身,所有类型都支持。用途:提高可读性或借助编译器确保万一(例如,IDL编译器生成的代码)。例子:(只存在显式转换)inti=0;intj=(int)(i*2);,Java语言支持7种类型转换,放宽基本类型转换(WideningPrimitiveConversion)共19条规则,均不会丢失“量”的信息,故允许隐式转换!byteshort、int、long、float或doubleshortint、long、float或doublecharint、long、float或doubleintlong、float或doublelongfloat或doublefloatdouble例子:inti=0;longj=i+1;/隐式转换doublex=(double)(j*2);/显式转换,仍可能会丢失精度!,收窄基本类型转换(NarrowingPrimitiveConversion)共23条规则,均可能丢失量与精度的信息,故不支持隐式转换!bytecharshortbyte或charcharbyte或shortintbyte、short或charlongbyte、short、char或intfloatbyte、short、char、int或longdoublebyte、short、char、int、long或float例子:longi=0;intj=i+1;/会产生一个编译错误floatx=(float)3.14;/无显式转换将导致编译错误,放宽引用类型转换(WideningReferenceConversion)共9规则,不需要运行时检测,允许隐式转换。ST,S是T的子类(注意Object是所有类的父类!)。ST,类S实现了接口T。nullS,S是任意类、接口或数组类型。JK,J是K的子接口。JObject,J是任意接口。AObject,A是任意数组。ACloneable,A是任意数组。ASerializable,A是任意数组。SATA,SA和TA均为引用且可从SA放宽转换为TA。例子:,收窄引用类型转换(NarrowingReferenceConversion)共8规则,需要运行时检测(RTTI),仅支持显式转换。ST,S是T的父类(注意Object是所有类的父类!)。ST,S是非最终类且未实现接口T。ObjectA,A是任意数组。ObjectJ,J是任意接口。JT,J是任意接口而T是非最终类。JT,J是任意接口而T是实现了J的最终类。JK,J不是K的子接口且两者不含基调相同而返回类型不同的方法。SATA,SA和TA均为引用且可从SA收窄转换为TA。例子:,字符串类型转换(StringConversion)任何类型(包括null)均可转换为String类型。所有基本类型的数据首先转换为对应的包装类;执行每一个类都具有的toString()方法。注意字符串类型转换是一种单向关系(不具备对称性)。例子:System.out.println(x=+x+,y=+y);Stringresult=3.14;,Java语言禁止的类型转换禁止任何引用类型转换为任何基本类型。除字符串转换外,禁止任何基本类型转换为任何引用类型。null仅支持恒等转换;禁止null转换为任何基本类型。boolean仅支持恒等转换和字符串转换。如果S不是T的子类且T也不是S的子类,则S到T除字符串转换外禁止任何转换。如果S是最终类且未实现接口K,则禁止S转换为K。如果S不是Object,则禁止S转换为任何数组类型。如果T是最终类且未实现接口J,则J到T除字符串转换外禁止任何转换。如果接口J和K含有同基调但不同返回类型的方法,则禁止J转换为K。任何数组类型除转换为Object或String外,禁止转换为其他类类型。任何数组类型除转换为Serializable或Cloneable外,禁止转换为其他接口类型。如果SC到TC除字符串转换外禁止其他转换,则禁止SC转换为TC。,隐式类型转换规则,最小要求byte、short或char参与算术运算、位非运算或作为数组下标时,会自动放宽为int(但复合赋值+=、-=等运算则无需提升)。以大为主适用于算术运算、关系运算和逻辑运算等运算;byteshortintlongfloatdouble以左为主适用于赋值;禁止丢失信息。Java语言比其前辈C+语言更严格!C+允许将double赋值给int或float,丢失信息是程序员自己的事。,显式类型转换规则,假设area和length为int类型:area/length显式类型转换:(double)area/lengtharea/(double)length不正确的做法:无法提高精度!(double)(area/length),涉及boolean的类型转换,boolean与其他基本数据类型之间不允许类型转换这也意味着在所有控制语句中不允许以整型代替boolean作为判断条件。例如:inti=(int)true;/编译程序报错booleanb=(boolean)A;/编译程序报错非类型转换的转换方法:将整数x转换为逻辑值:(x!=0)将引用r转换为逻辑值:(r!=null)将布尔值b转换为字符串:(+b),一个例子程序,/计算某一学生数理化三科总分与平均分publicclassScorepublicstaticvoidmain(Stringargs)intmath=92;/数学成绩intphys=88;/物理成绩intchem=95;/化学成绩inttotal;/三科总分intaverage;/三科平均分/计算三科总分total=math+phys+chem;/计算三科平均分average=total/3;/在屏幕上输出计算结果System.out.println(数理化三科总分为+total);System.out.println(数理化三科平均分为+average);,average=total/3;四舍五入:做法一:floattemp=(float)total/3;average=(int)(temp+0.5);其他做法:floattemp=total/3.0F;floattemp=total/(float)3;floattemp=(float)(total/3.0);doubletemp=total/3.0;复合表达式:average=(int)(float)total/3+0.5);错误的做法:做法一:floattemp=(float)total/3;average=(int)temp+0.5;做法二:floattemp=total/3.0;average=(int)(temp+0.5);,3.6简单的输入输出,将华氏温度F转换为相应摄氏温度C的公式:C=(F-32)*5/9,观察运算结果:最简单的输出方式,System.out.println(.)System.out.println(长方形宽为+length);System.out.print(.)System.out.print(长方形高为);System.out.println(width);System.out.println(长方形面积为+(length*width);只在两个地方使用汉字:注释、字符串常量,最简单的程序,/将华氏温度转换为摄氏温度publicclassTemperaturepublicstaticvoidmain(Stringargs)System.out.print(今天的气温是摄氏);System.out.print(81.25-32)*5/9);System.out.println(度。);,为程序引入变量,/将华氏温度转换为摄氏温度publicclassTemperaturepublicstaticvoidmain(Stringargs)floatfah;/华氏温度floatcel;/根据fah转换得到的摄氏温度/确定华氏温度fahfah=(float)81.25;/根据华氏温度fah计算摄氏温度celcel=(fah-32)*5/9;/输出转换得到的摄氏温度celSystem.out.println(今天气温为摄氏+cel+度。);,动态输入变量的值,/将华氏温度转换为摄氏温度importjava.io.*;publicclassTemperaturepublicstaticvoidmain(Stringargs)floatfah;/华氏温度floatcel;/根据fah转换得到的摄氏温度/输入今天天气预报的华氏温度fahSystem.out.print(今天预报的华氏气温为:);tryBufferedReaderin=newBufferedReader(newInputStreamReader(System.in);StringinputLine=in.readLine();fah=Float.valueOf(inputLine).

温馨提示

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

评论

0/150

提交评论