面向对象程序设计教程.ppt
第 3 章 Java的基本语法,2023/8/8,Java面向对象程序设计教程,2,主要内容,3.1 类型、值与基本变量3.1.1 基本概念3.1.2 基本类型3.1.3 引用类型3.1.4 类型转换3.2 运算符与表达式3.2.1 算术运算符与表达式3.2.2 关系运算符与表达式3.2.3 逻辑运算符与表达式3.2.4 位运算符与表达式3.2.5 条件运算符与表达式3.2.6 赋值运算符与表达式3.2.7 instanceof运算符3.2.8 运算符优先级与赋值顺序的理解3.2.9 基本类型所支持的操作运算3.3 语句3.3.1 编组语句3.3.2 表达式语句3.3.3 选择语句3.3.4 循环语句3.3.5 迭代与递归3.3.6 控制转移语句3.3.7 注释语句,3.1 类型、值与基本变量,2023/8/8,Java面向对象程序设计教程,4,基本概念:字符集,ASCII(American Standard Code for Information Interchange)字符集:使用7位代码表示大小写字母、数字09以及若干控制字符,如NUL和EOT。ISO8859-1 Latin-1字符集:在西欧,用户希望字符集能够表示他们本国字符集的所有字符,ASCII字符集因而被扩展到8位,即增加了128个字符,用于表示英文中不存在的各种西欧语言的字符。Unicode字符集:是ISO标准16位字符集,支持65536个不同的字符。其中大约有21000个字符专门用于中文、日文和韩文的表意文字。ASCII、ISO Latin-1都是Unicode的子集。Java内部使用2个字节表示每个字符,采用Unicode编码。,2023/8/8,Java面向对象程序设计教程,5,基本概念:关键字、值、标识符,关键字(Keyword):也称保留字(Reserved word),全部由小写的英文字母所组成。关键字总共有50多个,其中一些留作将来供语言设计者扩充语言功能时使用。值(Literal):是指不能由程序员规定的代表某一特定常量或数字的可知的或未知的字母或符号,一般译作“直接量”或“字面值”,实际上泛指赋给各种不同类型(常指基本类型、字符串类型、空类型等)的有效值。本书将它简称为“值”,而另一个单词“Value”则称为“数值”。标识符(Identifier):是程序员提供的名字,在Java中,标识符的长度不受限制,但必须以字母、下划线或$符号开始,随后位置也可以包含数字。Java标识符支持几万个Unicode字母中所包含的世界上任何重要语言中的任何字母。举例:IdentifierTest.java,2023/8/8,Java面向对象程序设计教程,6,Java关键字,const和goto是保留字 true,false和null为相应类型的值,不属于关键字,2023/8/8,Java面向对象程序设计教程,7,强类型语言(Strongly typed language),Java属于强类型的程序设计语言。所有变量和表达式在编译时都有明确的类型,它有助于编译时的错误检测:类型限制了一个变量能够拥有的或者一个表达式能够生成的值;类型还限制了各种操作对这些值的支持程度以及决定操作的含义。,2023/8/8,Java面向对象程序设计教程,8,Java语言的类型结构,Java类型,基本类型,引用类型,数值类型,布尔类型,整 型,浮点型,类/接口类型,数组类型,byte,short,int,long,char,boolean,float,class,double,interface,Type,(空类型),(null),2023/8/8,Java面向对象程序设计教程,9,基本类型(Primitive Type),boolean 用于逻辑运算。int、long、byte和short 用于整数算术运算。char 主要用于输入输出。double和float 用于实数(即浮点数)的算术运算。整型数值缺省为int型,long型在数值之后加l或L浮点型数值缺省为double型,float型在数值之后加f或F,2023/8/8,Java面向对象程序设计教程,10,基本类型的特点,基本类型在所有的平台和实现中的定义相同,类型名称属于Java保留的关键字。基本类型的值不允许共享,任何一个基本类型的变量都会独自拥有一份相同类型的值。基本类型的变量的值只能通过赋值操作才能被改变。,2023/8/8,Java面向对象程序设计教程,11,基本类型的值(1),2023/8/8,Java面向对象程序设计教程,12,基本类型的值(2),2023/8/8,Java面向对象程序设计教程,13,基本类型的值(3),2023/8/8,Java面向对象程序设计教程,14,举 例,整数值的不同进制表示:NumeralExpression.java 字符的表达方式:CharacterExpression.java 浮点数运算:FloatingTest.java 数值类型的取值范围:ValueScope.java,2023/8/8,Java面向对象程序设计教程,15,引用类型,类类型(Class type)接口类型(Interface type)数组类型(Array type),2023/8/8,Java面向对象程序设计教程,16,类类型,使用关键字“class”,它定义了一个新的引用类型,并描述这一类型的具体实现。Java语言定义的根类(Root class)是Object类,也就是说除了Object类以外,其它类都是Object类的直接或间接子类(Subclass),这些类只能扩展(使用关键字“extends”)自唯一一个业已存在的类。Object类是缺省的继承父类,如果有一个类直接继承自Object类,“extends Object”可以省略不写。,2023/8/8,Java面向对象程序设计教程,17,类体的结构组成,类的成员类型:类成员(使用关键字static)和实例成员(无关键字static)形式:域(Field;也习惯地叫属性,Attribute)、方法(Method)、内嵌类(Nested class)和内嵌接口(Nested interface)实例初始化或者类初始化的语句块(Block)实例对象构造器(Constructor,也称构造方法)举例:ClassExample.java,2023/8/8,Java面向对象程序设计教程,18,接口类型,使用关键字“interface”,定义一套必须由类或组件实现的操作特征标记。一般有一个或多个操作特征标记以及零个或多个属性集合的定义。标识接口(Tag interface):不包含任何成员的接口类型,如java.io.Serializable、java.lang.Cloneable通过类来实现,使用关键字“implements”,多个接口类型之间用“,”隔开。类必须包括接口中定义的方法。接口可以进行多继承,也使用关键字“extends”。接口类型中不存在被其它所有接口类型继承的根接口类型。,2023/8/8,Java面向对象程序设计教程,19,接口体的结构与特点,包含与该接口有关的成员,这些成员可以是内嵌类、内嵌接口、常量或抽象方法。所有接口的成员都被隐式声明为“public”;所有的内嵌类或接口都被隐式声明为“static”;所有的成员属性都被隐式声明为“static”和“final”,亦即所有的成员属性都是常量;所有的成员方法都被隐式声明为“abstract”,亦即所有的成员方法都不包含任何具体的实现,但成员方法不能被声明为“static”,因为静态方法不能是抽象的。举例:InterfaceExample.java,2023/8/8,Java面向对象程序设计教程,20,数组类型,一个数组对象包含一定数量的数组变量,称为数组的组件或元素。数组元素通过一个非负的整型索引数值被引用。如果数组中包含有n个元素,则数组元素的索引值分别为0(n-1)。数组元素的个数可以为零,这时该数组被称为empty(空)数组。数组元素的类型可以是基本类型,也可以是其它的引用类型,一个数组中的所有元素的类型都是一样的。,2023/8/8,Java面向对象程序设计教程,21,数组表示法,Java语言中正式使用的表示法是,假如数组元素的类型表示为Type,则数组表示为Type x。如int x,读作int数组x。另一种表示法是提供给那些有C/C+编程经验的人们使用的,将方括号移到变量名称的后面,即Type x,如int x。,2023/8/8,Java面向对象程序设计教程,22,数组的一些特点,Java语言中没有直接的多维数组定义,而是把多维数组的实现理解为数组的数组。Java语言中,多维数组中每维数组的长度可以不同,数组空间也不一定是连续分配的。数组的直接超类是Object类,因此可以调用Object类中的所有方法。每个数组类型都已经实现了java.io.Serializable和java.lang.Cloneable接口,也就是可以对数组对象直接进行串行化处理和对象复制,但对于多维数组也是只能实现单层复制。数组中元素的个数可通过数组属性length进行访问。举例:ArrayExample.java,2023/8/8,Java面向对象程序设计教程,23,基本类型的包装类,2023/8/8,Java面向对象程序设计教程,24,与字符串相关的封装类,String和StringBuffer类分别用于处理不变字符串(常量)和可变字符串。Java语言中还提供了一种快速创建String对象的方式,非常像基本类型的赋值方式:String str=”I am a string constant.”String被设计为存储字符串常量的类,这种实例化形式在大多数情况下是更好的String构造技术,这与所创建的字符串存储在字符串常量池使其可被共享有关。字符串常量池的工作机制是,当需要某一个字符串时,先到池里查找,如果已经存在,则直接引用;如果还没有就在池中创建一个新的字符串对象。也可以说,字符串常量池中内容相同的String对象只有一个,该对象直到JVM退出时才被清除。举例:StringExample.java,2023/8/8,Java面向对象程序设计教程,25,类型转换,类型转换方式分为窄化(Narrowing)和拓宽(Widening)转换。编译时可以自动执行拓宽转换(称为Promotion,提升)。而窄化转换则总是要求显式执行强制转换(称为Cast,转型)。,2023/8/8,Java面向对象程序设计教程,26,基本类型的拓宽转换原则,如果存在一个double型,则按double型执行运算。否则,如果存在一个float型,则按float型执行运算。否则,如果存在一个long型,则按long型执行运算。否则,按照32位的int型计算精度执行运算。当在整型与浮点型之间进行转换时,计算精度不仅仅是数据类型的取值范围问题,它还包括浮点能够存储的十进制数的位数。举例:PrimitiveWidening.java,2023/8/8,Java面向对象程序设计教程,27,基本类型的窄化转换,窄化转换意味着余数转换,这种从一个大容量的数据类型到另一个小容量的数据类型的赋值只会取其较小的数值范围,这可能造成数量级的损失。如果需要把一个范围较大的整型数值赋给一个范围较小的数据类型的变量,原则上都需要对数值执行强制转换。对于byte、short、char类型的变量,在相应类型的取值范围内时,允许不需要显式强制类型转换而直接赋给int型数值,因为这样做并不会引起数据丢失;当所赋数值不在其取值范围内时,则必须显式进行类型强制转换,否则将出现错误而不是警告。如果把浮点型数值转换成整型数值,小数点后面的数值将被圆整去掉。举例:PrimitiveNarrowing.java,2023/8/8,Java面向对象程序设计教程,28,引用类型的转换,从子类型转换为父类型即属于引用类型的拓宽转换,特别是从任何引用类型(包括类、接口、数组)转换成Java的根类Object都属于此种转换形式。引用类型的拓宽转换可以自动进行,不会引发任何异常。引用类型的窄化转换指的是从父类型转换为子类型,特别是从Object类转换成其它任何引用类型都属于这种转换形式。引用类型的窄化转换同样需要强制进行,即所谓的转型,这种转换的使用十分广泛,它体现了面向对象的多态性。转型将在运行时进行类型匹配检查,如果类型不匹配将引发异常ClassCastException。举例:ReferenceConversion.java,2023/8/8,Java面向对象程序设计教程,29,类型转换讨论,自动转换不要以为扩大取值范围就万无一失浮点型的有效位问题引用型的属性问题强制转换,3.2 运算符和表达式,2023/8/8,Java面向对象程序设计教程,31,Java语言中的算术运算符与表达式,2023/8/8,Java面向对象程序设计教程,32,Java语言中的关系运算符与表达式,2023/8/8,Java面向对象程序设计教程,33,Java语言中的逻辑运算符与表达式,2023/8/8,Java面向对象程序设计教程,34,Java语言中的位运算符与表达式,举例:BitOperand.java,2023/8/8,Java面向对象程序设计教程,35,其它运算符,条件运算符:三元运算符,其表达式为someCondition?tureExpression:falseExpression赋值运算符与表达式:=、+=、-=、*=、/=、%=、=、=、&=、|=、=instanceof运算符,2023/8/8,Java面向对象程序设计教程,36,Java语言运算符优先级以及同等优先级运算符的组合顺序,2023/8/8,Java面向对象程序设计教程,37,Java语言运算符优先级以及同等优先级运算符的组合顺序(续),举例:EvaluationOrder.java,2023/8/8,Java面向对象程序设计教程,38,关于断句,无鸡鸭亦可无鱼肉亦可青菜一小碟足矣,2023/8/8,Java面向对象程序设计教程,39,整型支持的操作运算,比较运算,其结果为boolean型:大小比较、=相等比较=、!=数值运算,其结果为int或long型:加减运算+、-乘除运算*、/、%符号运算+、-前(后)缀自增运算+前(后)缀自减运算-位运算、按位取反运算 按位逻辑运算&、|、条件运算?:类型转换运算(Type)字符串连接运算+Byte、Short、Integer、Long、Character等包装类中的方法Java中存在一个称为的java.math.BigInteger类,支持无限制的整数运算。,2023/8/8,Java面向对象程序设计教程,40,浮点型支持的操作运算,比较运算,其结果为boolean型:大小比较、=相等比较=、!=数值运算,其结果为float或double型:加减运算+、-乘除运算*、/、%符号运算+、-前(后)缀自增运算+前(后)缀自减运算-条件运算?:类型转换运算(Type)字符串连接运算+Float、Double等包装类中的方法以及java.lang.Math类,Math类中包含许多与数学运算有关的方法,如幂运算方法exp(double a)、随机数生成方法random()、正弦函数计算方法sin(double a),等等。Java语言存在一个称为java.math.BigDecimal的类,支持无限制的实数运算。,2023/8/8,Java面向对象程序设计教程,41,布尔型支持的操作运算,关系比较运算=、!=逻辑非运算!逻辑运算&、|、条件与和条件或&、|条件运算?:字符串连接运算+,布尔型的值true和false都可以转换成字符串,并作字符串连接运算。Boolean包装类中的方法。,3.3 语句,2023/8/8,Java面向对象程序设计教程,43,编组语句,代码块由一对花括号“”界定,中间包含零或多个语句以及局部变量声明组成,且能够以任何顺序存在。无论任何位置,只要允许单个语句存在,都可以放置代码块。空语句仅仅是分号“;”本身。空语句不执行任何动作,无论何处,只要可以放置普通语句,都可以使用空语句。空语句总是可以完全正常执行。,2023/8/8,Java面向对象程序设计教程,44,表达式语句,赋值、方法调用、类的实例化、自增(减)1运算等,都是表达式语句。常用的语句格式如下:new StringBuffer(“Hello”);/创建不被引用的实例对象new JFrame().setVisible(true);/方法调用i+;/自增运算a=b;/赋值,2023/8/8,Java面向对象程序设计教程,45,选择语句,if语句的一般语法格式如下:if(boolean-expression)statement1;elsestatement2;switch语句的一般语法格式如下:switch(expression)case value1:statement1;break;case value2:statement2;break;case valueN:statemendN;break;default:defaultStatement;举例:Kid.java,2023/8/8,Java面向对象程序设计教程,46,循环语句,while语句 initialization/初始化部分while(termination)/布尔型表达式,循环终止条件body;/循环体部分iteration;/迭代部分 do-while语句 initialization/初始化部分do body;/循环体部分iteration;/迭代部分 while(termination);/布尔型表达式,循环终止条件 for语句 for(initialization;termination;iteration)/初始化部分;循环终止条件;迭代部分body;/循环体部分 无限循环语句while(true)for(;),2023/8/8,Java面向对象程序设计教程,47,讨论:迭代与递归,迭代(Iteration)法通常采用循环语句(如for语句、while语句、do-while语句等)来完成运算,递归(Recursion)法通常采用选择语句(如if语句、if-else语句、switch语句等)来完成运算。本质上迭代和递归都包含着循环:迭代法是显式调用了循环语句,而递归法则通过自我调用的策略来实现循环。举例:Fibonacci.java,2023/8/8,Java面向对象程序设计教程,48,控制转移语句,标识语句 continue语句 break语句 return语句,2023/8/8,Java面向对象程序设计教程,49,注释语句,单行注释以“/”开始,直至行末端结束。多行注释也可以采用以“/*”开始、以“*/”结束的方式来定义。以“/*”开始的注释形式,表明此后的正文内容可以由自动文档生成器javadoc读取。举例:Control.java,