3.5this和super
访问一个类的实例变量时,this关键词是指向这个类本身的指针,在前面ClassOne例子中,我们可以增加构造函数如下:
publicclassClassOne{inti;publicClassOne(){i=10;}
publicClassOne(intvalue)this.i=value;}
publicvoidAdd_i(intj){i=i+j;}}
这里,this指向ClassOne类的指针。如果在一个子类里覆盖了父类的某个成员函数,但又想调用父类的成员函数,你可以用super关键词指向父类的成员函数。
importClassOne;publicclassNewClassextendsClassOne{publicvoidAdd_i(intj){i=i+(j/2);super.Add_i(j);}}
下面程序里,i变量被构造函数设成10,然后15,最后被父类(ClassOne)设成25。NewClassmnc;mnc=newNewClass();mnc.Add_i(10);
3.6类的类型
至今为止,我用在类前面只用了一个public关键词,其实它有下面4种选择:abstract一个abstract类必须至少有一个虚拟函数,一个abstract类不能直接创建对象,必须继承子类后才能。
final一个final类声明了子类链的结尾,用final声明的类不能再派生子类。publicpublic类能被其它的类访问。在其它包里,如果想使用这个类必须先import,则它只能在它定义的package里使用。synchronicable这个类标识表示所有?copy;类的成员函数都是同步的。
3.7抽象类
面向对象的一个最大优点就是能够定义怎样使用这个类而不必真正定义好成员函数。如果程序由不同的用户实现时是很有用的,这不需用户使用相同的成员函数名。
在java里Graphics类里一个abstract类的例子如下:publicabstractclassGraphics{publicabstractvoiddrawLine(intx1,inty1,intx2,inty2);publicabstractvoiddrawOval(intx,inty,intwidth,intheight);publicabstractvoiddrawRect(intx,inty,intwidth,intheight);...}
在Graphics类里声明了几个成员函数,但成员函数的实际代码是在另外一?copy;地方实现的。
publicclassMyClassextendsGraphics{publicvoiddrawLine(intx1,inty1,intx2,inty2){}}
当一个类包含一个abstract成员函数,这个类必须定义为abstract类。然而并不是abstract类的所有的成员函数都是abstract的。Abstract类不能有私有成员函数(它们不能被实现),也不能有静态成员函数。