作為一種面向對象編程的語言,Java允許程序員從已經存在的類中定義新的類,我們稱之為繼承(inheritance)。繼承作為Java語言的一個重要的特性,可以讓我們通過設計出一個通用的父類(parent class)和若干子類(child class)的關系,使得子類能夠共享父類的一些特征和行為。
在Java中,我們使用關鍵詞extends來表示父類和子類的繼承關系。父類也可以被稱為超類(superclass)或基類(base class);子類也可以被稱為次類(subclass)、拓展類(extended class)或派生類(derived class)。在Java中,一個子類只能夠繼承一個父類,一個父類可以有多個子類。子類從父類中繼承一些可被訪問的數據域和方法,子類也可以擁有自己的新的數據域和新的方法。
比如,我們可以設計出如下的父類和子類:
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型的數據域color,Circle繼承了這個數據域;但是,由于color是實例變量(private instance variable),Circle必須通過Geometry Class中的getColor和setColor這兩個方法,去獲取、改變color。在這里,setColor和getColor是被Circle繼承的兩個方法。在Circle中,我們定義了一個構造器,在這個構造器中,我們通過調用setColor這個方法,對color這個數據域進行了訪問和改變。
在講構造器的知識點時,我們已經說過,子類可以重寫(overriding)父類的方法,讓子類的對象可以做出一些不同于父類的行為,我們把這種現象稱之為多態(polymorphism)。另外,多態意味著父類的變量可以指向子類對象。比如,剛才我們定義了兩個類——Geometry 和 Circle,我們可以說Geometry是Circle的父類型,Circle是Geometry的子類型。子類是父類的特殊化,每個子類的實例實際上也是其父類的實例。比如,我們可以定義一個參數是Geometry型的方法如下,然后再調用它:
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());
}
顯示結果是:
White
Black
注意,上面的dosomething方法的參數是Geometry類型的對象,而我們在調用它時創建了2個對象,一個是Geometry型的實例,另一個既是Circle型的實例,也是Geometry型的實例,因此,這兩個對象都可以作為dosomething的實際參數。
由于一個子類的實例也可以是父類型的實例,這里就牽涉到另外兩個概念:聲明類型(declared type)和實際類型(actual type),比如:
Geometry object = new Circle(1, “Black");
上面這行代碼就聲明了一個變量object,object的聲明類型就是Geometry型,實際類型就是Circle型。這個時候就產生了一個問題:如果我們使用這個變量object去調用一個被子類Circle重寫過的方法,那么Java 虛擬機會選擇調用哪個呢?答案是調用Circle里重寫的方法。這個就叫做動態綁定(dynamic binding)。當然,我們也可以使用這個object去調用Geometry里定義的其他方法,只不過當我們調用的這個方法(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進行調用,請問輸出結果是什么?
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