《java基本编程技巧.ppt》由会员分享,可在线阅读,更多相关《java基本编程技巧.ppt(82页珍藏版)》请在三一办公上搜索。
1、JAVA基本编程技巧,主讲老师:,第一章,java 编程基础,Java的基本语法(1),java是严格区分大小写的 java是一种自由格式的语言 java程序有三种注释方式,java中的标识符 java中的包、类、方法、参数和变量的名字,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是关键字。,合法的标识符:indentifierusernameuser_name_userName$username,非法的标识符:class98.3Hello World,Java的基本语法(2),java的关键字,注:java 无sizeof,goto,cons
2、t 关键字,但不能用goto const作为变量名,java中的常量(1),整型常量十进制(12),十六进制(0 x12),八进制(012)长整型常量13L单精度浮点数 5.1f,.4f,2e3f,0f双精度浮点数 5.1,.4,2e-3,0d布尔常量 true和false,java中的常量(2),字符常量 a,8,u0027 r表示接受键盘输入,相当于按下了回车键;n是换行;t是制表符,相当于table键;b是退格键,相当于Back Space;是单引号,而“是双引号;是一个斜杠“”。字符串常量“Hello World“,”123”,Welcome nXXXnull常量 null常量只有一个
3、值,用null表示,表示对象的引用为空,变量的概念与作用,变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。根据所存储的数据类型的不同,有各种不同类型的变量。变量名代表这块内存中的数据。int x=0,y;y=x+3;执行这两条语句的过程中,内存分配及变化情况。X在被取值前必须被初始化。,java的变量类型,数据类型,基本数据类型,引用数据类型,数值型,字符型(char),布尔型(boolean),整数类型(byte,short,int,long),浮点类型(float,double),类(class),接口(interface),数组,变量字节大小及有效取值范围,byte占用一个
4、字节,数字大小为-2727-1short占用两个字节,数字大小为-215215-1 int占用四个字节,数字大小为-231231-1 long占用八个字节,数字大小为-263263-1 float占用四个字节,数字大小为1.4E-453.4E+38,-1.4E-45-3.4E+38。用二进制的指数形式表示一个浮点数的格式,如:101*22,101*2-3double占用八个字节,数字大小为4.9E-3241.7E+308,-4.9E-324-1.7E+308。char占两个字节,数字大小为0216-1,是unicode编码。字符的本来面目,我们为什么可以直接将一个数字赋给字符变量。Boolea
5、n占一个字节,其取值只有两个,true和false。,类型转化,自动类型转换(也叫隐式类型转换)强制类型转换(也叫显式类型转换)类型转换的原理 及什么时候要用 强制类型转换表达式的数据类型自动提升所有的byte型、short型和char的值将被提升到int型。如果一个操作数是long型,计算结果就是long型;如果一个操作数是float型,计算结果就是float型;如果一个操作数是double型,计算结果就是double型。分析 System.out.println(a+1)与 System.out.println(“”+a+1)的区别。,变量的生命周期与作用域,变量要先定义,后使用,但也不是
6、在变量定义后的语句一直都能使用前面定义的变量。我们可以用大括号将多个语句包起来形成一个复合语句,变量只能在定义它的复合语句中使用。public class TestScope public static void main(String args)int x=12;int q=96;/x和q都可用 int x=3;/错误的定义,Java中不允许有这种嵌套定义 System.out.println(x is+x);System.out.println(q is+q);q=x;/*错误的行,只有x可用,q 超出了作用域范围*/System.out.println(x is+x);,函数的重载,函数
7、的重载就是在同一个类中允许同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。如:public class Testpublic static void main(String args)int isum;double fsum;isum=add(3,5);isum=add(3,5,6);fsum=add(3.2,6.5);public static int add(int x,int y)reutrn x+y;public static int add(int x,int y,int z)return x+y+z;public static double add(double x,
8、double y)return x+y;,算术运算符,赋值运算符,比较运算符,逻辑运算符,“”和“”区别的实例分析,public class ShiftTestpublic static void main(String args)int x=0 x80000000;int y=0 x80000000;x=x1;y=y1;System.out.println(“0 x800000001=”+Integer.toHexString(x);System.out.println(“0 x800000001=”+Integer.toHexString(y);运行结果如下:0 x800000001=c0
9、0000000 x800000001=40000000十六进制与二进的对比0 x8000000016=1000,0000,0000,0000,0000,0000,0000,000020 xc000000016=1100,0000,0000,0000,0000,0000,0000,00002 0 x4000000016=0100,0000,0000,0000,0000,0000,0000,00002,运算符的优先级,if语句的选择结构,if(表达式)语句;if(表达式)语句1;else 语句2;if(表达式1)语句1;else if(表达式2)语句2;else if(表达式2)语句3;else
10、语句n;每个语句可以是使用 组成的复合语句变量 布尔表达式?语句1:语句2;If语句还可以嵌套使用if(表达式1)if(表达式2)语句1;else语句2;esle if(表达式2)语句3;else语句4;嵌套时最好使用确定层次界限,举例说明,switch语句的选择结构,Switch(表达式)case 常量表达式1:语句1;case 常量表达式2:语句2;case 常量表达式n:语句n;default:语句n;default语句是可选的,它接受除上面接受值的其他值,通俗的讲,就是谁也不要的都归它。case后面可以跟多个语句,这些语句可以不用大括号括起来。switch语句判断条件可接受int,by
11、te,char,short型,不可以接受其他类型一旦碰到第一次case匹配,就会开始顺序执行以后所有的程序代码,而不管后面的case条件是否匹配,后面case条件下的代码都会被执行,直到碰到break语句为止。我们可以利用这个特点来用同一段语句处理多个case条件,while循环语句,While(表达式)语句;int x=1;while(x3)System.out.println(x=+x);x+;,脚下留心:while表达式的括号后面一定不要加“;”,do-while循环语句,do 语句while(表达式);public class TestDopublic static void main
12、(String args)int x=3;while(x=0)System.out.println(ok1);x+;int y=3;do System.out.println(ok2);y+;while(y=0);,do-while循环语句,编写一个程序,这个程序不断地读取从键盘上输入的字符,直到读到字符q时,程序结束。提示:调用System.in.read();可以读取到一个从键盘上输入字符对应的整数。通过这个程序,你一定能体会到在什么样的情况下,用do-while循环语句比while循环语句方便。,for循环语句,for(表达式1;表达式2;表达式3)语句for(int x=1;x=10)
13、break;System.out.println(x=+x);x+;,break语句,break语句可以中止循环中的子语句和switch语句。一个无标号的break语句会把控制传给当前(最内)循环(while,dofor或Switch)的下一条语句。如果有标号,控制会被传递给当前方法中的带有这一标号的语句。如:st:while(true)while(true)break st;,continue语句,continue语句只能出现在循环语句(while,do,for)的子语句块中,无标号的continue语句的作用是跳过当前循环的剩余语句块,接着执行下一次循环。用continue语句的打印出 0
14、到10之间的所有奇数的程序例子。for(int i=0;i10;i+)if(i%2=0)continue;System.out.println(i);,数组,静态数组int ia=1,2,3,4;int ia=new int3,4,5;int a5;/声明数组时,不能指定其长度,编译时将出错 使用数组时要注意的问题 空指针异常如何得到数组长度 数组越界异常,多维数组,如何理解多维数组,类似我们的棋盘。java 中并没有真正的多维数组,只有数组的数组,Java中多维数组不一定是规则矩阵形式。定义一个多维数组int xx;xx=new int3;xx0=new int3;xx1=new int2;
15、,多维数组,多维数组中元素的引用方式,如:x12。规则矩阵数组可以在一条语句中产生,如:int xx=new int23;多维数组的静态初始化,如:int xx=3,2,7,1,5,6;,与数组操作相关的函数,使用System.arraycopy()函数拷贝数组 用Arrays.sort 来排序数组,第二讲,JAVA面向对象(上),类的定义,class Personint age;void shout()System.out.println(“oh,my god!I am“+age);age是类的属性,也叫类成员变量。shout是方法也叫类的成员函数。shout方法可以直接访问同一个类中的ag
16、e变量,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。,对象的产生,Person p1=new Person();执行完后的内存状态,对象的产生,当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的都是变量类型都是引用类型,如上面的Person及前面讲过的数组。,对象的使用,创建新的对象之后,我们就可以使用“对象名.对象成员”的格式,来访问对象的成员(包括属性和方法)class TestPersonpublic static void main(String args)Person p1=new Perso
17、n();Person p2=new Person();p1.age=-30;p1.shout();p2.shout();上面程序运行的内存布局如下图,对象的生命周期,对象的比较,“=”运算符与equals()方法的区别怎样比较两个数组对象的内容是否相等,匿名对象,我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象,如:new Person().shout();如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。我们经常将匿名对象作为实参传递给一个函数调用。,实现类的封装性,如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高
18、,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。,实现类的封装性,为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。一个类通常就
19、是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。用总统指挥一支军队的例子来说明这种效果。,类的封装所带来的优点,隐藏类的实现细节;让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;便于修改,增强代码的可维护性;,编程试验:我们在一个类中定义了一个private类型的成员变量,接着产生了这个类的两个实例对象,请问第一个对象的方法中,能否以“
20、第二个对象.成员”的格式访问第二个对象中的那个private成员变量?,构造函数的定义与作用,构造方法的特征它具有与类相同的名称;它不含返回值;它不能在方法中用return语句返回一个值注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动调用了。构造方法的作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。这就好像我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人
21、刚出生时一个一个地告诉他们要“洗澡”了。,构造方法的重载,和一般的方法重载一样,重载的构造方法具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new 关键字产生对象时,该调用哪个构造方法了。产生对象的格式是:new 类名(参数列表);重载构造方法可以完成不同初始化的操作,如:p3=new Person(“Tom”,18);语句,会做这样几件事:创建指定类的新实例对象,在堆内存中为实例对象分配内存空间,并调用指定类的构造方法,最后将实例对象的首地址赋值给引用变量p3。,p3=new Person(“Tom”,18)的内存状态变化过程分析,构造方法的一些细节,在java每个类里都至少有
22、一个构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,这个默认构造方法没有参数,在其方法体中也没有任何代码,即什么也不做。由于系统提供的默认构造方法往往不能满足编程者的需求,我们可以自己定义类的构造方法,来满足我们的需要,一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。声明构造方法,如无特殊需要,应使用public关键字,在我们前面例子中,可以使用private访问修饰符吗?,this是什么?,如果func2方法被调用,一定是事先已经有了一个存在的对象,func2被作为那个对象的方法被使用。在func2内部能引用别的对象,同样也能引用fu
23、nc2所属的那个对象。在func2中,自己所属的那个对象的引用名称是什么呢?this关键字在java程序里的作用和它的词义很接近,它在函数内部就是这个函数所属的对象的引用变量。,this引用句柄的存放位置,每个成员方法内部,都有一个this引用变量,指向调用这个方法的对象,类中的成员方法与this之间的关系如图,this引用句柄的应用,一个类中的成员方法可以直接调用同类中的其他成员,其实我们在一个方法内部使用“this.其他成员”的引用方式和直接使用“其他成员”的效果是一样的,那this还有多大的作用呢?在有些情况下,我们还是非得用this关键字不可的:让类的成员变量名和对其进行赋值的成员方法
24、的形参变量同名是必要的,这样的代码谁看了都能明白这两个变量是彼此相关的,老手看到函数的定义,就能揣摩出函数中的代码,大大节省了别人和自己日后阅读程序的时间。假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。构造方法是在产生对象时被java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。,垃圾回收过程分析,c+中的析构方法 java中的finalize()方法
25、System.gc的作用,函数的参数传递基本数据类型的参数传递,函数的参数传递引用数据类型的参数传递,函数的参数传递引用参数传递的一个问题分析,static静态变量,当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。编写使用静态变量统计一个类产生的
26、实例对象的个数的程序,static静态方法,在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。静态方法不能以任何方式引用this和super关键字(super关键字在下一章讲解)。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。main()方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员
27、,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。,静态代码块,一个类中可以使用不包含在任何方法体中的静态代码块(static block),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。,单态设计模式,设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设
28、计模式就想是经典的棋谱,不同的棋局,我们用不同的棋谱,免得我们自己再去思考和摸索。失败为成功之母,但是要以大量的时间和精力为代价,如果有成功经验可借鉴,没有人再愿意去甘冒失败的风险,我们没有理由不去了解和掌握设计模式,这也是Java开发者提高自身素质的一个很好选择。使用设计模式也许会制约你去创新,不过真正有意义的创新只能出自少数天才,即使你就是那个天才,虽不必因循守旧,但也不可能完全不去了解和借鉴前人的成功经验。,单态设计模式,所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产
29、生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。,理解main方法的语法,由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行j
30、ava命令时传递给所运行的类的参数。,内部类在类中直接定义的内部类,嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。,内部类在类中直接定义的内部类,如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封
31、装类的非static的成员变量,这个道理不难想象!所以static嵌套类很少使用。,内部类 在类中直接定义的内部类,如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。public class Outer private int size;public class Inner private int size;public void doStuff(int size)size+;/引用的是doStuff函数的形参 this.size+;/引用的是Inner类中的成员变量 Outer.this.
32、size+;/引用的Outer类中的成员变量,内部类如何被外部引用,class Outer private int size=10;public class Inner public void doStuff()System.out.println(+size);public class TestInner public static void main(String args)Outer outer=new Outer();Outer.Inner inner=outer.new Inner();inner.doStuff();,内部类在方法中定义的内部类,嵌套类并非只能在类里定义,也可以在几
33、个程序块的范围之内定义内部类。例如,在方法中,或甚至在for循环体内部,都可以定义嵌套类。在方法中定义的内部类只能访问方法中的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。,使用Java的文档注释,import java.io.*;/*Title:engineer类*Description:通过engineer类来说明java中的文档注释*Copyright:(c)2003*Company:锐智科技咨询中心*author 张孝祥*version 1.00*/public class engineerpublic String Engi
34、neer_name;/*这是engineer对象的构造函数*param name engineer的名字*/public engineer(String name)/*这是repairing方法的说明*param sum 需要修理的机器总数*param alltime 需要修理的总时间*return Repairing的数量*/public int repairing(int sum,int alltime),使用Java的文档注释,文档注释以“/*”开始,以“*/”标志结束,相应的信息和批注所对应的位置很重要!类的说明应在类定义之前,方法的说明应在方法的定义之前。批注参数来标记一些特殊的属性
35、及其相应的说明。authorversionparam return,第四讲,面向对象(下),类的继承,通过继承可以简化类的定义。Java只支持单继承,不允许多重继承。可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表)调用父类的构造方法。如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。,子类对象的实例化过程,分配成员变
36、量的存储空间并进行默认的初始化,就是用new关键字产生对象后,对类中的成员变量按第三章的表3.1中的对应关系对对象中的成员变量进行初始化赋值。绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方法中的形式参数变量。如有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程),被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳转到步骤6执行显式或隐式追溯调用父类的构造方法(一直到Object类为止,Object是所有Java类的最顶层父类,在本章后面部分有详细讲解),父类的构造方法又从步骤2开始对父类执
37、行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继续往下执行。进行实例变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句,如:执行当前构造方法的方法体中的程序代码,子类对象的实例化过程,思考:1).为什么super()和this()调用语句不能同时在一个构造函数中出现?2).为什么super()或this()调用语句只能作为构造函数中的第一句出现?,覆盖父类的方法,覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。如果在子类中想调用父类中的那个被覆盖的方法,我们可以用super.方法的格式。覆盖方法时,不能使用比父类中被覆盖的方法更严
38、格的访问权限。,final关键字,在Java中声明类、属性和方法时,可使用关键字final来修饰。final标记的类不能被继承。final标记的方法不能被子类重写。final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。public static final共同标记常量时,这个常量就成了全局的常量。,抽象类,java中可以定义一些不含方法体的方法,它的方法体的实现交
39、给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰。抽象类不能被实例化,也就是不能用new关键字去产生对象。抽象方法只需声明,而不需实现。含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。,接口(interface),如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也就是接口定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而
40、没有变量和方法的实现。接口中的成员都是public访问类型的。接口里的变量默认是用public static final标识的。我们可以定义一个新的接口用extends关键字去继承一个已有的接口 我们也可以定义一个类用implements关键字去实现一个接口中的所有方法,我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法。一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implemnets关键字之前。,对象的类型转换,子类对象可以自动转换成父类 父类转换成子类必须使用强制转换。instanceof 操作符可以用它来判断一个实例对象
41、是否属于一个类。Object类及equals方法,面向对象的多态性,1).应用程序不必为每一个派生类(子类)编写功能调用,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。2).派生类的功能可以被基类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被后来程序调用不足为奇,现在写的程序(如callA方法)能调用以后写的程序(以后编写的一个类A的子类,如类D)就了不起了。,匿名内部类,abstract class Aabstract public void fun1();class Outerpublic static void m
42、ain(String args)new Outer().callInner(new A()public void fun1()System.out.println(implement for fun1););public void callInner(A a)a.fun1();,异常,异常定义了程序中遇到的非致命的错误,而不是编译时的语法错误,如程序要打开一个不存的文件、网络连接中断、操作数越界、装载一个不存在的类等。try,catch语句 throws关键字 自定义异常与Throw关键字 如何对多个异常作出处理 我们可以在一个方法中使用throw,trycatch语句来实现程序的跳转 一个方
43、法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类。如果父类扔出多个异常,那么重写(覆盖)方法必须扔出那些异常的一个子集,也就是说不能扔出新的异常。,包,package语句及应用package语句作为Java源文件的第一条语句。如果没有package语句,则为缺省无名包。import语句及应用 jdk中常用的包java.lang-包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。java.awt-包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(
44、GUI)。java.applet-包含applet运行所需的一些类。-包含执行与网络相关的操作的类。java.io-包含能提供多种输入/输出功能的类。java.util-包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。,访问控制,类本身也有访问控制,即在定义类的class关键字前加上访问控制符,但类本身只有两种访问控制,即public 和默认,父类不能是private 和 protected,否则子类无法继承。public修饰的类能被所有的类访问,默认修饰(即class关键字前没有访问控制符)的类,只能被同一包中的所有类访问。,java的命名习惯,下面是java中的一些命名习惯,假设xxx,yyy,zzz分别是一个英文单词的拼写。包名中的字母一律小写,如:xxxyyyzzz。类名、接口名应当使用名词,每个单词的首字母大写,如:XxxYyyZzz。方法名,第一个单词小写,后面每个单词的首字母大写,如:xxxYyyZzz。变量名,第一个单词小写,后面每个单词的首字母大写,如:xxxYyyZzz。常量名中的每个字母一律大写,如:XXXYYYZZZ。,