8.1類的繼承
被整合的類成為父類或者超類(superclass),由整合而得到的類稱為子類(subclass).一個父類可以擁有多個子類,但由於java中不支援多重繼承,所以一個類只能有一個直接的父類.
父類實際上是所有子類的公用成員的集合,而每一個子類則是父類的特殊化,是對公用成員變數和方法在 功能,內涵方面的擴張和延伸.
java語言中有一個成為java.lang.Object的特殊類,所有的類都是直接或間接地繼承該類而得到的.
1).子類的建立
Java中類的繼承是通過extends關鍵字來實現的.子類可以繼承所有非private的成員作為自己的成員.
格式如下:
class SubClass extends SuperClass
{ ...... }
eg:
class Person
{
private String name; //構造方法 與 類的成員
private int age;
public Person()
{
System.out.println( "調用了個人構造方法 Person( )" );
}
public void SetNameAge( String name, int age )
{
this.name = name;
this.age = age;
}
public void show( )
{
System.out.println("name:" + name + " age:" + age );
}
}
class Students extends Person
{
private String department;
public Student( )
{
System.out.println( " 調用了學生的構造方法 Student( )" );
}
public void SetDepartment( String dep )
{
department = dep;
System.out.println("我是" + department + "的學生" );
}
}
public class app8_1
{
public static void main( String[] args )
{
Student stu = new Student( ); //建立Student對象
stu.SetNameAge( "zhangsan", 21 ); //調用父類的 SetNameAge( ) 方法
stu.show( ); //調用父類的 show( ) 方法
stu.SetDepartment( "電腦系" ); //調用子類的SetDepartment( )方法
}
}
程式執行的結果為:
調用了個人構造方法 Person( )
調用了學生的構造方法 Student( )
name: zhangsan age: 21
我是電腦系的學生
2).調用父類中特定的構造方法
eg:
class Student extends Person
{
private String department;
public Student( )
{
System.out.println("調用了學生的無參構造方法 Student( )" );
}
public Student( String name, int age, String dep )
{
super( name, age ); //調用父類的有參構造方法
department = dep;
System.out.println("我是"+department + "的學生" );
}
}
3).在子類中訪問父類的成員
使用super不但可以訪問父類的構造方法,還可以訪問父類的成員變數和成員方法,但super不能訪問在子類中添加的成員.
訪問父類成員的格式如下:
super.<變數名>
super.<方法名>
若父類中非private成員,則protected成員不僅可以在父類中直接存取,同時也可以在子類中訪問.
4).覆蓋(Overriding)
覆蓋的概念與方法的重載相似,他們均是Java語言"多態"(Polymorphism)的技巧之一.
覆蓋是指在子類中,定義名稱,參數個數與類型均與父類相同的方法,用以重寫父類裡同名方法的功能.
注意:子類中不能覆蓋父類中聲明為 final或 static 的方法.
方法一旦被覆蓋,那麼父類調用該方法也會是調用子類中的方法.但父類不能調用子類中的方法.
覆蓋:與父類的方法名稱,參數個數與類型必須完全相同.
5).不可被繼承的成員與最終類
在預設情況下所有的成員變數都可以被覆蓋,如果父類的成語不希望被子類的成員所覆蓋可以將它們聲明為final.即最終變數,常量.可以訪問,但不能修改.可以增加代碼的安全性.
若成員變數被聲明為final,那麼也不能繼承該變數.
若一個類被final修飾符修飾,則說明這個類是最終類,該類不可以有子類,這種類被稱為最終類.
6).Object類
如果某個類沒用使用關鍵字extends,則該類預設為 java.lang.Object 類的子類.
Object 類常用方法:
public Boolean equals( Object obj ) //判斷兩個物件變數所指向的是否為同一個對象
public String toString( ) //將調用toString( ) 方法的對性愛那個轉換成字串
public final Class getClass( ) //返回調用getClass( ) 方法的對象所屬的類
protected Object clone( ) //返回調用該方法的對象的一個副本