SUNJAVA 培训专用教材C06.docx
《SUNJAVA 培训专用教材C06.docx》由会员分享,可在线阅读,更多相关《SUNJAVA 培训专用教材C06.docx(32页珍藏版)》请在冰豆网上搜索。
SUNJAVA培训专用教材C06
第六章高级语言特征
本模块讨论Java编程语言更多的面向对象特征。
第一节相关问题
讨论-下述问题与本模块中出现的材料相关:
-如何保持一个类或方法不被分成子类或被覆盖?
-如何将数组概念的使用扩展到对象?
第二节目的
完成本模块的学习后,应该能
-描述static变量,方法和初始程序
-描述final类,方法和变量
-列出访问控制级别
-确认降级类并解释如何从JDK1.0升迁到JDK1.1到JDK1.2
-描述如何应用收集和反射
-在Java软件程序中,确认
-static方法和变量
-public,private,protected和缺省变量
-使用abstract类和方法
-解释如何以及何时使用内部类
-解释如何以及何时使用接口
-描述==和equals()之间的不同
第三节类(static)变量
类(static)变量
在所有类的实例中共享
可以被标记为public或private
如果被标记为public而没有该类的实例,可以从该类的外部访问
publicclassCount{
privateintserialNumber;
privatestaticintcounter=0;
publicCount(){
counter++;
serialNumber=counter;
}
}
有时想有一个可以在类的所有实例中共享的变量。
比如,这可以用作实例之间交流的基础或追踪已经创建的实例的数量。
可以用关键字static来标记变量的办法获得这个效果。
这样的变量有时被叫做classvariable,以便与不共享的成员或实例变量区分开来。
publicclassCount{
privateintserialNumber;
privatestaticintcounter=0;
publicCount(){
counter++;
serialNumber=counter;
}
}
在这个例子中,被创建的每个对象被赋于一个独特的序号,从1开始并继续往上。
变量counter在所有实例中共享,所以,当一个对象的构造函数增加counter时,被创建的下一个对象接受增加过的值。
Static变量在某种程度上与其它语言中的全局变量相似。
Java编程语言没有这样的全局语言,但static变量是可以从类的任何实例访问的单个变量。
如果static变量没有被标记成private,它可能会被从该类的外部进行访问。
要这样做,不需要类的实例,可以通过类名指向它。
publicclassStaticVar{
publicstaticintnumber;
}
publicclassOtherClass[
publicvoidmethod(){
intx=StaticVar.number;
}
}
第四节类(static)方法
类(static)方法
没有它所属的类的任何实例,static方法可以被调用
publicclassGeneralFunction{
publicstaticintaddUp(intx,inty){
returnx+y;
}
}
publicclassUseGeneral{
publicvoidmethod(){
inta=9;
intb=10;
intc=GeneralFunction.addUp(a,b);
System.out.println("addUp()gives"+c);
}
}
当没有一个特殊对象变量的实例的时候,有时需要访问程序代码。
用关键字static标记的方法可以这样使用,有时被称做classmethod。
static方法可以用类名而不是引用来访问,如:
publicclassGeneralFunction{
publicstaticintaddUp(intx,inty){
returnx+y;
}
}
publicclassUseGeneral{
publicvoidmethod(){
inta=9;
intb=10;
intc=GeneralFunction.addUp(a,b);
System.out.println("addUp()gives"+c);
}
}
因为static方法不需它所属的类的任何实例就会被调用,因此没有this值。
结果是,static方法不能访问与它本身的参数以及static变量分离的任何变量。
访问非静态变量的尝试会引起编译错误。
注-非静态变量只限于实例,并只能通过实例引用被访问。
publicclassWrong{
intx;
publicstaticvoidmain(Stringargs[]){
x=9;//COMPILERERROR!
}
}
Importpointstorememberaboutstaticmethods:
Main()是静态的,因为它必须在任何实例化发生前被顺序地访问,以便应用程序的运行。
静态方法不能被覆盖成非静态。
第五节静态初始化程序
静态初始化程序
在staticblock中,类可以包含方法程序中不存在的代码。
当类被装载时,静态代码块只执行一次。
方法程序体中不存在的代码在staticblock中类可以包含该代码,这是完全有效的。
当类被装载时,静态块代码只执行一次。
类中不同的静态块按它们在类中出现的顺序被执行。
publicclassStaticInitDemo{
staticinti=5;
static{
System.out.println("Staticcodei="+i++);
}
}
publicclassTest{
publicstaticvoidmain(Stringargs[]){
System.out.println("Maincode:
i="
+StaticInitDemo.i);
}
}
将打印出:
Staticcode:
i=5
Maincode:
i=6
Static方法和数据
第六节一个完整的例子
1.classMyClass{
2.staticintstatInt=4;
3.staticDoublestatDouble=16.0;
4.intinstInt;
5.doubleinstDouble;
6.
7.publicstaticvoidstatMethod(){
8.System.out.println("statInt="+statInt+
9.";statdouble="+statDouble);
10.}
11.publicstaticvoidinstMethod(){
12.System.out.println("instInt="+instInt+
13.";instdouble="+instDouble);
14.}
15.publicMyClass(intintArg,doubledoubleArg){
16.instInt=intArg;
17.instDouble=doubleArg;
18.}
19.publicstaticvoidmain(stringargs[]){
20.MyClassinstance1=newMyClass(1,2.0);
21.MyClassinstance2=newMyClass(3,4.0);
22.
23.MyClass.statMethod();//Outputs:
statInt=4;
24.//statDouble=16.0
25.
26.instance1.instMethod();//Outputs:
instInt=1;
27.//instDouble=2.0
28.instance1.statMethod();//Outputs:
statInt=4;
29.//statDouble=16.0
30.
31.instance2.instMethod();//Outputs:
instInt=3;
32.//instDouble=4.0
33.instance2.statMethod();//Outputs:
statInt=4;
34.//statDouble=16.0
35.}
36.}
37.
图6-1是MyClass类定义的框图。
这个例子阐述了:
1.Static方法和数据的单个(共享)副本是因为类和该类的所有实例而存在。
通过一个实例或通过类本身可以访问static成员。
2.非静态数据只限于实例,只能通过该实例的非静态方法对它进行访问。
非静态数据定义对象之间互不相同的特点,非静态方法在它们所作用的非静态数据的基础上对每个对象的行为互不相同。
考虑一下模仿汽车的特殊类型的一个对象的实例。
轮子的大小,对该类型的所有汽车来说是个常量,可能被模仿成一个静态变量。
颜色根据对象的不同而不同,其行为也根据对象的不同而不同,在它所作用的非静态数据的基础上对不同对象返回不同的颜色。
图6-1Myclass例子
第七节关键字final
6.7.1Final类
关键字final
Final类不能被分成子类
Final方法不能被覆盖
Final变量是常数
Java编程语言允许关键字Final被应用到类中。
如果这样做了,类便不能被子分成子类。
比如,类Java.lang.String就是一个final类。
这样做是出于安全原因,因为它保证,如果方法有字符串的引用,它肯定就是类String的字符串,而不是某个其它类的字符串,这个类是String的被修改过的子类,因为String可能被恶意窜改过。
6.7.2Final方法
个体方法也可以被标记为final。
被标记为final的方法不能被覆盖。
这是由于安全原因。
如果方法具有不能被改变的实现,而且对于对象的一致状态是关键的,那么就要使方法成为final。
被声明为final的方法有时被用于优化。
编译器能产生直接对方法调用的代码,而不是通常的涉及运行时查找的虚拟方法调用。
被标记为static或private的方法被自动地final,因为动态联编在上述两种情况下都不能应用。
6.7.3Final变量
如果变量被标记为final,其结果是使它成为常数。
想改变final变量的值会导致一个编译错误。
下面是一个正确定义final变量的例子:
publicfinalintMAX_ARRAY_SIZE=25;
注-如果将引用类型(即,任何类的类型)的变量标记为final,那么该变量不能指向任何其它对象。
但可能改变对象的内容,因为只有引用本身是final。
第八节抽象类
抽象类
声明方法的存在而不去实现它的类被叫做抽象类
可以通过关键字abstract进行标记将类声明为抽象
publicabstractclassD