作為一種面向?qū)ο缶幊痰恼Z言,Java允許程序員從已經(jīng)存在的類中定義新的類,我們稱之為繼承(inheritance)。繼承作為Java語言的一個重要的特性,可以讓我們通過設(shè)計出一個通用的父類(parent class)和若干子類(child class)的關(guān)系,使得子類能夠共享父類的一些特征和行為。
在Java中,我們使用關(guān)鍵詞extends來表示父類和子類的繼承關(guān)系。父類也可以被稱為超類(superclass)或基類(base class);子類也可以被稱為次類(subclass)、拓展類(extended class)或派生類(derived class)。在Java中,一個子類只能夠繼承一個父類,一個父類可以有多個子類。子類從父類中繼承一些可被訪問的數(shù)據(jù)域和方法,子類也可以擁有自己的新的數(shù)據(jù)域和新的方法。
比如,我們可以設(shè)計出如下的父類和子類:
public class Geometry
{
private String color = "White";
public void setColor(String col)
{
color = col;
}
public String getColor()
{
return color;
}
}
public class Circle extends Geometry
{
private double radius;
public Circle(double rad, String color)
{
radius = rad;
setColor(color);
}
public double getRadius()
{
return radius;
}
public void setRadius(double rad)
{
radius = rad;
}
}
在父類Geometry中,定義了一個String型的數(shù)據(jù)域color,Circle繼承了這個數(shù)據(jù)域;但是,由于color是實例變量(private instance variable),Circle必須通過Geometry Class中的getColor和setColor這兩個方法,去獲取、改變color。在這里,setColor和getColor是被Circle繼承的兩個方法。在Circle中,我們定義了一個構(gòu)造器,在這個構(gòu)造器中,我們通過調(diào)用setColor這個方法,對color這個數(shù)據(jù)域進行了訪問和改變。
在講構(gòu)造器的知識點時,我們已經(jīng)說過,子類可以重寫(overriding)父類的方法,讓子類的對象可以做出一些不同于父類的行為,我們把這種現(xiàn)象稱之為多態(tài)(polymorphism)。另外,多態(tài)意味著父類的變量可以指向子類對象。比如,剛才我們定義了兩個類——Geometry 和 Circle,我們可以說Geometry是Circle的父類型,Circle是Geometry的子類型。子類是父類的特殊化,每個子類的實例實際上也是其父類的實例。比如,我們可以定義一個參數(shù)是Geometry型的方法如下,然后再調(diào)用它:
public static void main(String[] args)
{
dosomething(new Geometry());
dosomething(new Circle(1, "Black"));
}
public static void dosomething(Geometry object)
{
System.out.println(object.getColor());
}
顯示結(jié)果是:
White
Black
注意,上面的dosomething方法的參數(shù)是Geometry類型的對象,而我們在調(diào)用它時創(chuàng)建了2個對象,一個是Geometry型的實例,另一個既是Circle型的實例,也是Geometry型的實例,因此,這兩個對象都可以作為dosomething的實際參數(shù)。
由于一個子類的實例也可以是父類型的實例,這里就牽涉到另外兩個概念:聲明類型(declared type)和實際類型(actual type),比如:
Geometry object = new Circle(1, “Black");
上面這行代碼就聲明了一個變量object,object的聲明類型就是Geometry型,實際類型就是Circle型。這個時候就產(chǎn)生了一個問題:如果我們使用這個變量object去調(diào)用一個被子類Circle重寫過的方法,那么Java 虛擬機會選擇調(diào)用哪個呢?答案是調(diào)用Circle里重寫的方法。這個就叫做動態(tài)綁定(dynamic binding)。當(dāng)然,我們也可以使用這個object去調(diào)用Geometry里定義的其他方法,只不過當(dāng)我們調(diào)用的這個方法(overriding methods)既在父類中,也在子類中的時候,Java 虛擬機會選擇object的實際類型里的這個被重寫的方法。
最后,給大家留一個小問題:
public class Geometry
{
public void dosomething()
{
System.out.println("Geometry");
}
}
public class Circle extends Geometry
{
public void dosomething()
{
System.out.println("Circle");
}
}
如上所示,我們定義了父類Geometry和子類Circle。如果通過如下代碼對方法dosomething進行調(diào)用,請問輸出結(jié)果是什么?
Geometry object = new Circle();
object.dosomething();
附:AP CS A Free Response Questions 下載地址:
https://apcentral.collegeboard.org/courses/ap-computer-science-a/exam

? 2025. All Rights Reserved. 滬ICP備2023009024號-1