1、第2章 初识对象和简单数据类型,一个Java应用程序由若干个类所构成,即由若干个字节码文件所构成,但必须有一个主类,即含有main方法的类,Java应用程序总是从主类的main方法开始执行。在编写一个Java应用程序时,可以编写若干个Java源文件,每个源文件编译后产生一个类的字节码文件。(例2-2) 执行过程: 将应用程序涉及的Java源文件保存在相同的目录中,分别编译通过,得到Java应用程序所需要的字节码文件。 运行主类。,2.1 Java应用程序的基本结构,Java允许在一个Java源文件中编写多个类,但至多只能有一个类使用public修饰。如果源文件中有多个类,但没有public类,
2、那么源文件的名字只要和某个类的名字相同,并且扩展名是.java就可以了,如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java(有关public类和非public类的区别将在4.11节介绍)。编译源文件将生成多个扩展名为.class的字节码文件,每个字节码文件的名字与源文件中对应的类的名字相同,这些字节码文件被存放在与源文件相同的目录中。(例2-3),2.2 一个源文件中编写多个类,2.3 标识符与关键字,关键字、标识符和分隔符 例 App1.java public class App1 public static void main(String arg
3、s) int a=126; double b=0.2,c=1.6;String str=new String(“字符串不是基本数据类型“);System.out.print(“a=“+a);System.out.println(“b+c=“+b+c);System.out.println(str); ,关键字(keyword) 定义:是Java语言本身已经定义的具有专门意义和用途的字符串。 关键字全部用英文小写字母表示。,注意:String和System不是关键字,是Java语言本身提供的可供用户使用的类,它们中封装了很多成员变量和方法,能够完成一些特定的功能。,标识符(identifier)
4、 定义:用户自定义的类、变量、常量、方法等的名称。 命名规则 (1)由字母、数字、下划线(_)和 $ 符号组成。 (2)不能以数字开头,不能使用关键字。 (3)标识符区分大小写,如Name和name表示不同的标识符。 (4)由于Java使用的是16位的Unicode字符集(把汉字和英文字母统一处理),因此,标识符中可以包含汉字。,注意: 为提高程序可读性,用标识符命名最好见名知意,通常类名、方法名比较长,由名词、动词或他们的组合来命名。 类名的首字母大写,方法名的首字母小写,后面的各个单词的首字母大写。,下面列出的词哪些可以作为标识符,哪些不能作为标识符,并说明原因: intVariable
5、t%ea MyName LD.p1 $Miss float var 2 _010 89 学生,t%ea,LD.p1,float,89,var 2,分隔符 注释:提高程序的可读性。单行注释:/注释部分块注释:/* 注释部分 */ 或 /* 文档注释部分 */ 空白符:空格、回车、换行和制表符等 其它: ; , :,注意: 常量(用关键字final修饰的变量)全部用大写,单词之间用下划线隔开。如:TEXT_CHENGED 变量名或一个类的对象名等首字母小写。,Java语言的数据类型,基本数据类型(简单数据类型),数据类型 所占位数 值的范围 boolean 8 true/falsechar 16
6、0 65535byte 8 -2727-1short 16 -215215-1 int 32 -231231-1 long 64 -263263-1 float 32 7 3.4e38 3.4e38double 64 15 1.7e308 1.7e308,整型数据byte, short, int, long,整型常量 1. 十进制整数如123,456,0 定义:final int A = 123; 2. 八进制整数以0开头,如0123表示十进制数83,011表示十进制数9。 3. 十六进制整数以0x或0X开头,如0x123表示十进制数291,0X12表示十进制数18。 整型变量 类型为byte
7、、short、int或long,byte在机器中占8位,short占16位,int占32位,long占64位。整型变量的定义如:int x=123; /指定变量x为int型,且赋初值为123byte b = 8; short s = 10; long y = 123L; long z = 123l;,实型常量 1. 十进制数形式由数字和小数点组成,且必须有小数点,如0.123, .123, 123.,123.0 2. 科学计数法形式如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数。 实型变量 类型为float或double,float在机器中占32位,doub
8、le占64位。实型变量的定义如:float x=0.123; /指定变量x为float型,且赋初值为0.123double y = 0.123F; double z = 0.123f;,实型数据float, double,字符常量字符常量是用单引号括起来的一个字符,如a,A; 字符型变量类型为char,它在机器中占16位。字符型变量的定义如:char c=a; Java里字符串字符数组,字符型数据 char,Java中的字符型数据不能用作整数,因为java不提供无符号整数类型,但是同样可以把他当作整数数据来操作(因为发生了类型转换)。例如:int three=3;int one=1;char
9、four=(char)(three+one);/four=4,字符型数据 char,Unicode编码字符,字符型数据表示单个Unicode编码中的字符,Unicode是一种新的国际标准编码方案,每个Unicode字符占用16个比特位,即两个字节的内存空间,它包含的信息量比一个字节编码的ASCII标准码多了一倍。 字符型常数的表示为用单引号括起来的字符。例如: A 7 # Unicode编码通常采用16进制编码方案表示,范围从u0000到uffff。转义符u是Unicode编码的前缀,表示这是一个Unicode编码。 举例,“中文”的unicode编码是:“u4e2du6587”,Unicod
10、e编码字符,Java的字符数据类型char与其他语言相比有较大的改进。C语言等的字符类型是采用ASCII编码,每个数据占用8比特的长度,总共可以表示256个不同的字符。ASCII编码是国际标准的编码方式,但是也有其一定的局限性,最典型的体现在处理以汉字为代表的东方文字方面。汉字的字符集大,仅用8位编码是不够的,所以传统的处理方法是用两个8位的字符数据来表示一个汉字。为了简化问题,Java的字符类型采用了一种新的国际标准编码方案Unicode编码。每个Unicode码占用16个比特位,包含的信息量比ASCII码多255倍,无论东方字符还是西方字符,都可以统一用一个字符表达。由于采用Unicode
11、编码方案,为Java程序在基于不同语言的平台间实现平滑移植铺平了道路。,布尔型数据boolean,布尔型数据用于逻辑测试功能,主要用在选择语句和循环语句中,用于判断条件是否成立,从而决定下步的操作。 布尔型数据只有两个值:true和false,分别表示逻辑真和逻辑假。不可以0或非0的整数替代true和false。 通过下面的例子来说明boolean型变量的定义和用法。boolean b = false; if(b=true) /do something ,注意: 所有基本类型所占的位数都是确定的,并不因操作系统的不同而不同。 所有基本类型的关键字都是小写的。 在Java语言程序设计中,根据要求
12、选用正确的基本数据类型是非常重要的,而选择的主要依据就是数据类型值的范围。,常量和变量 常量:在程序运行期间值不改变的量。 (1)整型常量:默认为int类型(占4个字节) (2)实型常量:单精度(float)和双精度(double) (3)布尔常量:true false (4)字符常量:占2个字节内存,表示Unicode字符 (5)字符串常量:用双引号括起来的字符序列。,十进制:0 -243 2147483647 八进制(以数字0开头):010 -0377 十六进制(以0x或0X开头):0x10 -0XF 长整数(以l或L结尾):12l -343L 0xfffffffffL,用单引号括起来的单
13、个字符:a,+ 用单引号括起来的转义字符:n,t, 八进制转义字符(ddd):141,101 Unicode转义字符(Uhhhh):U0061,(6)符号常量格式:final 类型 符号常量常量值;例如:final int INT_CONSTANT=1234;final char CHAR_CONSTANT=a;final boolean BOOLEAN_CONSTANT=true;final float PI=3.1415926f, E=2.71828f; 变量:先定义后使用。基本数据类型的变量的定义格式:数据类型 变量1=初值,变量2=初值;例如:int a=1,b9,c=4; boole
14、an boolVar;,变量的作用范围在类体中定义的类的成员变量在方法中定义的变量在for、while或if等复合语句中定义的变量,注意:在方法体中的变量必须初始化(赋值)后才能使用,而在类中的变量可自动初始化。,例 常量、变量的定义和变量的作用范围。(TypeDefinition),注意:加号(+)可用于把两个数字相加,也可用于字符串的连接,这时所有其它数据类型都会自动转化为字符串类型,并连接成新的字符串。,类型转换 (1)自动类型转换(从低级到高级) (低) byte、short、char、int、long、float、double (高) (byte或short)op(int) int
15、(byte或short或int)op(long) long (byte或short或int或long)op(float) float (byte或short或int或long或float)op(double) double (char)op(int) int,(2)强制类型转换格式:(目标数据类型)变量名或表达式注意: 转换过程中可能损失精度 (byte)255 (int)9988776655443322L 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。 (int)23.7 (int)-45.89f,运算符、表达式与流程控制,Java语言的运算符和表达式 Java语言的流程控制,Jav
16、a语言的运算符和表达式,基本概念 运算:是对数据进行加工的过程。 运算符:用来表示各种不同运算的符号。 操作数:参加运算的数据称为运算对象(操作数)。 表达式:用运算符和括号将操作数连接起来、有意义的式子。运算符及表达式 算术运算符,(1)加运算符+:连接两个字符串。例如,“abc”+12的结果为“abc12”;”abc”+1+2=? “abc”+(1+2)=? (2)Java语言既可对整数取模,也可以对小数取模。例如,16.25=1.2 (3)char类型的数据可以进行算术运算,而boolean类型的数据不能进行算术运算。,关系运算符,逻辑运算符 &(&)、|(|)、! 注意:运算符(&、|
17、)和运算符(&、|)的区别。,利用&、|作运算时,运算符左右两边的表达式都 会被执行,最后两表达式的结果再进行与、或运算; 而利用&、|作逻辑运算时,如果只计算运算符左边 的表达式即可确定与、或的结果,则右边的表达式 将不会执行。,赋值运算符三目条件运算符 表达式1 ? 表达式2 :表达式3需注意: 表达式1应是boolean类型的表达式;表达式2和表达式3的类型要一致。其它运算符instanceof(对象运算符)用来判断某个具体对象是否是某个类(或其子类)的一个实例化的对象;若是,则结果为true,否则为假。 例如:String str”abc”;boolean b;bstr instanc
18、eof String;,Java语言的流程控制,分支语句:if-else, switch 循环语句:while, do-while, for 与程序转移有关的其它语句:break, continue, return 例外处理语句:try-catch-finally, throw,例题:求一个水仙花数程序 。水仙花数是三位数,它的各位数字的立方和等于这个三位数本身。 import java.io.*; public class Narcissus public static void main(String args) int i,j,k,n = 100 , m = 1 ;while ( n10
19、00 ) i = n/100 ;j = ( n-i*100 ) / 10 ;k = n % 10 ;if (i*i*i + j*j*j + k*k*k = n )System.out.println(“找到第“ + m+“个水仙花数“+n) ;n +; ,break语句 格式:break; 或 break 标号; 功能:带标号的break语句从多重循环体的内部跳出到标号所标志的那层循环,并从标号标志的那层循环后面的语句继续执行。 被加标签的代码块必须包围break语句,但是它不需要是直接的包围break的块。 标号:是定义在程序中循环语句前面的标识符,后跟一个冒号,标志要跳出的循环层次。,注意
20、:在多重循环中,不带标号的break语句将只退出它所在的内循环,break语句,不记来时路 -goto之灾,A: if() goto B; C: if() goto A; else if() goto B; else goto C; B:,break语句,a: /a代码块b: /b块c: /c块break b; /这段代码不会被执行 /c结束 /这段也不会被执行 /b结束 /从此开始执行 /a结束,import java.io.*; public class Example public static void main(String args) L: for(int i=0;i1) brea
21、k L;System.out.println(i+“:“+j);System.out.println(“break goto here“); ,L语句块,continue语句 格式:continue; 或 continue 标号; 功能:带标号的continue语句可以从多重循环的内层循环跳到外层循环,执行标号所标识的循环的下一轮。 注意:标号只能设在for语句之前,continue语句,continue语句,outer: for( int i=0; i10; i+ ) /外层循环 inner: for( int j=0; j10; j+ ) /内层循环if( ij )continue out
22、er; / = goto outer /内层循环结束 /外层循环结束,for( int i= 0; i 10; i+ ) if( i = 5 )continue; ,例:输出10000之内的所有完全数。完全数是指等于其所有因子和(包括1但不包括这个数本身)的数。例如6123,6123,则6是一个完全数。 分析:用一个循环依次检查1到9999之间的所有整数是否是完全数。每轮循环检查一个数是否是完全数。为此需要找出该数的所有因子并计算其累加和。而为了找出一个数的所有因子,只要再用一个循环依次检查从1到比该数小1的数能否被该数整除即可。,import java.io.*; public class
23、PerfectNum public static void main(String args) for(int i =1;i10000;i+)int y=0;for(int j=1;ji;j+)if(i%j=0) y+=j;if(y = i) System.out.print(i+“是一个完全数n“); ,Scanner是JDK1.5新增的一个类,可以使用该类创建一个对象:Scanner reader=new Scanner(System.in);然后reader对象调用下列方法,读取用户在命令行(MS-DOS窗口)输入的各种基本类型数据:nextBoolean();nextByte(),ne
24、xtShort(),nextInt(),nextLong(),nextFloat(),nextDouble()。 图2.9 从命令行输入数据上述方法执行时都会堵塞,程序等待用户在命令行输入数据并按Enter键确认。,2.4 从命令行窗口输入、输出数据,System.out.println()或System.out.print()可输出串值、表达式的值,二者的区别是前者输出数据后换行,后者不换行。允许使用并置符号:“+”将变量、表达式或一个常数值与一个字符串并置一起输出 需要特别注意的是,在使用System.out.println()或System.out.print()输出字符串常量时,不可以
25、出现回车换行,JDK 1.5新增了和C语言中printf函数类似的数据输出方法,该方法使用格式如下:System.out.printf(“格式控制部分“,表达式1,表达式2,表达式n)格式控制部分由格式控制符号:%d、%c、%f、%s和普通字符组成,普通字符原样输出。格式符号用来输出表达式的值。 %d:输出int类型数据值。 %c:输出char型数据。 %f:输出浮点型数据,小数部分最多保留6位。 %s:输出字符串数据。 输出数据时也可以控制数据在命令行的位置,例如: %md:输出的int型数据占m列。 %m.nf:输出的浮点型数据占m列,小数点保留n位。,遵守一门语言的编程风格是非常重要的,
26、否则编写的代码将难以阅读,给后期的维护带来诸多不便 在编写Java程序时,许多地方都涉及使用一对大括号,如类的类体、方法的方法体、循环语句的循环体以及分支语句的分支体等都涉及使用一对大括号扩起若干内容,即俗称的“代码块”都是用一对大括号扩起的若干内容。“代码块”有两种流行(也是行业都遵守的习惯)的写法:Allmans风格和Kernighan风格,本书后续章节的绝大多数代码将采用Kernighan风格,2.5 编程风格,Allmans风格也称“独行”风格,即左、右大括号各自独占一行,如下列代码所示。class Allmans public static void main(String args
27、)int sum=0,i=0,j=0;for(i=1;i=100;i+)sum=sum+i;System.out.println(sum); ,2.5.1 AllMans风格,Kernighan风格也称“行尾”风格,即左大括号在上一行的行尾,而右大括号独占一行,如下列代码所示。class Kernighan public static void main(String args) int sum=0,i=0,j=0;for(i=1;i=100;i+) sum=sum+i;System.out.println(sum); ,2.5.1 Kernighan风格,给代码增加注释是一个良好的编程习惯,注释的目的是为了便于代码的维护和阅读,Java支持两种格式的注释:单行注释和多行注释。 单行注释使用“/”表示单行注释的开始,即该行中从“/”开始的后续内容为注释 多行注释使用“/*”表示注释的开始,以“*/”表示注释结束,2.5.3 注释,