OOP的特點(diǎn):繼承、封裝、多態(tài)、抽象
5.1 類的繼承
在Java中,許多類組成層次化結(jié)構(gòu),一個(gè)類的上一層稱為父類,而下一層稱為子類。一個(gè)類要以繼承其父類的變量和方法,繼承特性使Java既靈活方便又能提高效率。
5.1.1 父類和子類
被繼承的類稱為父類或超類,這個(gè)新類稱為子類。
子類的創(chuàng)建格式: [<修飾符>] class <子類名> extends <父類名>
{ ………… }
例:public class Hello2 extends java.applet.Applet
public class SC extends Object // extends Object 可以省略
說明:從Java系統(tǒng)軟件包java.lang中的Object派生來的子類可以不指出父類的名字,一般稱這些類的父類為隱含類。
5.1.2 成員變量的繼承和隱藏
1.成員變量的繼承
繼承原則:
(1)子類不能繼承父類的private成員變量
?。?)子類能繼承父類的public和protected成員變量
(3)子類能繼承同一包中有默認(rèn)權(quán)限修飾符的成員變量
2.成員變量的隱藏
隱藏原則:子類的成員變量和父類的成員變量同名,父類的成員變量被隱藏(不能繼承)
5.1.3 成員方法的覆蓋
繼承原則:
(1)子類不能繼承父類的private成員方法
?。?)子類不能繼承父類的構(gòu)造方法
?。?)子類能繼承父類的public和protected成員方法
?。?)子類能繼承同一包中有默認(rèn)權(quán)限修飾符的成員方法
覆蓋(隱藏)(override)原則:
子類的成員方法和父類的成員方法同名,父類的成員方法被覆蓋(隱藏)(不能繼承)
說明:(1)用來覆蓋的子類方法應(yīng)和被覆蓋的父類方法保持相同名稱和相同返回值類型,以及相同的參數(shù)個(gè)數(shù)和參數(shù)類型。
(2)可能不需要完全覆蓋一個(gè)方法,部分覆蓋是在原方法的基礎(chǔ)上添加新的功能,即在子類的覆蓋方法中添加一條語句:super.原父類方法名,然后加入其他語句
(3)不能覆蓋父類中的final方法
?。?)不能覆蓋父類中的static方法,但可以隱藏這類方法。即在子類中聲明的同名靜態(tài)方法實(shí)際上隱藏了父類中的靜態(tài)方法
?。?)非抽象子類必須覆蓋父類中的抽象方法
5.1.4 this和super
調(diào)用本類成員和方法格式:
this.變量名 this.方法名([參數(shù)])
調(diào)用父類成員和方法格式:
super.變量名 super.方法名([參數(shù)])
調(diào)用本類構(gòu)造方法:
this([參數(shù)列表])
調(diào)用父類構(gòu)造方法:
super([參數(shù)列表])
?。?)this代表當(dāng)前類或?qū)ο蟊旧?br/> 例: class Tree {
int h , s , b ; //成員變量
Tree(int h , int s , int b)
{ this.h=h ; // this.h為成員變量的h, 右邊h是入口參數(shù)h
this.s=s ; this.b=b ; } }
(2)super代表父類
例: public class SC
{ public static void main(String args[])
{ Son a=new Son();
a.ClearUp(); }
public void ClearUp( )
{ System.out.println("開始打掃"); } }
class Son extends SC{
Son(){System.out.println("今天是周末");}
public void ClearUp()
{ super.ClearUp( );
System.out.println("已清掃干凈!"); } }
運(yùn)行結(jié)果: 今天是周末
開始打掃
已清掃干凈!
說明:不需要實(shí)例化父類就可以直接使用super變量
?。ǎ常﹕uper()可用來調(diào)用父類的構(gòu)造方法
Java規(guī)定類的構(gòu)造方法只能由new調(diào)用,程序員不能直接調(diào)用,但可用super( )間接調(diào)用,同理this( )也可間接調(diào)用當(dāng)前類或?qū)ο蟮臉?gòu)造方法
類的構(gòu)造方法是不能繼承的,因?yàn)闃?gòu)造方法不是類的成員,沒有返回值,也不需要修飾符。
說明:super( )只能出現(xiàn)在子類的構(gòu)造方法中,而且必須是子類構(gòu)造方法中的第一條可執(zhí)行語句。
5.2 類的多態(tài)
在一個(gè)類中,可以定義多個(gè)同名的方法,只要確定它們的參數(shù)個(gè)數(shù)和類型不同,這種現(xiàn)象稱為類的多態(tài)
類的多態(tài)性體現(xiàn)在方法的重載上,包括成員方法和構(gòu)造方法的重載
5.2.1 成員方法的重載
方法的重載是指對(duì)同名方法的重新定義
例: public void fun(int a)
public void fun(int a , int b)
public void fun(int a , float b , String s)
public int fun(int a) //不是正確的重載
例: public class SC
{ public double area(float a) //改成int area(float a)將報(bào)錯(cuò)
{return (int)(Math.PI*a*a*100)/100.0 ;} //保留2位小數(shù)
public double area(float a, float b)
{return a*b ;}
public double area(float a, float b, float c)
{float d;
d=(a+b+c)/2 ;
return Math.sqrt(d*(d-a)*(d-b)*(d-c)) ;}
public static void main(String args[])
{ SC sh=new SC();
System.out.println("圓面積是: "+sh.area(3));
System.out.println("矩形面積是: "+sh.area(7,4));
System.out.println("三角形面積是: "+sh.area(3,4,5)); } }
運(yùn)行結(jié)果:圓面積是: 28.27
矩形面積是: 28.0
三角形面積是: 6.0
例:見P96
5.2.2 構(gòu)造方法的重載
例: class Date( ) {
Date( ) {……}
Date(int x, int y ) {……}
Date(int x, char y ) {……}
}
…………
Date d1=new Date( )
Date d2=new Date(5,’A’ )
Date d3=new Date(5,12) //分加調(diào)用不同的構(gòu)造方法
作業(yè)P101 5-11
class Fraction{
private int f1,f2;
Fraction(int x,int y)
{f1=x;f2=y;}
void Xc(int i1,int i2,int i3,int i4)
{f1=i1*i3;
f2=i2*i4;}
void Dy1()
{System.out.println(f1+"/"+f2);}
void Dy2()
{System.out.println((double)f1/(double)f2);}}
public class SC{
public static void main(String arg[]){
Fraction a=new Fraction(0,0);
a.Xc(4,5,7,3);
a.Dy1();a.Dy2();} }