1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,2,章 初识对象和简单数据类型,主要内容,问题的提出,简单的矩形类,使用矩形类创建对象,在,Java,应用程序中使用矩形对象,Java,应用程序的基本结构,标识符与关键字以及简单数据类型,编程风格,难点,使用矩形类创建对象,本章导读,编写一个,Java,应用程序,该程序可以输出矩形的面积。,public class,ComputerRectArea,public static void,main(String,args,),double height;/,高,double width;/,宽,do
2、uble area;/,面积,height=23.89;,width=108.87;,area=height*width;/,计算面积,System.out.println(area,);,2.1,问题的提出,面向对象的一个重要思想就是通过抽象得到类,即将某些数据以及针对这些数据上的操作封装在一个类中,也就是说,抽象的关键点有两点:,一是数据,二是数据上的操作,。,我们对所观察的矩形做如下抽象:,矩形具有宽和高之属性。,可以使用矩形的宽和高计算出矩形的面积。,2.2,简单的矩形类,现在根据如上的抽象,编写出如下的,Rect,类。,public class,Rect,double width;/
3、矩形的宽,double height;/,矩形的高,double,getArea,()/,计算面积的方法,double area=width*height;,return area;,Rect,类不是主类,因为,Rect,类没有,main,方法,类是,Java,语言中最重要的一种数据类型。用类创建对象需经过,2,个步骤:,(,1,)声明对象,(,2,)为对象分配(成员)变量,2.3,使用矩形类创建对象,由于,类也是一种数据类型,,因此可以使用类来声明一个变量,那么,在,Java,语言中,,用类声明的变量就称之为一个对象,例如用,Rect,声明一个名字为,rectangle1,的对象的代码如下
4、Rect,rectangle1;,声明对象变量,rectangle1,后,,rectangle1,的内存中还没有任何数据,称这时的,rectangle1,是一个空对象,2.3.1,用类声明对象,null,rectangle1,图,2.2,内存模型,程序声明对象后,需要为所声明的对象分配变量,这样该对象才可以被程序使用。为上述,Rect,类声明的,rectangle1,对象分配内存的代码如下:,rectangle1=,new,Rect,();,这里,new,是为对象分配变量的运算符,,,Rect,(),是,Rect,类的构造方法,2.3.2,为对象分配变量,n,ew,运算符在为变量,heig
5、ht,、,weight,分配内存后,,将返回一个引用,(该引用包含着所分配的变量的有关,内存地址,的等信息),如果将该引用赋值到,rectangle1,对象中:,r,ectangle1=new,Rect,(),rectangle1,对象就诞生了,0 xab187,0.0,0.0,width,height,rectangle1,在声明对象时可以同时为对象分配变量,Rect,rectangle1,=,new,Rect,();,一个类可以创建多个不同的对象,这些对象将被分配不同的变量,因此,改变其中一个对象的状态不会影响其它对象的状态,如:,Rect,rectangle2,=,new,Rect,()
6、Rect,rectangle3,=,new,Rect,();,对象通过使用“,.,”运算符操作自己的变量和调用方法。对象操作自己的变量的的格式为:,对象,.,变量,;,例如:,rectangle1.width=12;,rectangle1.height=9;,调用方法的格式为:,对象,.,方法,;,例如:,rectangle1.getArea();,2.3.3,使用对象,例,2-1,Example2_1.java,public class Example2_1,public static void,main(String,args,),Rect,rectangle1,rectangle2;
7、/,声明,2,个对象,rectangle1=new,Rect,();/,创建对象,rectangle2=new,Rect,();,rectangle1.width=128;,rectangle1.height=69;,rectangle2.width=18.9;,rectangle2.height=59.8;,double area=rectangle1.getArea();,System.out.println(rectangle1,的面积,:+area);,area=rectangle2.getArea();,System.out.println(rectangle2,的面积,:+area
8、);,2.4,在,Java,应用程序中使用矩形对象,一个,Java,应用程序由若干个类所构成,即由若干个字节码文件所构成,,但必须有一个主类,,,即含有,main,方法的类,,,Java,应用程序总是从主类的,main,方法开始执行。在编写一个,Java,应用程序时,可以编写若干个,Java,源文件,,每个源文件编译后产生一个类的字节码文件。通常需要两个步骤:,(1),将应用程序涉及的,Java,源文件保存在相同的目录中,,分别编译通过,,得到,Java,应用程序所需要的字节码文件。,(2),运行主类,。,2.5 Java,应用程序的基本结构,运行一个,Java,应用程序两种方法:,(,1,)
9、分别编译各个,java,源文件,产生字节码文件,并将得到的字节码文件和主类的字节码文件存放在同一个目录中。最后解释执行主类字节码。,(,2,)如果所有源文件在一个目录下,也可以只编译主类的源文件,,Java,系统会自动地先编译主类需要的其他源文件。,例,2-2,Circle.java,public class Circle,double radius;/,圆的半径,double,getArea,(),return 3.1415926*radius;,Lader.java,public class,Lader,double above;/,梯形的上底,double bottom;/,梯形的下底,
10、double height;/,梯形的高,double,getArea,(),return(,above+bottom,)*height/2;,例,2-2,MainClass.java,public class,MainClass,public static void,main(String,args,),Circle,circle,=new Circle();,circle.radius,=100;,double area=,circle.getArea,();,System.out.println,(,圆的面积,:+area);,Lader,lader,=new,Lader,();,lad
11、er.above,=10;,lader.bottom,=56;,lader.height,=8.9;,area=,lader.getArea,();,System.out.println,(,梯形的面积,:+area);,总要说明,(,1,),Java,允许在一个,Java,源文件中编写多个类,,但至多只能有一个类使用,public,修饰,。如果源文件中有多个类,但没有,public,类,那么源文件的名字只要和某个类的名字相同,并且扩展名是,.java,就可以了,,如果有一个类是,public,类,那么源文件的名字必须与这个类的名字完全相同,扩展名是,.java,2.6,一个源文件中编写多个类
12、2,)编译源文件将生成多个扩展名为,.class,的字节码文件,每个字节码文件的名字与源文件中对应的类的名字相同,这些字节码文件被存放在与源文件相同的目录中。,例,2-3,public class Rectangle,/Rectangle,类,double width;,double height;,double,getArea,(),return width*height;,class Example2_3,/,主类,public static void,main(String,args,),Rectangle r;,r=new Rectangle();,r.width,=1.819;
13、r.height,=1.5;,double area=,r.getArea,();,System.out.println,(,矩形的面积,:+area);,注意:,保存,:为,Rectangle.java,编译,:,javac,Rectangle.java,执行,:,java Example2_3,2.7.1,标识符,标识符由,字母,、,下划线,、,美元符号,和,数字,组成,长度不受限制。,标识符的,第一个字符不能是数字字符,。,标识符不能是关键字(关键字详细介绍见,2.1.2,小节),标识符不能是,true,、,false,和,null,(尽管,true,、,false,和,null,不是
14、Java,关键字)。,Java,语言使用,Unicode,标准字符集,2.7,标识符与关键字,以下是,Java,的,50,个关键字:,abstract assert,boolean,break byte case catch char class const continue default do double else,enum,extends final finally float for,goto,if implements import,instanceof,int,interface long native new package private protected public
15、return short static,strictfp,super switch synchronized this throw throws transient try void volatile while,。,2.7.2,关键字,Java,语言有,8,种简单数据类型,分别是:,boolean,、,byte,、,short,、,int,、,long,、,float,、,double,、,char,。,这,8,种简单数据类型习惯上可分为以下四大类型:,逻辑类型:,boolean,整数类型:,byte,、,short,、,int,、,long,字符类型:,char,浮点类型:,float,、
16、double,2.8,简单数据类型,常量:,true,,,false,。,变量:使用关键字,boolean,来声明逻辑变量,声明时也可以赋给初值,例如:,boolean,x,ok,=,true,no,=false;,2.8.1,逻辑类型,整型数据分为,4,种。,1,int,型,(,占,4,字节,),常量:,123,,,6000,(十进制),,077,(八进制),,0 x3ABC,(十六进制)。,变量:使用关键字,int,来声明,int,型变量,声明时也可以赋给初值,int,x=12,y=9980,z;,2.8.2,整数类型,2,byte,型,变量:使用关键字,byte,来声明,byte,型变
17、量,常量:,Java,中不存在,byte,型常量的表示法,但可以把一定范围内的,int,型常量赋值给,byte,型变量。对于,byte,型变量,,内存分配给,1,个字节,,占,8,位,因此,byte,型变量的取值范围是,-2,7,2,7,-1,。如果需要强调一个整数是,byte,型数据时,可以使用强制转换运算的结果来表示,(byte)-12,(byte)98,3,short,型,变量:使用关键字,short,来声明,short,型变量,常量:和,byte,型类似,,Java,中也不存在,short,型常量的表示法,,但可以把一定范围内的,int,型常量赋值给,short,型变量。对于,shor
18、t,型变量,,内存分配给,2,个字节,,占,16,位,因此,short,型变量的取值范围是,-2,15,2,15,-1,。如果需要强调一个整数是,short,型数据时,可以使用强制转换运算的结果来表示,(short)-12,(short)98,4,long,型,(,占,8,个字节,),常量:,long,型常量用后缀,L,来表示,变量:使用关键字,long,来声明,long,型变量,long width=12L,height=2005L,length;,常量:,A,,,b,,,?,,,!,,,9,,,好,,,t,,,,,等,即用单引号扩起的,Unicode,表中的一个字符。,变量:使用关键字,c
19、har,来声明,char,型变量,,内存分配两个字节,最高位不是符号位,没有负数的,char,2.8.3,字符类型,了解转义字符,如:,char ch1=n,ch2=”;,一个字符和和其在,Unicode,表中的顺序对应关系,若想知道在,uinicode,表中位置,,使用,int,型强制转换,若想知道一个,065536,之间的数所代表的,unicode,表中相应位置上的字符,要使用,char,强制转换,例,2-4,Example2_4.java,public class,Example2_4,public static void main(String,args,),char,ch1=,国,c
20、h2,=,庆,;,int,p1=969,p2=12353;,System.out.println(ch1+,在,Unicode,表中的位置,:+,(int)ch1,);,System.out.println(ch2+,在,Unicode,表中的位置,:+,(int)ch2,);,System.out.println,(,第,+p1+,个位置上的字符是,:+,(char)p1,);,System.out.println,(,第,+p2+,个位置上的字符是,:+,(char)p2,);,浮点型分为,float,和,double,型。,1,float,型(,占,4,个字节,),常量:,453.543
21、9f,,,21379.987F,,,231.0f,(小数表示法),,2e40f,(,2,乘,10,的,40,次方,指数表示法)。,需要特别注意的是,常量后面必须要有后缀“,f,”或“,F,”。,变量:使用关键字,float,来声明,float,型变量,2.8.4,浮点类型,2,double,型,常量:,2389.539d,,,2318908.987,,,0.05,(小数表示法),,1e-90,(,1,乘,10,的,-90,次方,指数表示法)。,对于,double,常量,后面可以有后缀“,d,”或“,D,”,但允许省略该后缀。,变量:使用关键字,double,来声明,double,型变量,例,2
22、5,有,3,个类,People,:具有刻画人的身高和体重的简单类型的变量。,Machine,:创建的对象可以根据,People,类对象的成员变量的值判断人的体重是:胖或瘦,主类,Example2_5,:,负责用,People,类和,Machine,类创建对象。,例,2-5,:,People,public class,People,float weight;,int,height;,void speak(),System.out.println,(,我的身高是,+,height+cm,);,System.out.println,(,我的体重是,+,weight+kg,);,例,2-5,:,Ma
23、chine,public class Machine,public void,estimate(int,height,double,weight),double number=(height-100)/weight;,if(number,=1.1),System.out.println,(,偏瘦,);,else,if(number,=0.96),System.out.println,(,正常,);,else,if(number,0.96),System.out.println,(,偏胖,);,例,2-5,:,Example2_5,public class Example2_5,public s
24、tatic void,main(String,args,),People,张三,李四,;,Machine,体检器,;,体检器,=new Machine();,张三,=new People();,张三,.weight=82.5f;,张三,.height=176;,张三,.speak();,体检器,.estimate(,张三,.height,张三,.weight);,李四,=new People();,李四,.weight=73f;,李四,.height=171;,李四,.speak();,体检器,.estimate(,李四,.height,李四,.weight);,当我们把一种基本数据类型变量的
25、值赋给另一种基本类型变量时,这就涉及数据转换。下列基本类型会涉及数据转换(不包括逻辑类型)。,将这些类型按精度从“低”到“高”排列:,byte short char,int,long float double,当把级别低的变量的值赋给级别高的变量时,系统自动完成数据类型的转换。,当把级别高的变量的值赋给级别低的变量时,必须使用显示类型转换运算。,显示转换的格式,:,(类型名)要转换的值,;,2.9,简单数据类型的级别与数据转换,当把一个,int,型常量赋值给一个,byte,和,short,型变量时,不可以超出其取值范围,如:,b,yte a=(byte)128,把,double,型常量赋值给,
26、float,型变量时要进行强制转换,如:,float x=2.4,Scanner,是,JDK1.5,新增的一个类,可以使用该类创建一个对象:,注意:使用前要导入:,import,java.util.Scanner,;,Scanner reader=new,Scanner(System.in,);,然后,reader,对象调用下列方法,读取用户在,命令行,(,MS-DOS,窗口),输入的各种基本类型数据,:,nextBoolean();nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),nextDouble,(),。,图,2.9,从命令
27、行输入数据,上述方法执行时都会堵塞,,程序等待用户在命令行输入数据并按,Enter,键确认,。,2.10,从命令行窗口输入、输出数据,例,2-6,import,java.util.Scanner,;,public class Example2_6,public static void,main(String,args,),Rect,rectangle=new,Rect,();,Scanner reader=new,Scanner(System.in,);,System.out.println,(,输入矩形的宽,并回车确认,);,rectangle.width,=,reader.nextDoub
28、le,();,System.out.println,(,输入矩形的高,并回车确认,);,rectangle.height,=,reader.nextDouble,();,double area=,rectangle.getArea,();,System.out.println(rectangle,的面积,:+area);,System.out.println,(),或,System.out.print,(),可输出串值、表达式的值,,二者的区别是前者输出数据后换行,后者不换行,。允许使用并置符号:,“,+,”,将变量、表达式或一个常数值与一个字符串并置一起输出,需要特别注意的是,在使用,Sys
29、tem.out.println,(),或,System.out.print,(),输出字符串常量时,不可以出现回车换行,2.10.2,输出基本型数据,JDK 1.5,新增了和,C,语言中,printf,函数,类似的数据输出方法,该方法使用格式如下:,System.out.printf,(,格式控制部分,,表达式,1,,表达式,2,,,表达式,n),格式控制部分由格式控制符号:,%d,、,%c,、,%f,、,%s,和普通字符组成,普通字符原样输出。格式符号用来输出表达式的值。,%d,:输出,int,类型数据值。,%c,:输出,char,型数据。,%f,:输出浮点型数据,小数部分最多保留,6,位。
30、s,:输出字符串数据。,输出数据时也可以控制数据在命令行的位置,例如:,%,md,:输出的,int,型数据占,m,列。,%,m.nf,:输出的浮点型数据占,m,列,小数点保留,n,位。,遵守一门语言的编程风格是非常重要的,否则编写的代码将难以阅读,给后期的维护带来诸多不便,在编写,Java,程序时,“代码块”有两种流行(也是行业都遵守的习惯)的写法:,Allmans,风格和,Kernighan,风格,本书后续章节的绝大多数代码将采用,Kernighan,风格,2.11,编 程 风 格,Allmans,风格也称“独行”风格,即左、右大括号各自独占一行,如下列代码所示。,class,Allma
31、ns,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.11.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.11.2 Kernighan,风格,给代码增加注释是一个良好的编程习惯,注释的目的是为了便于代码的维护和阅读,,Java,支持两种格式的注释:单行注释和多行注释。,单行注释,使用“,/,”表示单行注释的开始,即该行中从“,/,”开始的后续内容为注释,多行注释,使用“,/*,”表示注释的开始,以“,*,/,”表示注释结束,2.11.3,注释,






