资源描述
课时一Java开发环境和程序设计初步2012-2-27讲授:夏冰冰Phone:13583118912E-mail:jennifer_办公室:实验楼4211主要内容1.1Java语言发展历史1.2Java语言的特点1.3Java的工作原理1.4Java运行环境JDK1.5构建Java程序1.6开发工具21.人物JamesGosling-Java之父-戴着眼睛的蜘蛛-Sun副总裁BillJoy-Sun创始人之一-软件业的爱迪生-2003年离开Sun32.关键词v绿色计划Greenv与平台无关vJava最初的名字:橡树Oakv一杯飘香的咖啡Javav网络与Java现在请观看java+you4Sun(StanfordUniversityNetwork)原硅谷总部图片现成为Facebook总部5Sun原硅谷总部图片6Sun原硅谷总部图片7Sun原硅谷总部图片8Sun原硅谷总部图片9Sun公司创立之初就提出:TheNetworkistheComputer网络就是计算机。10Sun董事会主席:ScottMcNealySunCEO(任期1982-2006)11ScottMcNealy12Sun公司CEO:JoanthanSchwartz2006-2010任职13JoanthanSchwartz14Sun和Oracle介绍15Sun和Oracle2009.4Oracle提出74亿美元收购Sun2010.1欧盟批准Oracle收购Sun 16Sun沉浮史http:/ ApplicationJava AppletServlets(JSP)Java APIWeb Server字节码字节码BytecodesJava Virtual Machine(JVM)Hardware Platform29Java虚拟机v软件模拟的计算机v执行字节码文件(*.class)v不同的软硬件平台需要对Java虚拟机做专门的实现30Java程序执行过程131Java程序执行过程232Java程序执行过程2331.4Java运行环境JDKvJDK:Java开发工具包JavaDevelopmentKit面向开发人员vJRE:Java运行时环境JavaRuntimeEnvironment面向Java程序的使用者34第一步:http:/ Developing Environment),IBM公司,开源。目前主要用作Java IDE。vMyEclipseGenuitec公司,Eclipse的插件,不免费。4647第2章Java程序设计基础482.1.1标识符与关键字vJava的符号集采用Unicode字符集一个字符占两个字节,共有65535个字符,包含中文、英文、日文、朝鲜文及其他语言的文字49标识符v为变量、类或方法等起的一个名称v以字母、下划线或$符号开头v由字母、下划线、$符号和数字组成v区分大小写,没有最大长度限制,不能使用关键字(见附录B)v示例:identifier、userName、user_name、_sys_varl、$change、程序名50下列标识符哪些是合法的?123、_name、class、1first_cat、5books、+static、-3.14159512.1.2基本数据类型Java编程语言定义了8种基本数据类型v整数byte、short、int和longv浮点double和floatv布尔booleanv字符char52(1)整数类型byte(8位)、short(16位)、int(32位)和long(64位)v三种形式使用十进制、八进制或十六进制2十进制整数2077以0开头表示八进制值0 xBAAC以0 x开头表示十六进制值v默认是int类型v使用字母L或l定义long类型53补充例1publicclassIntTestpublicstaticvoidmain(Stringargsp)byteb1=0 x12;byteb2=0 x123;shorts1=0 x1234;shorts2=0 x12345;inti1=0 x12345678;inti2=0 x123456789;inti3=0 x123456789L;思考:编译时会出现怎样的结果?54补充例1说明v第一遍编译时,语句inti2=0 x123456789;提示“过大的整数”错误,把该语句加注释或删除后,进行第二遍编译,对于语句byteb2=0 x123;shorts2=0 x12345;inti3=0 x123456789L;都出现了错误提示“可能损失精度”。55(2)浮点类型float(32位)和double(64位)v浮点数包括:E或e(加指数值)科学计数法形式F或f(float)D或d(double)如:3.14一个简单的浮点值(一个double类型)6.02E23一个大浮点值2.718F一个简单的float值123.4E+306D一个带有D(多余)的大的double值v默认类型是double56(3)布尔类型booleanvboolean数据类型有两个值:true和falsev例如:语句booleantruth=true;声明变量truth为boolean类型,并将其赋值为true。p注意:不能写为booleantruth=1;57(4)字符类型char与Stringcharv代表16位的Unicode字符v字符必须在单引号()内v使用:a字母at制表符u?特定的Unicode字符,?代表四位十六进制数58(4)字符类型char与Stringcharch=A;/声明并初始化一个char变量charch1,ch2;/声明两个char变量59补充例2publicclassCharTestpublicstaticvoidmain(Stringargsp)charch1=A;charch2=u0041;charch3=0X41;charch4=65;intx=A;System.out.println(ch1);System.out.println(ch2);System.out.println(ch3);System.out.println(ch4);System.out.println(x);思考:字符常量的不同表示方式。60(4)字符类型char与StringStringv不是基本数据类型,而是一个类v字符在双引号(“”)内“Hello,World!”v使用如下:Stringstr1,str2;/声明两个String变量Stringgreeting=“GoodMorning!n”;StringerrorMessage=“RecordNotFound!”;/声明两个String变量并且初始化它们61补充例3publicclassAssignpublicstaticvoidmain(Stringargs)intx,y;floatz=3.414f;doublew=3.1415;booleantruth=true;charc;Stringstr;Stringstr1=“bye”;c=A;str=“Hioutthere!”;x=6;y=1000;y=3.1415926;w=175,000;truth=1;z=3.14156;为什么不合法622.1.3变量变量:v声明变量必须在类的定义内,可以在方法内或者方法外v在方法内定义的变量称为局部变量,需要显式的对其初始化v成员变量和类变量自动初始化l数字型初始值为0l对象型初始值为null632.1.3常量常量:在程序运行中其值保持不变的量。v文字常量:在程序中直接写出量值的常量,如:37,2.1,true等。v符号常量:用标识符代表的常量,如:finalintx=100;64补充:基本数据类型间的转换v一般形式:(类型)(表达式)v作用:将表达式的结果强制转换为另一种类型v低存储位可以自动转换为高存储位数据类型v高存储位则必须通过强制类型转换才能转换为低存储位数据类型65补充例4publicclassIntToLongpublicstaticvoidmain(Stringargsp)intx=5;longy,z;y=10L;z=x+y;System.out.println(x);System.out.println(y);System.out.println(z);66补充例5publicclassLongToIntpublicstaticvoidmain(Stringargsp)intx;longy,z;y=10L;z=20L;x=y+z;/可改为x=(int)(y+z);System.out.println(x);System.out.println(y);System.out.println(z);674.3.4封装类(Wrapper类)基本数据类型基本数据类型Wrapper类类booleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDouble68Wrapper类v通过将值传递给相应的构造器,可以构建Wrapper类对象v例如:intpInt=500;IntegerwInt=newInteger(pInt);intp2=wInt.intValue();69Wrapper类v当转换基本数据类型时Wrapper类很有用,因为可以使用很多Wrapper类方法(查API)。v例如:Stringstr=“365”;intx=Integer.parseInt(str);或intx=Integer.valueOf(str).intValue();702.1.4运算符与表达式(与C和C+重复的不再介绍,请大家自学)711.逻辑运算符u逻辑运算符是!一元逻辑非&二元逻辑与二元逻辑异或|二元逻辑或u短路逻辑运算符是&二元条件逻辑与|二元条件逻辑或72逻辑运算符0值不能自动解释为false,非0值不能自动解释为true。如:inti=1;if(i)/generatesacompileerrorif(i!=0)/correct73逻辑运算符短路逻辑操作符MyDated;if(d!=null)&(d.day31)/dosomethingwithd当第一个子表达式(d!=null)为假时,第二个子表达式就被跳过,全部表达式总是假的。同样,使用|操作符,如果第一个表达式返回为真,则不必计算第二个表达式,因为整个表达式必定为真。742.字符串连接运算符+操作符v执行String连接v产生新的Stringv一个参数必须是String对象v非字符串对象会自动转换为String对象,如要转换为等价的字符串时,使用toString()成员方法75字符串运算符Stringfirst=“James”,last=“Gosling”;Stringname=first+last;结果:name的值是JamesGosling763.点运算符v“点”符号:.v用于访问对象成员,包括属性和方法。77说明v点的操作可使您访问类的非私有属性和方法v在方法的定义内,访问本地成员不需要使用点符号784.对象运算符vAinstanceofBv用来判定对象A是否为类B的对象79上机作业(上机调试完后写在作业本上)1.设定一个变量代表月份,根据变量值输出该月份代表的季节(春季、夏季、秋季、冬季)。提示:使用switch语句2.比较两个数的大小,按照从小到大的顺序输出。3.输出1050之间所有能被3整除的数。选做题:67页17题80补充:输入输出语句介绍importjavax.swing.*;publicclassiow1publicstaticvoidmain(Stringargs)Stringinput;intresult;input=JOptionPane.showInputDialog(“请输入年龄”);/接收输入result=Integer.parseInt(input);/类型转换JOptionPane.showMessageDialog(null,result);/输出812.3数组822.3.1一维数组831.一维数组的声明u数组一般用来组合相同类型的对象。u数组允许通过公共的名称来引用该组对象。u数组声明创建一个引用,用它可以引用一个数组。84声明格式1)变量名后加方括号,如:intx;Stringx;2)类型后加方括号,如:intx;Stringx;声明不指定数组的实际大小。85数组的类型u声明基本类型数组:chars;chars;u声明类类型数组:Pointp;/Point是java.awt中的一个类Pointp;862、使用new为数组分配空间v使用new关键字创建数组。v数组的创建是为数组指定元素的个数,并为数组的元素分配存储空间。87创建基本类型数组例如,创建一个基本(char)类型数组:publiccharcreateArray()chars;s=newchar26;for(inti=0;i26;i+)si=(char)(A+i);returns;s1fb8ee3ABCDE88创建基本类型数组例如,创建一个基本(char)类型数组:publiccharcreateArray()chars=newchar26;for(inti=0;i26;i+)si=(char)(A+i);returns;89创建对象数组另一示例,创建一个对象数组:publicPointcreateArray()Pointp;p=newPoint10;for(inti=0;i10;i+)pi=newPoint(i,i+1);returnp;90创建对象数组另一示例,创建一个对象数组:publicPointcreateArray()Pointp=newPoint10;for(inti=0;i10;i+)pi=newPoint(i,i+1);returnp;91point数组示意图Point.PointXY01PointXY12PointXY23堆内存p栈内存61de33923、初始化数组整型数组写法一(动态初始化):intintArray;intArray=newint5;此时数组元素均为默认值0,可以逐个赋值:intArray0=1;intArray1=2;intArray2=3;933、初始化数组整型数组写法二(静态初始化):intintArray=newint1,2,3;或intintArray=1,2,3;省略了指定数组大小,此时数组的大小由大括号中值的个数决定,这种方式需指定数组中各个元素的值。943、初始化数组对象数组写法一(动态初始化):PointPArray;PArray=newPoint3;此时数组元素的值为默认值null,可逐个赋值:PArray0=newPoint(0,1);PArray1=newPoint(1,2);PArray2=newPoint(2,3);953、初始化数组对象数组写法二(静态初始化):PointPArray=newPointnewPoint(0,1),newPoint(1,2),newPoint(2,3);或PointPArray=newPoint(0,1),newPoint(1,2),newPoint(2,3);96初始化数组字符串数组写法一(动态初始化):Stringnames;names=newString3;逐个赋值:names0=“How”;names1=“are”;names2=“you”;97初始化数组字符串数组写法一(动态初始化):Stringnames;names=newString3;names0=newString(“How”);names1=newString(“are”);names2=newString(“you”);98初始化数组字符串数组写法二(静态初始化):1.Stringnames=newString“How”,”are”,”you”;2.Stringnames=“How”,”are”,”you”;3.Stringnames=newString(“How”),newString(“are”),newString(“you”);994.一维数组的重定义在程序中可以改变数组的大小,即重新定义数组。即为数组分配新的内存空间。(想想为什么?)如:intv_array=newint10;v_array=newint50;v_array=newint6;1005、数组长度lengthv在Java编程语言中,所有数组的索引均从0开始。v数组的元素数作为数组对象的一部分存储在length属性中。v如果发生边界溢出访问,那么就将引发运行时异常。1015、数组长度length使用length属性对数组作如下循环:intlist=1,2,3;for(inti=0;ilist.length;i+)System.out.println(listi);102上机作业1v将一个数字与数组中的元素比较,v如果该数字存在数组中,给出该数字在数组中的位置;v如果该数字不在数组中,给出提示。1036.1.2二维数组1041.二维数组的声明与定义声明:数据类型数组名;或数据类型数组名;或数据类型数组名;定义:数组名=new数据类型行数列数;105举例inttwoDim=newint45;或inttwoDim=newint4;twoDim0=newint5;twoDim1=newint5;错误的写法:inttwoDim=newint4;原因:省略行数不合法106举例矩阵数组u矩阵数组:inty=newint23;u内存分布图:107测试程序class array21 public static void main(String args)int y;y=new int23;System.out.println(y=+y);System.out.println(y0+y0);System.out.println(y1=+y1);System.out.println(y.length=+y.length);System.out.println(y0.length=+y0.length);System.out.println(y1.length=+y1.length);108举例非矩阵数组v非矩阵数组:inttwoDim=newint4;twoDim0=newint2;twoDim1=newint4;twoDim2=newint6;twoDim3=newint8;109非矩阵数组的内存分布图1102.初始化(1)二维整型数组intaVar=newint1,2,3,4,5,6;或intaVar=1,2,3,4,5,6;或inta=newint2;a0=newint1,2;a1=newint2,3;111错误的写法inta=newint2;a0=1,2;a1=2,3;112(2)字符串数组Strings=newString2;s0=newString2;s1=newString2;s00=good;s01=luck;s10=to;s11=you;113字符串数组String s=new String2;s0=new Stringgood,luck;s1=new Stringto,you;114错误的写法Strings=newString2;s0=good,luck;s1=to,you;1153.二维数组的访问 int a=1,2,3,3,4,5,6;for(int i=0;ia.length;i+)for(int j=0;jai.length;j+)System.out.println(aij);116上机作业2利用二维非矩阵数组输出下面的数字0122343456117上机作业3v编程求一个整数数组的最大值、最小值、平均值和所有元素的和。118第3章Java面向对象编程类和对象1193.1.1类1.类的定义Java类的基本语法:class可以是任何合法的标识符,并且是所声明类的名字。有几种可使用的,但现在只使用public,声明类可被任意访问。类的正文声明了与类相关的数据属性、构造器和方法的集合。120补充例1例1:定义一个人类,描述人类的姓名、年龄、身高、体重,定义一个方法用来检验人的体重是否在正常范围之内,定义一个方法用于得到是否肥胖的结论。121计算标准1222.成员变量v变量声明的一般格式:;v例如:privateintx;可以是任何合法的标识符,它是所声明属性的名字。有几种可用的,但现在只使用public或private。private声明该属性只能由该类的方法访问。属性的可以是任何基本类型(int,boolean等)或任何类。1233.声明方法方法的基本语法:()可以是任何合法的标识符,但限制使用那些已经在使用的名称。是可选项,并可有很多不同的修饰符,包括public、protected和private等。public访问修饰符表明可从其他代码调用该方法。private表明方法只能在由该类中其他方法调用。124Person类的成员变量的定义classPersonprivateStringname=null;privateintage=0;privatedoubleheight=0;privatedoubleweight=0;125Person类的方法的定义publicdoubleBmivalue()returnheight/(weight*weight);publicdoubleStdWeight()return22*height*height;publicdoubleObesityDegree()return(weight-StdWeight()/StdWeight()*100;126Person类的方法的定义publicStringConclusion()if(ObesityDegree()-10)return瘦;elseif(ObesityDegree()20)if(Bmivalue()24.2)return普通;elsereturn超重;elsereturn肥胖;127Person类的构造函数的定义publicPerson(Stringname,intage,doubleheight,doubleweight)this.name=name;this.age=age;this.height=height;this.weight=weight;1283.2.1构造函数1291.声明构造函数构造函数的基本语法:()1302.构造函数特点v构造函数作用:完成类对象的初始化工作v构造函数的名称必须与类名相同v构造器没有返回值并且不可被继承v一般将构造函数的修饰符声明为publicv构造函数中不能有return语句1313.构造函数参数l参数表与方法声明中的一样。可以象方法一样向构造函数传递参数。l构造函数可以有0个、1个或者多个参数。132(1)无参数的构造函数p没有构造函数使用默认的构造函数(没有参数,没有方法体)p如果使用没有参数的构造函数,则创建的对象具有相同的初始值133修改补充例1classPersonprivateStringname=model;privateintage=20;privatedoubleheight=1.7;privatedoubleweight=60;publicPerson()显式初始化在执行构造函数方法体之前执行134继续修改补充例1classPersonprivateStringname=model;privateintage=20;privatedoubleheight=1.7;privatedoubleweight=60;publicPerson()this.name=jack;this.age=30;this.height=1.8;this.weight=80;135(2)带参数的构造函数classPersonprivateStringname=model;privateintage=20;privatedoubleheight=1.7;privatedoubleweight=60;publicPerson(Stringname,intage,doubleheight,doubleweight)this.name=name;this.age=age;this.height=height;this.weight=weight;this:代表当前对象1364.构造函数的重载一个类可以有多个构造函数,叫做构造函数的重载。条件(满足其一)p参数的个数不同p参数的类型不同137修改补充例1 publicPerson(Stringname,intage,doubleheight,doubleweight)this.name=name;this.age=age;this.height=height;this.weight=weight;publicPerson(Stringname,intage)this.name=name;this.age=age;this.height=1.7;this.weight=70;publicPerson(Stringname)this.name=name;this.age=25;this.height=1.5;this.weight=50;138另一种写法构造函数的相互调用publicPerson(Stringname,intage,doubleheight,doubleweight)this.name=name;this.age=age;this.height=height;this.weight=weight;publicPerson(Stringname,intage)this(name,age,1.7,70);publicPerson(Stringname)this(name,25,1.5,50);1395.构造函数的使用u不能由编程人员显式调用。u在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。u构造函数只能和new运算符一起使用。140格式类名对象名=new构造函数名称(成员变量的初始值)1416.默认构造函数v每个类至少有一个构造函数。v如果不编写构造函数,则自动添加默认构造函数:p默认构造函数不带参数p默认构造函数函数体为空v不必编写构造函数就能使用newXxx()创建对象实例142找错误?classPersonprivateStringname=model;privateintage=20;privatedoubleheight=1.7;privatedoubleweight=60;publicPerson(Stringname,intage,doubleheight,doubleweight)this.name=name;this.age=age;this.height=height;this.weight=weight;classtestpublicstaticvoidmain(Stringargs)Personp1=newPerson();Personp2=newPerson(“jerry”,20,1.9,100);哪个语句有错?为什么?143上机作业调试完后写在作业本上105页2(5)(7)1443.1.2对象(类的实例化)145补充练习:SameCircle类表示一个圆classSameCirclepublicintnOrignX;publicintnOrignY;publicintnRadius;publicSameCircle(intnOrignX,intnOrignY,intnRadius)this.nOrignX=nOrignX;this.nOrignY=nOrignY;this.nRadius=nRadius;1461.对象的生成(1)对象的声明格式:;如:SameCirclec1,c2;c1和c2是两个空对象。c1c2147(2)创建对象格式:=new(实参);如:c1=newSameCircle(3,4,5);c2=newSameCircle(6,7,8);345678c1c2对象c1的首地址对象c2的首地址1482.对象的引用SameCirclec1=newSameCircle(3,4,5);SameCirclec2=c1;345c1对象c1的首地址c2对象c1的首地址c2是c1的引用,是c1的首地址1493.2.5对象的清除v对象为null时,由Java的自动垃圾收集机制清除对象,释放对象占用内存v手动编写finalize()方法撤销对象不提倡使用150补充知识:对象的内存模型v栈内存:在方法中定义的变量(基本类型和引用类型)。超过变量的作用域时,自动释放变量的内存v堆内存:new创建的对象(包括数组),由Java的自动垃圾收集机制来清除151示例(1)声明对象Personp;未初始化地址p栈内存堆内存152示例(2)创建对象p=newPerson();未初始化地址p栈内存堆内存null00.00.0nameageweightheight0 x30000 x3000153注意二者的区别v栈stack连续的内存区域,大小固定,编译时确定所需空间大小,效率高v堆heap不连续的内存区域,运行时确定所需空间大小(支持面向对象的多态性,如:运行时才能确定是哪个类的对象),效率低,但灵活1543.2.4静态变量155补充实例publicclassPersonprivateintperson_No;publicstaticintnextperson_No=1000;publicPerson()person_No=+nextperson_No;156补充实例classTestpublicstaticvoidmain(Stringargs)Personc1=newPerson();Personc2=newPerson();157补充实例publicclassPersonprivateintperson_No;publicstaticintnextperson_No=1000;publicPerson()person_No=+nextperson_No;publicintgetPerson_No()returnperson_No;158补充实例classTestpublicstaticvoidmain(Stringargs)Personc1=newPerson();Personc2=newPerson();System.out.println(“c1:nextperson_No”);System.out.println(c1.nextperson_No);System.out.println(“c1:person_No”);System.out.println(c1.getPerson_No();159Person+nextperson_No:int=1000-person_No:intc1:Clerkperson_No=1001c2:Clerkperson_No=1002实例实例在这个示例中,为创建的每个对象分配了一个唯一的序列号,从1000开始向上递增。变量nextperson_No在所有实例间共享,因此当一个对象的构造器增加nextperson_No的值时,下一个创建的对象就可接收到这个增加的值。160类属性说明v使用static来标记的变量是共享于类的所有实例的变量。v例如:可以使用该变量作为实例间通信的基础,或者跟踪已创建的实例数。v如果static变量未被标记为private,那么可从类外访问它。这样,不需要类的实例,就可通过类名引用它。publicclassOtherClasspublicvoidincrementNumber()Person.nextperson_No+;161类属性的使用vAPI中:如Math.PI(不用创建Math类的对象就可以使用PI这个类属性)v作为全局变量,即只想用一个存储区域来保存特定的数据。无论创建多少个对象,甚至不创建对象都可以使用。v思考:1.银行卡的年费2.排队机162银行卡举例publicclassBankCardprivateStringCardNO;/卡号publicstaticdoubleannual_fee;/年费163补充实例 classPersonprivateintperson_No;privatedoubleperson_salary;publicstaticintnextperson_No=1000;publicstaticdoubleperson_lowsalary=280;/最低工资publicPerson(doublesalary)person_No=+nextperson_No;person_salary=person_lowsalary+salary;publicintgetPerson_No()returnperson_No;1642.4static方法165类方法示例 classPersonprivateintperson_No;publicstaticintnextperson_No=1000;publicPerson()person_No=+nextperson_No;publicintgetPerson_No()returnperson_No;publicstaticintgetNextperson_No()returnnextperson_No;166使用类名访问静态方法publicclassTestpublicstaticvoidmain(Stringargs)System.out.println(“Numberofpersonis”+Person.getNextperson_No();Personc1=newPerson();System.out.println(“Numberofpersonis”+Person.getNextperson_No();167static方法说明vmain()方法是static方法,因为执行main方法时,JVM并不创建类的实例。因此如果有成员数据,必须创建对象来访问它。v如:Math类的运算方法都定义为static,可以直接通过Math.方法名()来访问。168static方法说明v除了局部变量、static属性及其参数外,static方法不能访问任何变量。v如果试图访问非static属性会引起编译器错误。v非static属性绑定到一个实例上并且只有通过实例引用才能访问。169错误的例子 classPersonprivateintperson_No;publicstaticintnextperson_No=1000;publicPerson()person_No=+nextperson_No;publicintgetPerson_No()returnperson_No;publicstaticintgetNextperson_No()returnperson_No;/编译错误170判断哪些语句错误?classTeststaticintnum;intc;publicstaticvoidmain(Stringargs)num=100;c=100;staticvoidss()num=100;c=100;voidtt()num=100;c=100;171正确的写法classTeststaticintnum;intc;publicstaticvoidmain(Stringargs)num=100;Testt=newTest();t.c=100;172分析该例,找出错在哪儿?classInstanceTestintVariable;staticpublicintmethod()returnVariable;staticpublicvoidmethod2(intvariable)this.Variable=variable;173补充:静态初始化器174静态初始化v一个类可以在“静态块”中(而非方法体内)包含代码v静态块代码仅在加载类时执行一次v如果类中包含多个静态块,它们将被按照在类中出现的顺序执行175示例1classCountpub
展开阅读全文