第九章 面向對象的編程
1.java不支持多重繼承(像在C++語(yǔ)言中那樣),但它支持“接口”概念。接口使java獲得了多重繼承的許多優(yōu)點(diǎn),屏棄了相應的缺點(diǎn)。
2.子類(lèi)可以訪(fǎng)問(wèn)其超類(lèi)的public,protected和超類(lèi)的包訪(fǎng)問(wèn)成員(即無(wú)權限修飾符的成員,且和它的超類(lèi)在同一個(gè)包中),如果超類(lèi)不允許通過(guò)繼承的方式產(chǎn)生的子類(lèi)訪(fǎng)問(wèn)它的某些成員,那么它必須以private方式聲明該成員。超類(lèi)的public,protected成員將成為子類(lèi)的public,protected成員。子類(lèi)不能繼承超類(lèi)的構造函數但子類(lèi)的構造函數可以通過(guò)super引用來(lái)調用超類(lèi)的構造函數。
3.對訪(fǎng)問(wèn)protected成員的保護限制介于對訪(fǎng)問(wèn)public成員的保護限制和對訪(fǎng)問(wèn)private成員的保護限制之間。只有超類(lèi)的方法、子類(lèi)的方法以及同一個(gè)包內的其他類(lèi)的方法,才能訪(fǎng)問(wèn)超類(lèi)的protected成員(protected成員可以進(jìn)行包訪(fǎng)問(wèn))。
4.實(shí)例分析
1)源代碼
//超類(lèi)Point2的定義point2.java
package Point;
public class Point2 {
protected int x,y;
//no-argument constructor,mast be included in the superclass,or will incur the compile error;
public Point2() {
setPoint(0,0);
}
//constructor
public Point2(int a,int b)
{ setPoint(a,b);}
public void setPoint(int a,int b)
{x=a;y=b;}
public int getX()
{return x;}
public int getY()
{return y;}
public String toString()
{return "["+x+","+y+"]";}
}
//子類(lèi)Circle2的定義;circle2.java
package Point;
public class Circle2 extends Point2{
protected double radius;
//no-argument constructor
public Circle2() {
setRadius(0);
}
//constructor
public Circle2(double r,int a,int b){
super(a,b); //explict call to superclass constructor;
setRadius(r);
}
public void setRadius(double r)
{radius=(r>=0.0?r:0.0);}
public double getRadius(){return radius;}
public double area(){return Math.PI *radius*radius;}
public String toString()
{return "Center="+super.toString()+";Radius="+radius;}//call to superclass toString;
}
//測試主程序;InheritanceTest2.java
package Point;
import java.text.DecimalFormat ;
import javax.swing.JOptionPane ;
public class InheritanceTest2{
public static void main(String arg[]){
Point2 pointRef,p;
Circle2 circleRef,c;
String output;
p=new Point2(30,50);
c=new Circle2(2.7,120,89);
output="Point p:"+p.toString ()+"\nCircle:"+c.toString ();
pointRef=c; //assign circle to pointRef;
output+="\n\nCircle c(via pointRef):"+pointRef.toString (); /*Polymorphism and dynamic binding,so output the result using the funcion toString of Circle2 */
/*use downcasting(casting a superclass reference to a subclass data type)to assign pintRef to circleRef*/
circleRef=(Circle2)pointRef;
output+="\n\nCircle c(via circleRef):"+circleRef.toString ();
DecimalFormat precision2=new DecimalFormat("0.00");
output+="\nArea of c(via circleRef):"+
precision2.format (circleRef.area ());
if(p instanceof Circle2){ //judge if the object p is a object of Circle2;
circleRef=(Circle2)p;
output+="\n\ncast successfull";
}
else
output+="\n\np does not refer to a circle";
JOptionPane.showMessageDialog (null,output,
"Demostrating the \"is a\" relationship",
JOptionPane.INFORMATION_MESSAGE );
System.exit(0);
}
}
2)程序運行結果:
5.如果在你的類(lèi)的層次結構中定義了finalize方法,子類(lèi)finalize方法應該調用超類(lèi)的finalize方法(形式:super.finalize();),以保證一個(gè)對象所有部分都能正常的終止。
6.引用子類(lèi)對象可以被隱式地轉換為引用超類(lèi)對象,因為根據繼承,子類(lèi)對象“是一個(gè)”超類(lèi)對象。而用子類(lèi)引用引向超類(lèi)對象是語(yǔ)法錯誤。
7.可以用final來(lái)定義方法和類(lèi),聲明為final的方法不能在子類(lèi)中被覆蓋,聲明為static和private的方法是隱式的fianl,因為fianl方法的定義永遠不能改變,編譯器按這種方式優(yōu)化程序,即在所有出現final方法調用的地方用方法定義的擴展代碼替換方法調用的語(yǔ)句——這種技術(shù)叫內聯(lián)代碼(inlining the code)。
聲明為final的類(lèi)不能是超類(lèi),即final類(lèi)不能被繼承,一個(gè)final類(lèi)中的所有方法都是隱式的final。
8.抽象類(lèi):一個(gè)永遠也不需要實(shí)例化對象的類(lèi),它的作用是作為一個(gè)恰當的類(lèi),這樣其他的類(lèi)就可以繼承接口或者實(shí)現。對象能被實(shí)例化的類(lèi)叫具體類(lèi)。抽象類(lèi)用abstract聲明。
9.一個(gè)接口的定義由關(guān)鍵字interface開(kāi)始,并包括一套public abstract方法。接口也可以包含public final static數據。為使用接口;一個(gè)類(lèi)必須聲明它implement接口,而且必須定義接口中的每個(gè)方法,參數個(gè)數及返回類(lèi)型還要與接口中定義的相同。
10.java提供了一種稱(chēng)為內部類(lèi)的機制,使類(lèi)可以在其他類(lèi)中定義,這樣的類(lèi)可以是完整的類(lèi)定義或者是“無(wú)名內部類(lèi)”定義。內部類(lèi)主要用于GUI事件處理。
11.內部類(lèi)定義要點(diǎn)
1)含內部類(lèi)的類(lèi)在編譯時(shí)將為每個(gè)內部類(lèi)生成一個(gè)獨立的.class文件。有名字的內部類(lèi)的文件名為“外部類(lèi)名$內部類(lèi)名.class”;無(wú)名內部類(lèi)的文件名為“外部類(lèi)名$#.class”,其中,#時(shí)編譯器給每個(gè)無(wú)名內部類(lèi)的編號,從1開(kāi)始,依次遞增。
2)具有類(lèi)名的內部類(lèi)可以定義為public,protected,包訪(fǎng)問(wèn)或private,其使用限制和類(lèi)的其他成員相同。
3)為了訪(fǎng)問(wèn)外部類(lèi)的this引用,可使用“外部類(lèi)名.this”。
4)外部類(lèi)負責創(chuàng )建它的內部類(lèi)的對象。為了創(chuàng )建另一個(gè)類(lèi)的內部類(lèi)的對象,首先創(chuàng )建這個(gè)外部類(lèi)的一個(gè)對象,并把它賦值給一個(gè)引用(設為ref),然后可用下述形式的語(yǔ)句來(lái)創(chuàng )建內部類(lèi)的對象:
外部類(lèi)名.內部類(lèi)名innerRef=ref.new內部類(lèi)名();
5)內部類(lèi)可以聲明為static。static內部類(lèi)不要求定義一個(gè)外部類(lèi)的對象(但是非static內部類(lèi)卻要求這樣)。static內部類(lèi)不能訪(fǎng)問(wèn)外部類(lèi)的非static成員。
聯(lián)系客服